{
"tiddlers": {
"$:/Acknowledgements": {
"title": "$:/Acknowledgements",
"text": "TiddlyWiki incorporates code from these fine OpenSource projects:\n\n* [[The Stanford Javascript Crypto Library|http://bitwiseshiftleft.github.io/sjcl/]]\n* [[The Jasmine JavaScript Test Framework|http://pivotal.github.io/jasmine/]]\n* [[Normalize.css by Nicolas Gallagher|http://necolas.github.io/normalize.css/]]\n\nAnd media from these projects:\n\n* World flag icons from [[Wikipedia|http://commons.wikimedia.org/wiki/Category:SVG_flags_by_country]]\n"
},
"$:/core/copyright.txt": {
"title": "$:/core/copyright.txt",
"type": "text/plain",
"text": "TiddlyWiki created by Jeremy Ruston, (jeremy [at] jermolene [dot] com)\n\nCopyright (c) 2004-2007, Jeremy Ruston\nCopyright (c) 2007-2020, UnaMesa Association\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n* Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS'\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
},
"$:/core/icon": {
"title": "$:/core/icon",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path d=\"M64 0l54.56 32v64L64 128 9.44 96V32L64 0zm21.127 95.408c-3.578-.103-5.15-.094-6.974-3.152l-1.42.042c-1.653-.075-.964-.04-2.067-.097-1.844-.07-1.548-1.86-1.873-2.8-.52-3.202.687-6.43.65-9.632-.014-1.14-1.593-5.17-2.157-6.61-1.768.34-3.546.406-5.34.497-4.134-.01-8.24-.527-12.317-1.183-.8 3.35-3.16 8.036-1.21 11.44 2.37 3.52 4.03 4.495 6.61 4.707 2.572.212 3.16 3.18 2.53 4.242-.55.73-1.52.864-2.346 1.04l-1.65.08c-1.296-.046-2.455-.404-3.61-.955-1.93-1.097-3.925-3.383-5.406-5.024.345.658.55 1.938.24 2.53-.878 1.27-4.665 1.26-6.4.47-1.97-.89-6.73-7.162-7.468-11.86 1.96-3.78 4.812-7.07 6.255-11.186-3.146-2.05-4.83-5.384-4.61-9.16l.08-.44c-3.097.59-1.49.37-4.82.628-10.608-.032-19.935-7.37-14.68-18.774.34-.673.664-1.287 1.243-.994.466.237.4 1.18.166 2.227-3.005 13.627 11.67 13.732 20.69 11.21.89-.25 2.67-1.936 3.905-2.495 2.016-.91 4.205-1.282 6.376-1.55 5.4-.63 11.893 2.276 15.19 2.37 3.3.096 7.99-.805 10.87-.615 2.09.098 4.143.483 6.16 1.03 1.306-6.49 1.4-11.27 4.492-12.38 1.814.293 3.213 2.818 4.25 4.167 2.112-.086 4.12.46 6.115 1.066 3.61-.522 6.642-2.593 9.833-4.203-3.234 2.69-3.673 7.075-3.303 11.127.138 2.103-.444 4.386-1.164 6.54-1.348 3.507-3.95 7.204-6.97 7.014-1.14-.036-1.805-.695-2.653-1.4-.164 1.427-.81 2.7-1.434 3.96-1.44 2.797-5.203 4.03-8.687 7.016-3.484 2.985 1.114 13.65 2.23 15.594 1.114 1.94 4.226 2.652 3.02 4.406-.37.58-.936.785-1.54 1.01l-.82.11zm-40.097-8.85l.553.14c.694-.27 2.09.15 2.83.353-1.363-1.31-3.417-3.24-4.897-4.46-.485-1.47-.278-2.96-.174-4.46l.02-.123c-.582 1.205-1.322 2.376-1.72 3.645-.465 1.71 2.07 3.557 3.052 4.615l.336.3z\" fill-rule=\"evenodd\"/></svg>"
},
"$:/core/images/add-comment": {
"title": "$:/core/images/add-comment",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-add-comment tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 56H36a8 8 0 100 16h20v20a8 8 0 1016 0V72h20a8 8 0 100-16H72V36a8 8 0 10-16 0v20zm-12.595 58.362c-6.683 7.659-20.297 12.903-36.006 12.903-2.196 0-4.35-.102-6.451-.3 9.652-3.836 17.356-12.24 21.01-22.874C8.516 94.28 0 79.734 0 63.5 0 33.953 28.206 10 63 10s63 23.953 63 53.5S97.794 117 63 117c-6.841 0-13.428-.926-19.595-2.638z\"/></svg>"
},
"$:/core/images/advanced-search-button": {
"title": "$:/core/images/advanced-search-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-advanced-search-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M74.565 87.985A47.776 47.776 0 0148 96C21.49 96 0 74.51 0 48S21.49 0 48 0s48 21.49 48 48c0 9.854-2.97 19.015-8.062 26.636l34.347 34.347a9.443 9.443 0 010 13.36 9.446 9.446 0 01-13.36 0l-34.36-34.358zM48 80c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/><circle cx=\"48\" cy=\"48\" r=\"8\"/><circle cx=\"28\" cy=\"48\" r=\"8\"/><circle cx=\"68\" cy=\"48\" r=\"8\"/></g></svg>"
},
"$:/core/images/auto-height": {
"title": "$:/core/images/auto-height",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-auto-height tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M67.987 114.356l-.029-14.477a4 4 0 00-2.067-3.494l-15.966-8.813-1.933 7.502H79.9c4.222 0 5.564-5.693 1.786-7.58L49.797 71.572 48.01 79.15h31.982c4.217 0 5.564-5.682 1.795-7.575L49.805 55.517l-1.795 7.575h31.982c4.212 0 5.563-5.67 1.805-7.57l-16.034-8.105 2.195 3.57V35.614l9.214 9.213a4 4 0 105.656-5.656l-16-16a4 4 0 00-5.656 0l-16 16a4 4 0 105.656 5.656l9.13-9.13v15.288a4 4 0 002.195 3.57l16.035 8.106 1.804-7.57H48.01c-4.217 0-5.564 5.682-1.795 7.574l31.982 16.059 1.795-7.575H48.01c-4.222 0-5.564 5.693-1.787 7.579l31.89 15.923 1.787-7.578H47.992c-4.133 0-5.552 5.504-1.933 7.501l15.966 8.813-2.067-3.494.029 14.436-9.159-9.158a4 4 0 00-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656l-9.185 9.184zM16 20h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
},
"$:/core/images/blank": {
"title": "$:/core/images/blank",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-blank tc-image-button\" viewBox=\"0 0 128 128\"/>"
},
"$:/core/images/bold": {
"title": "$:/core/images/bold",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-bold tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.146 51.81V21.87h26.353c2.51 0 4.93.21 7.26.628 2.33.418 4.392 1.165 6.185 2.24 1.793 1.076 3.227 2.57 4.302 4.482 1.076 1.913 1.614 4.363 1.614 7.35 0 5.379-1.613 9.263-4.84 11.653-3.227 2.39-7.35 3.586-12.37 3.586H41.146zM13 0v128h62.028a65.45 65.45 0 0016.762-2.151c5.438-1.434 10.278-3.645 14.52-6.633 4.244-2.988 7.62-6.842 10.13-11.563 2.51-4.721 3.764-10.308 3.764-16.762 0-8.008-1.942-14.85-5.826-20.527-3.884-5.677-9.77-9.65-17.658-11.921 5.737-2.75 10.069-6.275 12.997-10.577 2.928-4.303 4.392-9.681 4.392-16.135 0-5.976-.986-10.995-2.958-15.059-1.972-4.063-4.75-7.32-8.336-9.77-3.585-2.45-7.888-4.213-12.907-5.289C84.888.538 79.33 0 73.235 0H13zm28.146 106.129V70.992H71.8c6.095 0 10.995 1.404 14.7 4.212 3.705 2.81 5.558 7.5 5.558 14.073 0 3.347-.568 6.096-1.703 8.247-1.136 2.151-2.66 3.854-4.572 5.11-1.912 1.254-4.123 2.15-6.633 2.688-2.51.538-5.139.807-7.888.807H41.146z\"/></svg>"
},
"$:/core/images/cancel-button": {
"title": "$:/core/images/cancel-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-cancel-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 76.314l-16.97 16.97a7.999 7.999 0 01-11.314 0c-3.118-3.118-3.124-8.19 0-11.313L52.686 65l-16.97-16.97a7.999 7.999 0 010-11.314c3.118-3.118 8.19-3.124 11.313 0L64 53.686l16.97-16.97a7.999 7.999 0 0111.314 0c3.118 3.118 3.124 8.19 0 11.313L75.314 65l16.97 16.97a7.999 7.999 0 010 11.314c-3.118 3.118-8.19 3.124-11.313 0L64 76.314zM64 129c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 1 0 29.654 0 65c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 17 64 17 16 38.49 16 65s21.49 48 48 48z\"/></svg>"
},
"$:/core/images/chevron-down": {
"title": "$:/core/images/chevron-down",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-down tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.053 85.456a7.889 7.889 0 01-5.6-2.316L2.473 27.16a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0L64.05 66.344l50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.105 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.317z\"/><path d=\"M64.053 124.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.085 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></g></svg>"
},
"$:/core/images/chevron-left": {
"title": "$:/core/images/chevron-left",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M47.544 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L66.656 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.105 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.317-5.595z\"/><path d=\"M8.931 64.053c0-2.027.77-4.054 2.316-5.6l55.98-55.98a7.92 7.92 0 0111.196 0c3.085 3.086 3.092 8.105 0 11.196L28.041 64.05l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.085-8.104 3.092-11.196 0l-55.98-55.98a7.892 7.892 0 01-2.316-5.595z\"/></g></svg>"
},
"$:/core/images/chevron-right": {
"title": "$:/core/images/chevron-right",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-right tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M83.456 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196L64.344 63.95 13.963 13.567a7.92 7.92 0 010-11.195c3.086-3.085 8.105-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.317 5.595z\"/><path d=\"M122.069 63.947c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></g></svg>"
},
"$:/core/images/chevron-up": {
"title": "$:/core/images/chevron-up",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-chevron-up tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M63.947 44.544c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 63.656l-50.382 50.382a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.317z\"/><path d=\"M63.947 5.931c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.105 3.092-11.196 0L63.95 25.041 13.567 75.423a7.92 7.92 0 01-11.195 0c-3.085-3.086-3.092-8.104 0-11.196l55.98-55.98a7.892 7.892 0 015.595-2.316z\"/></g></svg>"
},
"$:/core/images/clone-button": {
"title": "$:/core/images/clone-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-clone-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M32.265 96v24.002A7.996 7.996 0 0040.263 128h79.74a7.996 7.996 0 007.997-7.998v-79.74a7.996 7.996 0 00-7.998-7.997H96V48h12.859a2.99 2.99 0 012.994 2.994v57.865a2.99 2.99 0 01-2.994 2.994H50.994A2.99 2.99 0 0148 108.859V96H32.265z\"/><path d=\"M40 56h-7.993C27.588 56 24 52.418 24 48c0-4.41 3.585-8 8.007-8H40v-7.993C40 27.588 43.582 24 48 24c4.41 0 8 3.585 8 8.007V40h7.993C68.412 40 72 43.582 72 48c0 4.41-3.585 8-8.007 8H56v7.993C56 68.412 52.418 72 48 72c-4.41 0-8-3.585-8-8.007V56zM8 0C3.58 0 0 3.588 0 8v80c0 4.419 3.588 8 8 8h80c4.419 0 8-3.588 8-8V8c0-4.419-3.588-8-8-8H8zM19 16A2.997 2.997 0 0016 19.001v57.998A2.997 2.997 0 0019.001 80h57.998A2.997 2.997 0 0080 76.999V19.001A2.997 2.997 0 0076.999 16H19.001z\"/></g></svg>"
},
"$:/core/images/close-all-button": {
"title": "$:/core/images/close-all-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-close-all-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M28 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L16.686 100 2.543 85.856a8 8 0 0111.313-11.313L28 88.686l14.144-14.143a8 8 0 0111.313 11.313L39.314 100l14.143 14.144a8 8 0 01-11.313 11.313L28 111.314zM28 39.314L13.856 53.457A8 8 0 012.543 42.144L16.686 28 2.543 13.856A8 8 0 0113.856 2.543L28 16.686 42.144 2.543a8 8 0 0111.313 11.313L39.314 28l14.143 14.144a8 8 0 01-11.313 11.313L28 39.314zM100 39.314L85.856 53.457a8 8 0 01-11.313-11.313L88.686 28 74.543 13.856A8 8 0 0185.856 2.543L100 16.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 28l14.143 14.144a8 8 0 01-11.313 11.313L100 39.314zM100 111.314l-14.144 14.143a8 8 0 01-11.313-11.313L88.686 100 74.543 85.856a8 8 0 0111.313-11.313L100 88.686l14.144-14.143a8 8 0 0111.313 11.313L111.314 100l14.143 14.144a8 8 0 01-11.313 11.313L100 111.314z\"/></g></svg>"
},
"$:/core/images/close-button": {
"title": "$:/core/images/close-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M65.086 75.41l-50.113 50.113c-3.121 3.121-8.192 3.126-11.316.002-3.118-3.118-3.123-8.19.002-11.316l50.114-50.114L3.659 13.982C.538 10.86.533 5.79 3.657 2.666c3.118-3.118 8.19-3.123 11.316.002l50.113 50.114L115.2 2.668c3.121-3.121 8.192-3.126 11.316-.002 3.118 3.118 3.123 8.19-.002 11.316L76.4 64.095l50.114 50.114c3.121 3.121 3.126 8.192.002 11.316-3.118 3.118-8.19 3.123-11.316-.002L65.086 75.409z\"/></svg>"
},
"$:/core/images/close-others-button": {
"title": "$:/core/images/close-others-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-close-others-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48zm0-16c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32zm0-16c8.837 0 16-7.163 16-16s-7.163-16-16-16-16 7.163-16 16 7.163 16 16 16z\"/></svg>"
},
"$:/core/images/copy-clipboard": {
"title": "$:/core/images/copy-clipboard",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-copy-clipboard tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"33\" height=\"8\" x=\"40\" y=\"40\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"82\" rx=\"4\"/><rect width=\"17\" height=\"8\" x=\"40\" y=\"54\" rx=\"4\"/><rect width=\"33\" height=\"8\" x=\"40\" y=\"96\" rx=\"4\"/><rect width=\"12\" height=\"8\" x=\"40\" y=\"68\" rx=\"4\"/><path d=\"M40 16H24c-4.419 0-8 3.59-8 8a8.031 8.031 0 000 .01v95.98a8.03 8.03 0 000 .01c0 4.41 3.581 8 8 8h80a7.975 7.975 0 005.652-2.34 7.958 7.958 0 002.348-5.652v-16.016c0-4.414-3.582-7.992-8-7.992-4.41 0-8 3.578-8 7.992V112H32V32h64v8.008C96 44.422 99.582 48 104 48c4.41 0 8-3.578 8-7.992V23.992a7.963 7.963 0 00-2.343-5.651A7.995 7.995 0 00104.001 16H88c0-4.41-3.585-8-8.007-8H48.007C43.588 8 40 11.582 40 16zm4-1.004A4.001 4.001 0 0148 11h32c2.21 0 4 1.797 4 3.996v4.008A4.001 4.001 0 0180 23H48c-2.21 0-4-1.797-4-3.996v-4.008z\"/><rect width=\"66\" height=\"16\" x=\"62\" y=\"64\" rx=\"8\"/><path d=\"M84.657 82.343l-16-16v11.314l16-16a8 8 0 10-11.314-11.314l-16 16a8 8 0 000 11.314l16 16a8 8 0 1011.314-11.314z\"/></g></svg>"
},
"$:/core/images/delete-button": {
"title": "$:/core/images/delete-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-delete-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(12)\"><rect width=\"105\" height=\"16\" y=\"11\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"28\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"8\" y=\"16\" rx=\"8\"/><rect width=\"88\" height=\"16\" x=\"8\" y=\"112\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"80\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"56\" y=\"16\" rx=\"8\"/><rect width=\"16\" height=\"112\" x=\"32\" y=\"16\" rx=\"8\"/></g></svg>"
},
"$:/core/images/done-button": {
"title": "$:/core/images/done-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-done-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M42.26 111.032c-2.051.001-4.103-.78-5.668-2.345L2.662 74.758a8 8 0 01-.005-11.32c3.118-3.117 8.192-3.12 11.32.007l28.278 28.278 72.124-72.124a8.002 8.002 0 0111.314-.001c3.118 3.118 3.124 8.19 0 11.315l-77.78 77.78a7.978 7.978 0 01-5.658 2.343z\"/></svg>"
},
"$:/core/images/down-arrow": {
"title": "$:/core/images/down-arrow",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-down-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.177 100.069a7.889 7.889 0 01-5.6-2.316l-55.98-55.98a7.92 7.92 0 010-11.196c3.086-3.085 8.105-3.092 11.196 0l50.382 50.382 50.382-50.382a7.92 7.92 0 0111.195 0c3.086 3.086 3.092 8.104 0 11.196l-55.98 55.98a7.892 7.892 0 01-5.595 2.316z\"/></svg>"
},
"$:/core/images/download-button": {
"title": "$:/core/images/download-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-download-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\" class=\"tc-image-download-button-ring\"/><path d=\"M34.35 66.43l26.892 27.205a4.57 4.57 0 006.516 0L94.65 66.43a4.7 4.7 0 000-6.593 4.581 4.581 0 00-3.258-1.365h-8.46c-2.545 0-4.608-2.087-4.608-4.661v-15.15c0-2.575-2.063-4.662-4.608-4.662H55.284c-2.545 0-4.608 2.087-4.608 4.662v15.15c0 2.574-2.063 4.661-4.608 4.661h-8.46c-2.545 0-4.608 2.087-4.608 4.662a4.69 4.69 0 001.35 3.296z\"/></g></svg>"
},
"$:/core/images/edit-button": {
"title": "$:/core/images/edit-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-edit-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M95.627 10.059l-5.656 5.657 11.313 11.313 5.657-5.656-11.314-11.314zm5.657-5.657l1.966-1.966c3.123-3.122 8.194-3.129 11.319-.005 3.117 3.118 3.122 8.192-.005 11.32l-1.966 1.965-11.314-11.314zm-16.97 16.97l-60.25 60.25a8.12 8.12 0 00-.322.342c-.1.087-.198.179-.295.275-5.735 5.735-10.702 22.016-10.702 22.016s16.405-5.09 22.016-10.702c.095-.096.186-.193.272-.292a8.12 8.12 0 00.345-.325l60.25-60.25-11.314-11.313zM35.171 124.19c6.788-.577 13.898-2.272 23.689-5.348 1.825-.573 3.57-1.136 6.336-2.04 16-5.226 21.877-6.807 28.745-7.146 8.358-.413 13.854 2.13 17.58 8.699a4 4 0 006.959-3.946c-5.334-9.406-13.745-13.296-24.933-12.744-7.875.39-14.057 2.052-30.835 7.533-2.739.894-4.46 1.45-6.25 2.012-19.46 6.112-30.77 7.072-39.597 1.747a4 4 0 10-4.132 6.85c6.333 3.82 13.754 5.12 22.438 4.383z\"/></g></svg>"
},
"$:/core/images/erase": {
"title": "$:/core/images/erase",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-erase tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.087 127.996l63.015-63.015c6.535-6.535 6.528-17.115-.003-23.646L99.466 17.702c-6.539-6.538-17.117-6.532-23.646-.003L4.898 88.62c-6.535 6.534-6.528 17.115.003 23.646l15.73 15.73h39.456zm-34.95-7.313l-14.324-14.325c-3.267-3.268-3.268-8.564-.008-11.824L46.269 59.07l35.462 35.462-26.15 26.15H25.137z\"/></svg>"
},
"$:/core/images/excise": {
"title": "$:/core/images/excise",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-excise tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 107.314l-2.343 2.343a8 8 0 11-11.314-11.314l16-16a8 8 0 0111.314 0l16 16a8 8 0 11-11.314 11.314L72 107.314v14.284c0 3.536-3.582 6.402-8 6.402s-8-2.866-8-6.402v-14.284zM0 40.007C0 35.585 3.59 32 8 32c4.418 0 8 3.588 8 8.007v31.986C16 76.415 12.41 80 8 80c-4.418 0-8-3.588-8-8.007V40.007zm32 0C32 35.585 35.59 32 40 32c4.418 0 8 3.588 8 8.007v31.986C48 76.415 44.41 80 40 80c-4.418 0-8-3.588-8-8.007V40.007zm48 0C80 35.585 83.59 32 88 32c4.418 0 8 3.588 8 8.007v31.986C96 76.415 92.41 80 88 80c-4.418 0-8-3.588-8-8.007V40.007zm-24-32C56 3.585 59.59 0 64 0c4.418 0 8 3.588 8 8.007v31.986C72 44.415 68.41 48 64 48c-4.418 0-8-3.588-8-8.007V8.007zm56 32c0-4.422 3.59-8.007 8-8.007 4.418 0 8 3.588 8 8.007v31.986c0 4.422-3.59 8.007-8 8.007-4.418 0-8-3.588-8-8.007V40.007z\"/></svg>"
},
"$:/core/images/export-button": {
"title": "$:/core/images/export-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-export-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.003 128H119.993a7.984 7.984 0 005.664-2.349v.007A7.975 7.975 0 00128 120V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v56H16V56c0-4.418-3.59-8-8-8-4.418 0-8 3.58-8 8v64c0 4.418 3.59 8 8 8h.003zm48.62-100.689l-8.965 8.966c-3.125 3.125-8.195 3.13-11.319.005-3.118-3.118-3.122-8.192.005-11.319L58.962 2.346A7.986 7.986 0 0164.625 0l-.006.002c2.05-.001 4.102.78 5.666 2.344l22.618 22.617c3.124 3.125 3.129 8.195.005 11.319-3.118 3.118-8.192 3.122-11.319-.005l-8.965-8.966v61.256c0 4.411-3.582 8-8 8-4.41 0-8-3.582-8-8V27.311z\"/></svg>"
},
"$:/core/images/file": {
"title": "$:/core/images/file",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-file tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M111.968 30.5H112V120a8 8 0 01-8 8H24a8 8 0 01-8-8V8a8 8 0 018-8h57v.02a7.978 7.978 0 015.998 2.337l22.627 22.627a7.975 7.975 0 012.343 5.516zM81 8H24v112h80V30.5H89c-4.418 0-8-3.578-8-8V8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"68\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"84\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"100\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/></svg>"
},
"$:/core/images/fixed-height": {
"title": "$:/core/images/fixed-height",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fixed-height tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60 35.657l-9.172 9.171a4 4 0 11-5.656-5.656l16-16a4 4 0 015.656 0l16 16a4 4 0 01-5.656 5.656L68 35.657v57.686l9.172-9.171a4 4 0 115.656 5.656l-16 16a4 4 0 01-5.656 0l-16-16a4 4 0 115.656-5.656L60 93.343V35.657zM16 116h96a4 4 0 100-8H16a4 4 0 100 8zm0-96h96a4 4 0 100-8H16a4 4 0 100 8z\"/></svg>"
},
"$:/core/images/fold-all-button": {
"title": "$:/core/images/fold-all-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M64.03 20.004c-2.05 0-4.102.78-5.667 2.344L35.746 44.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 22.348a7.986 7.986 0 00-5.663-2.346zM64.03 85.002c-2.05-.001-4.102.78-5.667 2.344l-22.617 22.617c-3.125 3.125-3.13 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.966 16.966 16.966c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.192-.005-11.319L69.687 87.346A7.986 7.986 0 0064.024 85z\"/></g></svg>"
},
"$:/core/images/fold-button": {
"title": "$:/core/images/fold-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M64.03 25.004c-2.05 0-4.102.78-5.667 2.344L35.746 49.966c-3.125 3.124-3.13 8.194-.005 11.318 3.118 3.118 8.192 3.122 11.319-.005l16.965-16.965 16.966 16.965c3.124 3.125 8.194 3.13 11.318.005 3.118-3.118 3.122-8.191-.005-11.318L69.687 27.348a7.986 7.986 0 00-5.663-2.346zM64.005 67.379c-2.05 0-4.102.78-5.666 2.344L35.722 92.34c-3.125 3.125-3.13 8.195-.006 11.32 3.118 3.117 8.192 3.121 11.32-.006L64 86.69l16.965 16.965c3.125 3.125 8.195 3.13 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L69.663 69.723A7.986 7.986 0 0064 67.377z\"/></g></svg>"
},
"$:/core/images/fold-others-button": {
"title": "$:/core/images/fold-others-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-fold-others tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" y=\"56.031\" rx=\"8\"/><path d=\"M86.632 79.976c-2.05 0-4.102.78-5.666 2.345L64 99.286 47.034 82.321a7.986 7.986 0 00-5.662-2.346l.005.001c-2.05 0-4.102.78-5.666 2.345l-22.618 22.617c-3.124 3.125-3.129 8.195-.005 11.319 3.118 3.118 8.192 3.122 11.319-.005l16.966-16.966 16.965 16.966a7.986 7.986 0 005.663 2.346l-.005-.002c2.05 0 4.102-.78 5.666-2.344l16.965-16.966 16.966 16.966c3.125 3.124 8.194 3.129 11.319.005 3.118-3.118 3.122-8.192-.005-11.319L92.289 82.321a7.986 7.986 0 00-5.663-2.346zM86.7 48.024c-2.05 0-4.102-.78-5.666-2.345L64.07 28.714 47.103 45.679a7.986 7.986 0 01-5.663 2.346l.005-.001c-2.05 0-4.101-.78-5.666-2.345L13.162 23.062c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L41.44 28.714l16.966-16.966a7.986 7.986 0 015.662-2.346l-.005.002c2.05 0 4.102.78 5.666 2.344l16.966 16.966 16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L92.358 45.679a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
},
"$:/core/images/folder": {
"title": "$:/core/images/folder",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-folder tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.694 128H8C3.58 128 0 124.414 0 119.996V48.004C0 43.584 3.584 40 7.999 40H16v-8c0-4.418 3.578-8 8-8h32a8 8 0 018 8v8h40.001c4.418 0 7.999 3.586 7.999 8.004V59.83l-8-.082v-7.749A4 4 0 0099.997 48H56V36c0-2.21-1.793-4-4.004-4H28.004A4 4 0 0024 36v12H12.003A4 4 0 008 52v64a4 4 0 004.003 4h46.76l-3.069 8z\"/><path d=\"M23.873 55.5h96.003c4.417 0 7.004 4.053 5.774 9.063l-13.344 54.374c-1.228 5.005-5.808 9.063-10.223 9.063H6.08c-4.417 0-7.003-4.053-5.774-9.063L13.65 64.563c1.228-5.005 5.808-9.063 10.223-9.063zm1.78 8.5h87.994c2.211 0 3.504 2.093 2.891 4.666l-11.12 46.668c-.614 2.577-2.902 4.666-5.115 4.666H12.31c-2.211 0-3.504-2.093-2.891-4.666l11.12-46.668C21.152 66.09 23.44 64 25.653 64z\"/></g></svg>"
},
"$:/core/images/full-screen-button": {
"title": "$:/core/images/full-screen-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-full-screen-button tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 8a8 8 0 018-8h32a8 8 0 110 16H16v24a8 8 0 11-16 0V8zM128 120a8 8 0 01-8 8H88a8 8 0 110-16h24V88a8 8 0 1116 0v32zM8 128a8 8 0 01-8-8V88a8 8 0 1116 0v24h24a8 8 0 110 16H8zM120 0a8 8 0 018 8v32a8 8 0 11-16 0V16H88a8 8 0 110-16h32z\"/></svg>"
},
"$:/core/images/github": {
"title": "$:/core/images/github",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-github tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M63.938 1.607c-35.336 0-63.994 28.69-63.994 64.084 0 28.312 18.336 52.329 43.768 60.802 3.202.59 4.37-1.388 4.37-3.088 0-1.518-.056-5.55-.087-10.897-17.802 3.871-21.558-8.591-21.558-8.591-2.911-7.404-7.108-9.375-7.108-9.375-5.81-3.973.44-3.895.44-3.895 6.424.453 9.803 6.606 9.803 6.606 5.709 9.791 14.981 6.963 18.627 5.322.582-4.138 2.236-6.963 4.063-8.564-14.211-1.617-29.153-7.117-29.153-31.672 0-6.995 2.495-12.718 6.589-17.195-.66-1.621-2.856-8.14.629-16.96 0 0 5.37-1.722 17.597 6.57 5.104-1.424 10.58-2.132 16.022-2.16 5.438.028 10.91.736 16.022 2.16 12.22-8.292 17.582-6.57 17.582-6.57 3.493 8.82 1.297 15.339.64 16.96 4.102 4.477 6.578 10.2 6.578 17.195 0 24.618-14.966 30.035-29.22 31.62 2.295 1.98 4.342 5.89 4.342 11.87 0 8.564-.079 15.476-.079 17.576 0 1.715 1.155 3.71 4.4 3.084 25.413-8.493 43.733-32.494 43.733-60.798 0-35.394-28.657-64.084-64.006-64.084\"/></svg>"
},
"$:/core/images/gitter": {
"title": "$:/core/images/gitter",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-gitter tc-image-button\" viewBox=\"0 0 18 25\"><path d=\"M15 5h2v10h-2zM10 5h2v20h-2zM5 5h2v20H5zM0 0h2v15H0z\"/></svg>"
},
"$:/core/images/globe": {
"title": "$:/core/images/globe",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-globe tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M72.811 37.128v2.554c0 2.196.978 6.881 0 8.832-1.466 2.928-4.65 3.54-6.394 5.867-1.182 1.577-4.618 10.601-3.69 12.92 3.969 9.922 11.534 3.187 17.962 9.293.864.821 2.887 2.273 3.296 3.296 3.29 8.223-7.576 15.009 3.757 26.3 1.245 1.24 3.813-3.817 4.079-4.614.852-2.563 6.725-5.45 9.088-7.053 2.02-1.37 4.873-2.667 6.328-4.745 2.27-3.244 1.48-7.514 3.098-10.745 2.139-4.274 3.828-9.635 5.998-13.966 3.898-7.781 4.721 2.093 5.067 2.439.358.357 1.011 0 1.517 0 .094 0 1.447.099 1.516 0 .65-.935-1.043-17.92-1.318-19.297-1.404-7.01-6.944-15.781-11.865-20.5-6.274-6.015-7.09-16.197-18.259-14.954-.204.022-5.084 10.148-7.777 13.512-3.728 4.657-2.47-4.153-6.526-4.153-.081 0-1.183-.103-1.253 0-.586.88-1.44 3.896-2.306 4.417-.265.16-1.722-.239-1.846 0-2.243 4.3 8.256 2.212 5.792 7.952-2.352 5.481-6.328-1.997-6.328 8.56M44.467 7.01c9.685 6.13.682 12.198 2.694 16.215 1.655 3.303 4.241 5.395 1.714 9.814-2.063 3.608-6.87 3.966-9.623 6.723-3.04 3.044-5.464 8.94-6.79 12.911-1.617 4.843 14.547 6.866 12.063 11.008-1.386 2.311-6.746 1.466-8.437.198-1.165-.873-3.593-.546-4.417-1.78-2.613-3.915-2.26-8.023-3.625-12.128-.938-2.822-6.313-2.12-7.844-.593-.523.522-.33 1.792-.33 2.505 0 5.285 7.12 3.316 7.12 6.46 0 14.636 3.927 6.534 11.14 11.336 10.036 6.683 7.844 7.303 14.946 14.404 3.673 3.673 7.741 3.686 9.425 9.294 1.602 5.331-9.327 5.339-11.716 7.448-1.123.991-2.813 4.146-4.219 4.615-1.792.598-3.234.496-4.944 1.78-2.427 1.82-3.9 4.932-4.02 4.81-2.148-2.147-3.52-15.479-3.89-18.257-.588-4.42-5.59-5.54-6.986-9.03-1.57-3.927 1.524-9.52-1.129-13.761-6.52-10.424-11.821-14.5-15.35-26.292-.942-3.148 3.342-6.529 4.877-8.833 1.877-2.816 2.662-5.854 4.746-8.635C22.147 24.19 40.855 9.461 43.857 8.635l.61-1.625z\"/><path d=\"M64 126c34.242 0 62-27.758 62-62 0-34.242-27.758-62-62-62C29.758 2 2 29.758 2 64c0 34.242 27.758 62 62 62zm0-6c30.928 0 56-25.072 56-56S94.928 8 64 8 8 33.072 8 64s25.072 56 56 56z\"/></g></svg>"
},
"$:/core/images/heading-1": {
"title": "$:/core/images/heading-1",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-1 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M14 30h13.25v30.104H61.7V30h13.25v75.684H61.7V71.552H27.25v34.132H14V30zm70.335 13.78c2.544 0 5.017-.212 7.42-.636 2.403-.424 4.576-1.13 6.52-2.12 1.942-.99 3.603-2.261 4.981-3.816 1.378-1.555 2.28-3.463 2.703-5.724h9.858v74.2h-13.25V53.32H84.335v-9.54z\"/></svg>"
},
"$:/core/images/heading-2": {
"title": "$:/core/images/heading-2",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-2 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm119.52 75.684H74.85c.07-6.148 1.555-11.519 4.452-16.112 2.897-4.593 6.855-8.586 11.872-11.978a133.725 133.725 0 017.526-5.141 59.6 59.6 0 007.208-5.353c2.19-1.908 3.993-3.975 5.406-6.201 1.413-2.226 2.155-4.788 2.226-7.685 0-1.343-.159-2.774-.477-4.293a11.357 11.357 0 00-1.855-4.24c-.919-1.307-2.19-2.403-3.816-3.286-1.625-.883-3.745-1.325-6.36-1.325-2.403 0-4.399.477-5.989 1.431-1.59.954-2.862 2.261-3.816 3.922-.954 1.66-1.66 3.622-2.12 5.883-.46 2.261-.724 4.7-.795 7.314H76.23c0-4.099.548-7.897 1.643-11.395 1.095-3.498 2.738-6.519 4.93-9.063 2.19-2.544 4.857-4.54 8.002-5.989C93.95 30.724 97.606 30 101.775 30c4.523 0 8.303.742 11.342 2.226 3.039 1.484 5.494 3.357 7.367 5.618 1.873 2.261 3.198 4.717 3.975 7.367.777 2.65 1.166 5.176 1.166 7.579 0 2.968-.46 5.653-1.378 8.056a25.942 25.942 0 01-3.71 6.625 37.5 37.5 0 01-5.3 5.565 79.468 79.468 0 01-6.148 4.77 165.627 165.627 0 01-6.36 4.24 94.28 94.28 0 00-5.883 4.028c-1.802 1.343-3.374 2.738-4.717 4.187-1.343 1.449-2.261 2.986-2.756 4.611h36.146v10.812z\"/></svg>"
},
"$:/core/images/heading-3": {
"title": "$:/core/images/heading-3",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-3 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm88.885 32.224c1.979.07 3.957-.07 5.936-.424 1.979-.353 3.745-.972 5.3-1.855a10.365 10.365 0 003.763-3.657c.954-1.555 1.431-3.463 1.431-5.724 0-3.18-1.078-5.724-3.233-7.632-2.155-1.908-4.929-2.862-8.32-2.862-2.12 0-3.958.424-5.513 1.272a11.318 11.318 0 00-3.869 3.445c-1.025 1.449-1.784 3.074-2.279 4.876a18.335 18.335 0 00-.636 5.565H75.381c.141-3.604.813-6.943 2.014-10.017 1.201-3.074 2.844-5.742 4.93-8.003 2.084-2.261 4.61-4.028 7.578-5.3C92.871 30.636 96.228 30 99.973 30a29.2 29.2 0 018.533 1.272c2.791.848 5.3 2.085 7.526 3.71s4.01 3.692 5.353 6.201c1.343 2.509 2.014 5.388 2.014 8.639 0 3.745-.848 7.014-2.544 9.805-1.696 2.791-4.346 4.823-7.95 6.095v.212c4.24.848 7.544 2.95 9.911 6.307s3.551 7.438 3.551 12.243c0 3.533-.707 6.696-2.12 9.487a21.538 21.538 0 01-5.724 7.102c-2.403 1.943-5.194 3.445-8.374 4.505-3.18 1.06-6.537 1.59-10.07 1.59-4.31 0-8.074-.618-11.289-1.855s-5.9-2.986-8.056-5.247c-2.155-2.261-3.798-4.982-4.929-8.162-1.13-3.18-1.731-6.713-1.802-10.6h12.084c-.141 4.523.972 8.286 3.34 11.289 2.366 3.003 5.917 4.505 10.652 4.505 4.028 0 7.402-1.148 10.123-3.445 2.72-2.297 4.081-5.565 4.081-9.805 0-2.897-.565-5.194-1.696-6.89a10.97 10.97 0 00-4.452-3.869c-1.837-.883-3.904-1.431-6.2-1.643a58.067 58.067 0 00-7.05-.212v-9.01z\"/></svg>"
},
"$:/core/images/heading-4": {
"title": "$:/core/images/heading-4",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-4 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8 30h13.25v30.104H55.7V30h13.25v75.684H55.7V71.552H21.25v34.132H8V30zm76.59 48.548h22.471V45.9h-.212L84.59 78.548zm43.46 9.54h-9.54v17.596H107.06V88.088h-31.8V76.11l31.8-44.626h11.448v47.064h9.54v9.54z\"/></svg>"
},
"$:/core/images/heading-5": {
"title": "$:/core/images/heading-5",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-5 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm77.755 1.484h38.372v10.812H92.765L88.95 61.164l.212.212c1.625-1.837 3.692-3.233 6.201-4.187 2.509-.954 5-1.431 7.473-1.431 3.675 0 6.96.618 9.858 1.855 2.897 1.237 5.335 2.968 7.314 5.194s3.48 4.858 4.505 7.897c1.025 3.039 1.537 6.325 1.537 9.858 0 2.968-.477 6.024-1.43 9.169a25.161 25.161 0 01-4.559 8.586c-2.085 2.58-4.752 4.7-8.003 6.36-3.25 1.66-7.137 2.491-11.66 2.491-3.604 0-6.943-.477-10.017-1.431-3.074-.954-5.777-2.385-8.109-4.293-2.332-1.908-4.187-4.258-5.565-7.049-1.378-2.791-2.138-6.06-2.279-9.805h12.084c.353 4.028 1.731 7.12 4.134 9.275 2.403 2.155 5.583 3.233 9.54 3.233 2.544 0 4.7-.424 6.466-1.272 1.767-.848 3.198-2.014 4.293-3.498 1.095-1.484 1.873-3.215 2.332-5.194.46-1.979.69-4.099.69-6.36 0-2.05-.284-4.01-.849-5.883-.565-1.873-1.413-3.516-2.544-4.929-1.13-1.413-2.597-2.544-4.399-3.392-1.802-.848-3.904-1.272-6.307-1.272-2.544 0-4.929.477-7.155 1.431-2.226.954-3.834 2.738-4.823 5.353H75.805l7.95-40.598z\"/></svg>"
},
"$:/core/images/heading-6": {
"title": "$:/core/images/heading-6",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-heading-6 tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M6 30h13.25v30.104H53.7V30h13.25v75.684H53.7V71.552H19.25v34.132H6V30zm106.587 20.246c-.283-3.039-1.36-5.494-3.233-7.367-1.873-1.873-4.399-2.809-7.579-2.809-2.19 0-4.08.406-5.67 1.219a12.435 12.435 0 00-4.029 3.233c-1.095 1.343-1.979 2.88-2.65 4.611a37.696 37.696 0 00-1.643 5.459 46.08 46.08 0 00-.9 5.671 722.213 722.213 0 00-.478 5.247l.212.212c1.625-2.968 3.87-5.176 6.731-6.625 2.862-1.449 5.954-2.173 9.275-2.173 3.675 0 6.96.636 9.858 1.908 2.897 1.272 5.353 3.021 7.367 5.247 2.014 2.226 3.551 4.858 4.611 7.897 1.06 3.039 1.59 6.325 1.59 9.858 0 3.604-.583 6.943-1.749 10.017-1.166 3.074-2.844 5.76-5.035 8.056-2.19 2.297-4.805 4.081-7.844 5.353-3.039 1.272-6.395 1.908-10.07 1.908-5.441 0-9.91-1.007-13.409-3.021-3.498-2.014-6.254-4.77-8.268-8.268-2.014-3.498-3.41-7.597-4.187-12.296-.777-4.7-1.166-9.77-1.166-15.211 0-4.452.477-8.94 1.431-13.462.954-4.523 2.526-8.639 4.717-12.349 2.19-3.71 5.07-6.731 8.64-9.063C92.676 31.166 97.075 30 102.304 30c2.968 0 5.76.495 8.374 1.484 2.615.99 4.93 2.367 6.943 4.134 2.014 1.767 3.657 3.887 4.93 6.36 1.271 2.473 1.978 5.23 2.12 8.268h-12.085zm-11.66 46.852c2.19 0 4.099-.442 5.724-1.325a12.869 12.869 0 004.081-3.445c1.095-1.413 1.908-3.056 2.438-4.929.53-1.873.795-3.798.795-5.777s-.265-3.887-.795-5.724c-.53-1.837-1.343-3.445-2.438-4.823-1.095-1.378-2.456-2.491-4.08-3.339-1.626-.848-3.534-1.272-5.725-1.272-2.19 0-4.116.406-5.777 1.219-1.66.813-3.056 1.908-4.187 3.286-1.13 1.378-1.979 2.986-2.544 4.823-.565 1.837-.848 3.78-.848 5.83 0 2.05.283 3.993.848 5.83.565 1.837 1.413 3.48 2.544 4.929a12.39 12.39 0 004.187 3.445c1.66.848 3.586 1.272 5.777 1.272z\"/></svg>"
},
"$:/core/images/help": {
"title": "$:/core/images/help",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-help tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M36.055 111.441c-5.24 4.396-15.168 7.362-26.555 7.362-1.635 0-3.24-.06-4.806-.179 7.919-2.64 14.062-8.6 16.367-16.014C8.747 92.845 1.05 78.936 1.05 63.5c0-29.547 28.206-53.5 63-53.5s63 23.953 63 53.5-28.206 53.5-63 53.5c-10.055 0-19.56-2-27.994-5.559zm35.35-33.843a536.471 536.471 0 00.018-4.682 199.02 199.02 0 00-.023-3.042c.008-1.357.595-2.087 3.727-4.235.112-.077 1.085-.74 1.386-.948 3.093-2.133 5.022-3.786 6.762-6.187 2.34-3.228 3.558-7.077 3.558-11.649 0-13.292-9.86-21.952-21.455-21.952-11.103 0-22.499 9.609-24.066 22.295a6.023 6.023 0 1011.956 1.477c.806-6.527 6.972-11.726 12.11-11.726 5.265 0 9.408 3.64 9.408 9.906 0 3.634-1.1 5.153-5.111 7.919l-1.362.93c-2.682 1.84-4.227 3.1-5.7 4.931-2.109 2.62-3.242 5.717-3.258 9.314.013.892.02 1.86.022 2.981a470.766 470.766 0 01-.022 4.943 6.023 6.023 0 1012.046.12l.003-.395zm-6.027 24.499a7.529 7.529 0 100-15.058 7.529 7.529 0 000 15.058z\"/></svg>"
},
"$:/core/images/home-button": {
"title": "$:/core/images/home-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-home-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112.985 119.502c.01-.165.015-.331.015-.499V67.568c3.137 2.948 8.076 2.884 11.134-.174a7.999 7.999 0 00-.002-11.316L70.396 2.343A7.978 7.978 0 0064.734 0a7.957 7.957 0 00-5.656 2.343L33 28.42V8.007C33 3.585 29.41 0 25 0c-4.418 0-8 3.59-8 8.007V44.42L5.342 56.078c-3.125 3.125-3.12 8.198-.002 11.316a7.999 7.999 0 0011.316-.003l.344-.343v52.945a8.11 8.11 0 000 .007c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8a8.11 8.11 0 00-.015-.498zM97 112V51.574L64.737 19.31 33 51.048V112h64z\"/></svg>"
},
"$:/core/images/import-button": {
"title": "$:/core/images/import-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-import-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M114.832 60.436s3.235-3.27 6.921.417c3.686 3.686.231 7.14.231 7.14l-42.153 42.92s-30.765 32.367-58.798 4.333C-7 87.213 24.59 55.623 24.59 55.623L67.363 12.85s22.725-24.6 43.587-3.738c20.862 20.862-3.96 43.09-3.96 43.09l-35.04 35.04S49.903 112.546 36.426 99.07c-13.476-13.477 11.83-35.523 11.83-35.523l35.04-35.04s3.902-3.902 7.78-.023c3.879 3.878.118 7.921.118 7.921l-35.04 35.04s-13.212 13.212-8.872 17.551c4.34 4.34 16.77-9.653 16.77-9.653l35.04-35.04s16.668-14.598 3.966-27.3c-13.893-13.892-27.565 3.702-27.565 3.702l-42.91 42.91s-23.698 23.698-3.658 43.738 43.012-4.385 43.012-4.385l42.895-42.533z\"/></svg>"
},
"$:/core/images/info-button": {
"title": "$:/core/images/info-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-info-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\" transform=\"translate(.05)\"><path d=\"M64 128c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64C28.654 0 0 28.654 0 64c0 35.346 28.654 64 64 64zm0-16c26.51 0 48-21.49 48-48S90.51 16 64 16 16 37.49 16 64s21.49 48 48 48z\"/><circle cx=\"64\" cy=\"32\" r=\"8\"/><rect width=\"16\" height=\"56\" x=\"56\" y=\"48\" rx=\"8\"/></g></svg>"
},
"$:/core/images/italic": {
"title": "$:/core/images/italic",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-italic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M66.711 0h22.41L62.408 128H40z\"/></svg>"
},
"$:/core/images/left-arrow": {
"title": "$:/core/images/left-arrow",
"created": "20150315234410875",
"modified": "20150315235324760",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-left-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M0 64.177c0-2.026.771-4.054 2.317-5.6l55.98-55.98a7.92 7.92 0 0111.195.001c3.086 3.085 3.092 8.104.001 11.195L19.111 64.175l50.382 50.382a7.92 7.92 0 010 11.195c-3.086 3.086-8.105 3.092-11.196.001l-55.98-55.98A7.892 7.892 0 010 64.177z\"/></svg>"
},
"$:/core/images/line-width": {
"title": "$:/core/images/line-width",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-line-width tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M16 18h96a2 2 0 000-4H16a2 2 0 100 4zm0 17h96a4 4 0 100-8H16a4 4 0 100 8zm0 21h96a6 6 0 000-12H16a6 6 0 100 12zm0 29h96c5.523 0 10-4.477 10-10s-4.477-10-10-10H16c-5.523 0-10 4.477-10 10s4.477 10 10 10zm0 43h96c8.837 0 16-7.163 16-16s-7.163-16-16-16H16c-8.837 0-16 7.163-16 16s7.163 16 16 16z\"/></svg>"
},
"$:/core/images/link": {
"title": "$:/core/images/link",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-link tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M42.263 69.38a31.919 31.919 0 006.841 10.13c12.5 12.5 32.758 12.496 45.255 0l22.627-22.628c12.502-12.501 12.497-32.758 0-45.255-12.5-12.5-32.758-12.496-45.254 0L49.104 34.255a32.333 32.333 0 00-2.666 3.019 36.156 36.156 0 0121.94.334l14.663-14.663c6.25-6.25 16.382-6.254 22.632-.004 6.248 6.249 6.254 16.373-.004 22.631l-22.62 22.62c-6.25 6.25-16.381 6.254-22.631.004a15.93 15.93 0 01-4.428-8.433 11.948 11.948 0 00-7.59 3.48l-6.137 6.137z\"/><path d=\"M86.35 59.234a31.919 31.919 0 00-6.84-10.13c-12.5-12.5-32.758-12.497-45.255 0L11.627 71.732c-12.501 12.5-12.496 32.758 0 45.254 12.5 12.5 32.758 12.497 45.255 0L79.51 94.36a32.333 32.333 0 002.665-3.02 36.156 36.156 0 01-21.94-.333l-14.663 14.663c-6.25 6.25-16.381 6.253-22.63.004-6.25-6.249-6.255-16.374.003-22.632l22.62-22.62c6.25-6.25 16.381-6.253 22.631-.003a15.93 15.93 0 014.428 8.432 11.948 11.948 0 007.59-3.48l6.137-6.136z\"/></g></svg>"
},
"$:/core/images/linkify": {
"title": "$:/core/images/linkify",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-linkify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M17.031 31.919H9.048V96.85h7.983v6.92H0V25h17.031v6.919zm24.66 0h-7.983V96.85h7.983v6.92H24.66V25h17.03v6.919zM67.77 56.422l11.975-3.903 2.306 7.096-12.063 3.903 7.628 10.379-6.12 4.435-7.63-10.467-7.45 10.2-5.943-4.523L58.1 63.518 45.95 59.35l2.306-7.096 12.064 4.17V43.825h7.45v12.596zM86.31 96.85h7.982V31.92H86.31V25h17.031v78.77H86.31v-6.92zm24.659 0h7.983V31.92h-7.983V25H128v78.77h-17.031v-6.92z\"/></svg>"
},
"$:/core/images/list-bullet": {
"title": "$:/core/images/list-bullet",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-bullet tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M11.636 40.273c6.427 0 11.637-5.21 11.637-11.637C23.273 22.21 18.063 17 11.636 17 5.21 17 0 22.21 0 28.636c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.637 0-6.426-5.21-11.636-11.637-11.636C5.21 51.91 0 57.12 0 63.545c0 6.427 5.21 11.637 11.636 11.637zm0 34.909c6.427 0 11.637-5.21 11.637-11.636 0-6.427-5.21-11.637-11.637-11.637C5.21 86.818 0 92.028 0 98.455c0 6.426 5.21 11.636 11.636 11.636zM34.91 22.818H128v11.637H34.91V22.818zm0 34.91H128v11.636H34.91V57.727zm0 34.908H128v11.637H34.91V92.636z\"/></svg>"
},
"$:/core/images/list-number": {
"title": "$:/core/images/list-number",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list-number tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M33.84 22.356H128v11.77H33.84v-11.77zm0 35.31H128v11.77H33.84v-11.77zm0 35.311H128v11.77H33.84v-11.77zM.38 42.631v-2.223h.998c.826 0 1.445-.14 1.858-.42.413-.28.619-.948.619-2.002V22.769c0-1.442-.193-2.336-.58-2.683-.385-.347-1.477-.52-3.275-.52v-2.143c3.502-.147 6.252-.955 8.25-2.423h2.117v22.865c0 .921.15 1.575.449 1.963.3.387.949.58 1.948.58h.998v2.223H.38zm-.3 35.356v-1.902c7.19-6.554 10.786-12.58 10.786-18.08 0-1.562-.326-2.81-.979-3.744-.652-.934-1.524-1.402-2.616-1.402-.893 0-1.655.317-2.287.952-.633.634-.95 1.364-.95 2.192 0 .974.247 1.829.74 2.563.106.16.16.28.16.36 0 .147-.16.28-.48.4-.213.08-.752.308-1.618.681-.839.374-1.358.561-1.558.561-.24 0-.512-.37-.819-1.111A6.2 6.2 0 010 57.064c0-1.949.849-3.544 2.547-4.785 1.698-1.242 3.798-1.862 6.302-1.862 2.463 0 4.53.67 6.202 2.012 1.67 1.341 2.506 3.093 2.506 5.256a8.644 8.644 0 01-.849 3.724c-.566 1.201-1.92 3.053-4.064 5.556a165.471 165.471 0 01-6.272 6.938h11.445l-1.019 5.726h-2.117c.08-.28.12-.534.12-.76 0-.388-.1-.631-.3-.731-.2-.1-.599-.15-1.198-.15H.08zm12.124 19.207c1.745.04 3.236.637 4.474 1.792 1.239 1.154 1.858 2.773 1.858 4.855 0 2.99-1.132 5.393-3.396 7.208-2.263 1.815-5 2.723-8.209 2.723-2.01 0-3.669-.384-4.974-1.151C.652 111.853 0 110.849 0 109.607c0-.774.27-1.398.809-1.872.54-.474 1.128-.71 1.768-.71.639 0 1.162.2 1.568.6.406.4.782 1.055 1.128 1.962.466 1.268 1.239 1.902 2.317 1.902 1.265 0 2.287-.477 3.066-1.431.78-.955 1.169-2.686 1.169-5.196 0-1.709-.12-3.023-.36-3.944-.24-.921-.792-1.382-1.658-1.382-.586 0-1.185.307-1.797.921-.493.494-.932.741-1.319.741-.333 0-.602-.147-.809-.44-.206-.294-.31-.574-.31-.841 0-.32.104-.594.31-.821.207-.227.69-.594 1.449-1.102 2.876-1.922 4.314-4.017 4.314-6.287 0-1.188-.306-2.092-.919-2.713a3.001 3.001 0 00-2.217-.93c-.799 0-1.525.263-2.177.79-.653.528-.979 1.158-.979 1.892 0 .641.253 1.235.76 1.782.172.2.259.367.259.5 0 .121-.57.428-1.708.922-1.139.494-1.854.74-2.147.74-.413 0-.75-.333-1.009-1-.26-.668-.39-1.282-.39-1.842 0-1.749.93-3.224 2.787-4.425 1.858-1.202 3.965-1.802 6.322-1.802 2.064 0 3.851.447 5.363 1.341 1.511.895 2.267 2.116 2.267 3.664 0 1.362-.57 2.623-1.708 3.784a13.387 13.387 0 01-3.945 2.784z\"/></svg>"
},
"$:/core/images/list": {
"title": "$:/core/images/list",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-list tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M87.748 128H23.999c-4.418 0-7.999-3.59-7.999-8.007V8.007C16 3.585 19.588 0 24 0h80c4.419 0 8 3.59 8 8.007V104H91.25c-.965 0-1.84.392-2.473 1.025a3.476 3.476 0 00-1.029 2.476V128zm8-.12l15.88-15.88h-15.88v15.88zM40 15.508A3.502 3.502 0 0143.5 12h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 20h-55a3.498 3.498 0 01-3.5-3.509v-.982zM32 22a6 6 0 100-12 6 6 0 000 12zm8 9.509A3.502 3.502 0 0143.5 28h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 36h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 44h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 52h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 60h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 68h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 76h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 84h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.502 3.502 0 0143.5 92h55c1.933 0 3.5 1.561 3.5 3.509v.982A3.502 3.502 0 0198.5 100h-55a3.498 3.498 0 01-3.5-3.509v-.982zm0 16A3.505 3.505 0 0143.497 108h33.006A3.497 3.497 0 0180 111.509v.982A3.505 3.505 0 0176.503 116H43.497A3.497 3.497 0 0140 112.491v-.982zM32 38a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12zm0 16a6 6 0 100-12 6 6 0 000 12z\"/></svg>"
},
"$:/core/images/locked-padlock": {
"title": "$:/core/images/locked-padlock",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-locked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M96.472 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h8c.003-15.723.303-47.731 32.16-47.731 31.794 0 32.305 32.057 32.312 47.731zm-15.897 0H48.44c.002-16.287.142-32 15.719-32 15.684 0 16.977 16.136 16.415 32zM67.732 92.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
},
"$:/core/images/mail": {
"title": "$:/core/images/mail",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mail tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M122.827 104.894a7.986 7.986 0 01-2.834.516H8.007c-.812 0-1.597-.12-2.335-.345l34.163-34.163 20.842 20.842a3.998 3.998 0 003.418 1.134 4.003 4.003 0 003.395-1.134L88.594 70.64c.075.09.155.176.24.26l33.993 33.994zm5.076-6.237c.064-.406.097-.823.097-1.247v-64c0-.669-.082-1.318-.237-1.94L94.23 65.006c.09.075.177.154.261.239l33.413 33.413zm-127.698.56A8.023 8.023 0 010 97.41v-64c0-.716.094-1.41.271-2.071l33.907 33.906L.205 99.218zM5.93 25.684a8.012 8.012 0 012.078-.273h111.986c.766 0 1.507.108 2.209.308L64.083 83.837 5.93 25.683z\"/></svg>"
},
"$:/core/images/menu-button": {
"title": "$:/core/images/menu-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-menu-button tc-image-button\" viewBox=\"0 0 128 128\"><rect width=\"128\" height=\"16\" y=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"56\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"96\" rx=\"8\"/></svg>"
},
"$:/core/images/mono-block": {
"title": "$:/core/images/mono-block",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-block tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M23.965 32.967h.357c.755 0 1.328.192 1.72.577.39.384.586.947.586 1.688 0 .824-.206 1.418-.618 1.782-.413.363-1.094.545-2.045.545h-6.31c-.965 0-1.65-.178-2.056-.535-.405-.356-.608-.954-.608-1.792 0-.811.203-1.391.608-1.74.406-.35 1.09-.525 2.055-.525h.734l-.86-2.453H8.471l-.902 2.453h.734c.95 0 1.632.178 2.044.535.413.356.619.933.619 1.73 0 .824-.206 1.418-.619 1.782-.412.363-1.094.545-2.044.545h-5.41c-.964 0-1.649-.182-2.054-.545-.406-.364-.608-.958-.608-1.782 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.719-.577h.356l5.62-15.641H6.835c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.95-.619-1.76 0-.825.207-1.42.619-1.783.412-.363 1.094-.545 2.044-.545h7.863c1.244 0 2.118.67 2.62 2.013v.063l6.647 18.2zM12.98 17.326l-3.04 8.848h6.08l-3.04-8.848zm22.402 9.372v6.395h3.145c2.223 0 3.788-.245 4.697-.734.908-.49 1.362-1.307 1.362-2.453 0-1.16-.433-1.985-1.3-2.474-.866-.49-2.383-.734-4.55-.734h-3.354zm10.693-2.327c1.524.559 2.642 1.324 3.355 2.295.713.972 1.07 2.212 1.07 3.722 0 1.272-.308 2.432-.923 3.48-.615 1.049-1.496 1.909-2.642 2.58a7.499 7.499 0 01-2.254.849c-.832.174-2.01.262-3.533.262H30.202c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.782 0-.741.189-1.304.566-1.688.378-.385.93-.577 1.657-.577h.356V17.326h-.356c-.727 0-1.28-.196-1.657-.587-.377-.392-.566-.965-.566-1.72 0-.81.203-1.401.608-1.771.406-.37 1.062-.556 1.971-.556h9.645c2.95 0 5.19.573 6.72 1.72 1.53 1.145 2.296 2.823 2.296 5.031 0 1.09-.234 2.052-.703 2.883-.468.832-1.163 1.513-2.086 2.045zM35.381 17.2v5.284h2.83c1.72 0 2.932-.203 3.638-.609.706-.405 1.06-1.09 1.06-2.054 0-.909-.319-1.573-.955-1.992-.636-.42-1.667-.63-3.093-.63h-3.48zm35.863-3.816c.28-.503.566-.86.86-1.07.293-.21.664-.314 1.111-.314.685 0 1.17.182 1.457.545.287.364.43.986.43 1.866l.042 5.452c0 .964-.157 1.614-.472 1.95-.314.335-.884.503-1.709.503-.587 0-1.037-.14-1.352-.42-.314-.28-.584-.796-.807-1.551-.364-1.328-.944-2.282-1.74-2.862-.797-.58-1.901-.87-3.313-.87-2.153 0-3.802.727-4.948 2.18-1.147 1.454-1.72 3.558-1.72 6.311 0 2.74.58 4.844 1.74 6.311 1.16 1.468 2.817 2.202 4.97 2.202 1.467 0 3.085-.49 4.854-1.468 1.768-.978 2.883-1.467 3.344-1.467.545 0 1.003.23 1.373.692.37.46.556 1.034.556 1.719 0 1.23-1.084 2.39-3.25 3.48-2.167 1.09-4.606 1.636-7.318 1.636-3.662 0-6.625-1.21-8.89-3.627-2.264-2.419-3.396-5.578-3.396-9.478 0-3.76 1.146-6.884 3.438-9.372 2.293-2.488 5.2-3.732 8.723-3.732.992 0 1.97.112 2.935.335.964.224 1.992.574 3.082 1.049zm10.22 19.583V17.326h-.356c-.755 0-1.328-.196-1.72-.587-.39-.392-.586-.965-.586-1.72 0-.81.21-1.401.629-1.771.42-.37 1.097-.556 2.034-.556h5.178c2.922 0 5.06.126 6.416.377 1.356.252 2.51.671 3.46 1.258 1.691 1.007 2.988 2.443 3.89 4.31.9 1.865 1.352 4.021 1.352 6.467 0 2.586-.514 4.847-1.541 6.783-1.028 1.936-2.485 3.4-4.372 4.393-.853.447-1.852.772-2.998.975-1.147.203-2.852.304-5.116.304h-6.269c-.965 0-1.65-.178-2.055-.535-.406-.356-.608-.954-.608-1.792 0-.741.195-1.304.587-1.688.391-.385.964-.577 1.72-.577h.356zm5.41-15.725v15.725h1.195c2.642 0 4.592-.646 5.85-1.94 1.258-1.292 1.887-3.28 1.887-5.965 0-2.641-.64-4.612-1.918-5.912-1.28-1.3-3.205-1.95-5.777-1.95-.335 0-.59.003-.765.01a7.992 7.992 0 00-.472.032zm35.067-.126h-9.75v5.368h3.69v-.252c0-.797.175-1.39.524-1.782.35-.392.88-.587 1.594-.587.629 0 1.142.178 1.54.534.4.357.598.808.598 1.353 0 .028.007.118.021.272.014.154.021.308.021.462v4.34c0 .936-.167 1.607-.503 2.013-.335.405-.88.608-1.635.608-.713 0-1.251-.19-1.615-.567-.363-.377-.545-.936-.545-1.677v-.377h-3.69v6.269h9.75v-2.495c0-.937.178-1.608.534-2.013.357-.405.94-.608 1.75-.608.798 0 1.367.2 1.71.597.342.399.513 1.073.513 2.024v5.074c0 .755-.146 1.258-.44 1.51-.293.251-.873.377-1.74.377h-17.172c-.923 0-1.583-.182-1.982-.545-.398-.364-.597-.958-.597-1.782 0-.741.189-1.304.566-1.688.377-.385.93-.577 1.656-.577h.357V17.326h-.357c-.712 0-1.261-.2-1.646-.598-.384-.398-.576-.968-.576-1.709 0-.81.203-1.401.608-1.771.405-.37 1.062-.556 1.97-.556h17.173c.853 0 1.43.13 1.73.388.3.258.45.772.45 1.54v4.698c0 .95-.174 1.631-.524 2.044-.35.412-.915.618-1.698.618-.81 0-1.394-.21-1.75-.629-.357-.419-.535-1.097-.535-2.033v-2.202zM19.77 47.641c.267-.504.55-.86.85-1.07.3-.21.675-.314 1.122-.314.685 0 1.17.181 1.457.545.287.363.43.985.43 1.866l.042 5.451c0 .965-.157 1.615-.472 1.95-.314.336-.891.504-1.73.504-.587 0-1.045-.144-1.373-.43-.329-.287-.598-.8-.807-1.541-.378-1.342-.958-2.3-1.74-2.873-.783-.573-1.88-.86-3.292-.86-2.153 0-3.799.727-4.938 2.181-1.14 1.454-1.709 3.557-1.709 6.311s.598 4.882 1.793 6.385C10.599 67.248 12.294 68 14.488 68c.503 0 1.077-.06 1.72-.179a23.809 23.809 0 002.264-.555v-3.313h-2.37c-.95 0-1.624-.175-2.023-.524-.398-.35-.597-.93-.597-1.74 0-.84.199-1.437.597-1.793.399-.357 1.073-.535 2.024-.535h7.569c.978 0 1.667.175 2.065.524.398.35.598.937.598 1.762 0 .74-.2 1.31-.598 1.708-.398.399-.975.598-1.73.598h-.335v5.242c0 .447-.05.758-.147.933-.098.174-.293.353-.587.534-.797.476-2.062.895-3.795 1.258a25.576 25.576 0 01-5.263.546c-3.662 0-6.625-1.21-8.89-3.628-2.264-2.418-3.397-5.577-3.397-9.477 0-3.76 1.147-6.884 3.44-9.372 2.292-2.488 5.199-3.732 8.721-3.732.979 0 1.954.112 2.925.335.972.224 2.003.573 3.093 1.049zm15.84 3.941v4.823h6.857v-4.823h-.336c-.754 0-1.331-.195-1.73-.587-.398-.391-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.364 1.093-.545 2.044-.545h5.41c.95 0 1.624.181 2.023.545.398.363.597.957.597 1.782 0 .755-.192 1.328-.576 1.72-.385.39-.947.586-1.688.586h-.357v15.642h.357c.755 0 1.328.192 1.719.576.391.385.587.947.587 1.688 0 .825-.203 1.419-.608 1.782-.405.364-1.09.546-2.055.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.2-1.303.598-1.688.398-.384.975-.576 1.73-.576h.335v-6.186h-6.856v6.186h.335c.755 0 1.331.192 1.73.576.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.412.364-1.094.546-2.044.546h-5.41c-.964 0-1.65-.179-2.055-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.392-.384.965-.576 1.72-.576h.356V51.582h-.356c-.741 0-1.304-.195-1.688-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.073-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.335zm31.754 0v15.642h3.523c.95 0 1.632.178 2.044.534.412.357.618.933.618 1.73 0 .811-.21 1.402-.629 1.772-.419.37-1.097.556-2.033.556H58.433c-.95 0-1.632-.182-2.044-.546-.412-.363-.619-.957-.619-1.782 0-.81.203-1.39.608-1.74.406-.35 1.09-.524 2.055-.524h3.523V51.582h-3.523c-.95 0-1.632-.181-2.044-.545-.412-.363-.619-.95-.619-1.761 0-.825.203-1.412.608-1.761.406-.35 1.09-.524 2.055-.524h12.455c.992 0 1.684.174 2.075.524.392.35.587.936.587 1.761 0 .81-.202 1.398-.608 1.761-.405.364-1.09.545-2.054.545h-3.523zm30.496 0v11.994c0 1.873-.122 3.228-.367 4.067a5.876 5.876 0 01-1.227 2.244c-.74.852-1.768 1.495-3.082 1.929-1.314.433-2.893.65-4.738.65-1.3 0-2.555-.126-3.764-.378a16.843 16.843 0 01-3.491-1.132c-.615-.28-1.017-.643-1.206-1.09-.188-.448-.283-1.175-.283-2.18v-4.32c0-1.202.175-2.04.525-2.516.349-.475.957-.713 1.824-.713 1.244 0 1.929.915 2.054 2.747.014.321.035.566.063.733.168 1.622.545 2.73 1.133 3.324.587.594 1.523.89 2.81.89 1.593 0 2.714-.422 3.364-1.268.65-.845.975-2.386.975-4.623V51.582H88.93c-.95 0-1.632-.181-2.044-.545-.413-.363-.619-.95-.619-1.761 0-.825.2-1.412.598-1.761.398-.35 1.086-.524 2.065-.524h10.693c.979 0 1.667.174 2.065.524.399.35.598.936.598 1.761 0 .81-.206 1.398-.619 1.761-.412.364-1.093.545-2.044.545h-1.761zm14.644 0v6.353l6.48-6.478c-.728-.084-1.238-.29-1.531-.619-.294-.328-.44-.85-.44-1.562 0-.825.198-1.419.597-1.782.398-.364 1.073-.545 2.023-.545h5.137c.95 0 1.625.181 2.023.545.399.363.598.957.598 1.782 0 .769-.2 1.345-.598 1.73-.398.384-.982.576-1.75.576h-.483l-6.101 6.06c1.132.839 2.167 1.94 3.103 3.302.937 1.363 2.034 3.456 3.292 6.28h.692c.825 0 1.44.188 1.845.566.405.377.608.943.608 1.698 0 .825-.206 1.419-.619 1.782-.412.364-1.093.546-2.044.546h-2.579c-1.132 0-2.048-.762-2.746-2.286-.126-.28-.224-.503-.294-.67-.923-1.958-1.768-3.467-2.537-4.53a16.616 16.616 0 00-2.705-2.914l-1.97 1.887v3.92h.335c.755 0 1.331.193 1.73.577.398.385.597.947.597 1.688 0 .825-.206 1.419-.618 1.782-.413.364-1.094.546-2.045.546h-5.41c-.964 0-1.649-.179-2.054-.535-.405-.357-.608-.954-.608-1.793 0-.74.196-1.303.587-1.688.391-.384.965-.576 1.72-.576h.356V51.582h-.357c-.74 0-1.303-.195-1.687-.587-.385-.391-.577-.964-.577-1.719 0-.825.2-1.419.598-1.782.398-.364 1.072-.545 2.023-.545h5.41c.936 0 1.614.181 2.033.545.42.363.63.957.63 1.782 0 .755-.2 1.328-.598 1.72-.399.39-.975.586-1.73.586h-.336zM13.44 96.326l4.005-11.889c.251-.782.6-1.352 1.048-1.709.447-.356 1.041-.534 1.782-.534h3.271c.95 0 1.632.182 2.044.545.413.363.619.957.619 1.782 0 .755-.2 1.328-.598 1.72-.398.39-.975.587-1.73.587h-.335l.587 15.641h.357c.754 0 1.32.192 1.698.577.377.384.566.947.566 1.687 0 .825-.2 1.42-.598 1.783-.398.363-1.072.545-2.023.545h-4.718c-.95 0-1.624-.178-2.023-.535-.398-.356-.597-.954-.597-1.793 0-.74.192-1.303.576-1.687.385-.385.954-.577 1.709-.577h.335l-.293-12.79-3.061 9.52c-.224.712-.542 1.226-.954 1.54-.413.315-.982.472-1.709.472-.727 0-1.303-.157-1.73-.472-.426-.314-.751-.828-.975-1.54l-3.04-9.52-.294 12.79h.336c.755 0 1.324.192 1.709.577.384.384.576.947.576 1.687 0 .825-.202 1.42-.608 1.783-.405.363-1.076.545-2.013.545H2.621c-.937 0-1.608-.182-2.013-.545-.405-.364-.608-.958-.608-1.783 0-.74.192-1.303.577-1.687.384-.385.954-.577 1.708-.577h.336l.608-15.641h-.336c-.754 0-1.331-.196-1.73-.588-.398-.39-.597-.964-.597-1.719 0-.825.206-1.419.619-1.782.412-.363 1.093-.545 2.044-.545h3.27c.728 0 1.311.175 1.752.524.44.35.8.923 1.08 1.72l4.109 11.888zm30.454 2.054V86.828H42.74c-.922 0-1.583-.182-1.981-.546-.398-.363-.598-.95-.598-1.76 0-.812.2-1.402.598-1.773.398-.37 1.059-.555 1.981-.555h5.955c.909 0 1.566.185 1.97.555.406.37.609.961.609 1.772 0 .741-.192 1.31-.577 1.709-.384.398-.933.598-1.646.598h-.356v19.038c0 .657-.07 1.069-.21 1.237-.14.167-.454.251-.943.251h-2.097c-.67 0-1.143-.07-1.415-.21-.273-.14-.507-.384-.703-.733l-8.722-15.327v11.385h1.216c.909 0 1.559.175 1.95.524.392.35.587.93.587 1.74 0 .825-.199 1.42-.597 1.783-.399.363-1.045.545-1.94.545h-6.017c-.909 0-1.566-.182-1.971-.545-.406-.364-.608-.958-.608-1.783 0-.74.188-1.303.566-1.687.377-.385.936-.577 1.677-.577h.336V86.828h-.336c-.713 0-1.265-.2-1.656-.598-.392-.398-.587-.968-.587-1.709 0-.81.206-1.401.618-1.772.413-.37 1.066-.555 1.96-.555h3.44c.824 0 1.383.108 1.677.325.293.216.622.653.985 1.31l7.989 14.551zM64.66 86.366c-1.803 0-3.218.727-4.245 2.18-1.028 1.455-1.541 3.474-1.541 6.06 0 2.586.517 4.613 1.551 6.08 1.034 1.468 2.446 2.202 4.235 2.202 1.804 0 3.222-.73 4.257-2.19 1.034-1.461 1.551-3.492 1.551-6.092 0-2.586-.513-4.605-1.54-6.06-1.028-1.453-2.45-2.18-4.268-2.18zm0-4.864c3.44 0 6.27 1.23 8.492 3.69 2.223 2.46 3.334 5.598 3.334 9.414 0 3.844-1.104 6.99-3.313 9.436-2.208 2.446-5.046 3.669-8.513 3.669-3.424 0-6.255-1.234-8.491-3.701-2.237-2.467-3.355-5.602-3.355-9.404 0-3.83 1.108-6.971 3.323-9.424 2.216-2.454 5.057-3.68 8.523-3.68zM87.461 98.17v4.298h2.16c.908 0 1.555.175 1.94.524.384.35.576.93.576 1.74 0 .825-.196 1.42-.587 1.783-.392.363-1.035.545-1.93.545h-7.254c-.922 0-1.583-.182-1.981-.545-.399-.364-.598-.958-.598-1.783 0-.74.189-1.303.566-1.687.378-.385.93-.577 1.657-.577h.356V86.828h-.356c-.713 0-1.262-.2-1.646-.598-.385-.398-.577-.968-.577-1.709 0-.81.203-1.401.608-1.772.406-.37 1.063-.555 1.971-.555h8.66c3.424 0 6.014.657 7.768 1.97 1.754 1.315 2.631 3.25 2.631 5.809 0 2.697-.873 4.738-2.62 6.122-1.748 1.384-4.34 2.076-7.78 2.076h-3.564zm0-11.343v6.625h2.977c1.65 0 2.89-.28 3.722-.839.832-.559 1.248-1.397 1.248-2.516 0-1.048-.43-1.855-1.29-2.421-.86-.566-2.086-.85-3.68-.85h-2.977zm27.267 20.568l-1.636 1.636a12.37 12.37 0 011.772-.44c.58-.098 1.15-.147 1.709-.147 1.104 0 2.268.164 3.491.492 1.223.329 1.967.493 2.233.493.447 0 1.03-.15 1.75-.45.72-.301 1.206-.452 1.458-.452.517 0 .947.2 1.29.598.342.398.513.898.513 1.5 0 .796-.472 1.474-1.415 2.033-.944.56-2.1.839-3.47.839-.937 0-2.139-.22-3.607-.66-1.467-.441-2.53-.661-3.187-.661-.992 0-2.11.272-3.354.817-1.244.546-2.013.818-2.307.818a2.14 2.14 0 01-1.53-.597c-.42-.399-.63-.878-.63-1.437 0-.391.134-.807.4-1.247.265-.44.733-1.01 1.404-1.709l2.118-2.139c-2.335-.852-4.194-2.386-5.578-4.602-1.384-2.215-2.075-4.763-2.075-7.642 0-3.802 1.104-6.909 3.312-9.32 2.209-2.411 5.053-3.617 8.534-3.617 3.467 0 6.304 1.209 8.513 3.627 2.208 2.418 3.312 5.522 3.312 9.31 0 3.774-1.097 6.884-3.291 9.33-2.195 2.446-4.977 3.67-8.345 3.67a22.5 22.5 0 01-1.384-.043zm1.195-21.03c-1.803 0-3.218.727-4.246 2.18-1.027 1.455-1.54 3.474-1.54 6.06 0 2.586.516 4.613 1.55 6.08 1.035 1.468 2.447 2.202 4.236 2.202 1.803 0 3.222-.73 4.256-2.19 1.035-1.461 1.552-3.492 1.552-6.092 0-2.586-.514-4.605-1.541-6.06-1.028-1.453-2.45-2.18-4.267-2.18z\"/></svg>"
},
"$:/core/images/mono-line": {
"title": "$:/core/images/mono-line",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-mono-line tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M60.437 84.523h.908c1.922 0 3.381.489 4.378 1.468.997.979 1.495 2.411 1.495 4.298 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388h-16.07c-2.456 0-4.2-.454-5.232-1.361-1.032-.908-1.548-2.43-1.548-4.565 0-2.065.516-3.542 1.548-4.432 1.032-.89 2.776-1.334 5.232-1.334h1.869l-2.19-6.247H20.983l-2.296 6.247h1.87c2.42 0 4.155.453 5.205 1.361 1.05.908 1.575 2.376 1.575 4.405 0 2.1-.525 3.612-1.575 4.538-1.05.925-2.785 1.388-5.206 1.388H6.781c-2.456 0-4.2-.463-5.233-1.388C.516 93.9 0 92.389 0 90.289c0-1.887.498-3.32 1.495-4.298.997-.979 2.456-1.468 4.378-1.468h.908l14.308-39.83h-4.271c-2.42 0-4.156-.462-5.206-1.387-1.05-.926-1.575-2.42-1.575-4.485 0-2.1.525-3.613 1.575-4.538 1.05-.926 2.785-1.388 5.206-1.388h20.021c3.168 0 5.392 1.708 6.674 5.125v.16l16.924 46.343zm-27.976-39.83L24.72 67.225h15.483l-7.742-22.53zM89.506 68.56v16.284h8.008c5.66 0 9.646-.623 11.96-1.869 2.313-1.245 3.47-3.328 3.47-6.246 0-2.955-1.103-5.055-3.31-6.3-2.207-1.246-6.069-1.869-11.586-1.869h-8.542zm27.229-5.926c3.88 1.423 6.727 3.372 8.542 5.846 1.815 2.474 2.723 5.633 2.723 9.477 0 3.239-.783 6.193-2.35 8.862-1.565 2.67-3.808 4.859-6.726 6.567-1.709.997-3.622 1.718-5.74 2.163-2.118.445-5.116.667-8.996.667h-27.87c-2.349 0-4.03-.463-5.045-1.388-1.014-.926-1.521-2.438-1.521-4.538 0-1.887.48-3.32 1.441-4.298.961-.979 2.367-1.468 4.218-1.468h.907v-39.83h-.907c-1.851 0-3.257-.498-4.218-1.494-.961-.997-1.441-2.456-1.441-4.378 0-2.065.516-3.568 1.548-4.512 1.032-.943 2.705-1.414 5.018-1.414h24.56c7.51 0 13.214 1.459 17.111 4.377 3.898 2.92 5.847 7.19 5.847 12.814 0 2.776-.597 5.223-1.789 7.341-1.192 2.118-2.963 3.853-5.312 5.206zm-27.23-18.26v13.455h7.208c4.378 0 7.466-.516 9.264-1.549 1.797-1.032 2.696-2.776 2.696-5.232 0-2.313-.81-4.004-2.43-5.072-1.619-1.068-4.244-1.602-7.874-1.602h-8.863z\"/></svg>"
},
"$:/core/images/new-button": {
"title": "$:/core/images/new-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M56 72H8.007C3.591 72 0 68.418 0 64c0-4.41 3.585-8 8.007-8H56V8.007C56 3.591 59.582 0 64 0c4.41 0 8 3.585 8 8.007V56h47.993c4.416 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H72v47.993c0 4.416-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V72z\"/></svg>"
},
"$:/core/images/new-here-button": {
"title": "$:/core/images/new-here-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-here-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.838 20.935l-3.572.938c-3.688.968-8.23 4.43-10.136 7.731L3.37 96.738c-1.905 3.3-.771 7.524 2.534 9.432l33.717 19.466c3.297 1.904 7.53.78 9.435-2.521l38.76-67.134c1.905-3.3 2.632-8.963 1.623-12.646L83.285 20.88c-1.009-3.68-4.821-5.884-8.513-4.915l-7.603 1.995.043.287c.524 3.394 2.053 7.498 4.18 11.55.418.163.829.36 1.23.59a8.864 8.864 0 014.438 8.169c.104.132.21.264.316.395l-.386.318a8.663 8.663 0 01-1.082 3.137c-2.42 4.192-7.816 5.608-12.051 3.163-4.12-2.379-5.624-7.534-3.476-11.671-2.177-4.394-3.788-8.874-4.543-12.964z\"/><path d=\"M69.554 44.76c-5.944-7.476-10.74-17.196-11.955-25.059-1.68-10.875 3.503-18.216 15.082-18.04 10.407.158 19.975 5.851 24.728 13.785 5.208 8.695 2.95 17.868-6.855 20.496l-2.037-7.601c4.232-1.134 4.999-4.248 2.24-8.853-3.37-5.626-10.465-9.848-18.146-9.965-6.392-.097-8.31 2.62-7.323 9.01.999 6.465 5.318 15.138 10.582 21.65l-.072.06c.559 1.553-4.17 6.44-5.938 4.888l-.005.004-.028-.034a1.323 1.323 0 01-.124-.135 2.618 2.618 0 01-.149-.205z\"/><rect width=\"16\" height=\"48\" x=\"96\" y=\"80\" rx=\"8\"/><rect width=\"48\" height=\"16\" x=\"80\" y=\"96\" rx=\"8\"/></g></svg>"
},
"$:/core/images/new-image-button": {
"title": "$:/core/images/new-image-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-image-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.362 73.627l15.826-27.41a2.626 2.626 0 00-.962-3.59l-50.01-28.872a2.626 2.626 0 00-3.588.961L30.058 36.49l10.04-5.261c3.042-1.595 6.771.114 7.55 3.46l3.607 17.702 9.88.85a5.25 5.25 0 014.571 3.77c.034.115.1.344.199.671.165.553.353 1.172.562 1.843.595 1.914 1.23 3.85 1.872 5.678.207.588.412 1.156.614 1.701.625 1.685 1.209 3.114 1.725 4.207.255.54.485.977.726 1.427.214.212.547.425 1.011.622 1.141.482 2.784.74 4.657.758.864.008 1.71-.034 2.492-.11.448-.043.753-.085.871-.104.315-.053.625-.077.927-.076zM37.47 2.649A5.257 5.257 0 0144.649.725l63.645 36.746a5.257 5.257 0 011.923 7.178L73.47 108.294a5.257 5.257 0 01-7.177 1.923L2.649 73.47a5.257 5.257 0 01-1.924-7.177L37.471 2.649zm42.837 50.49a5.25 5.25 0 105.25-9.092 5.25 5.25 0 00-5.25 9.093zM96 112h-7.993c-4.419 0-8.007-3.582-8.007-8 0-4.41 3.585-8 8.007-8H96v-7.993C96 83.588 99.582 80 104 80c4.41 0 8 3.585 8 8.007V96h7.993c4.419 0 8.007 3.582 8.007 8 0 4.41-3.585 8-8.007 8H112v7.993c0 4.419-3.582 8.007-8 8.007-4.41 0-8-3.585-8-8.007V112zM33.347 51.791c7.428 7.948 9.01 10.69 7.449 13.394-1.56 2.703-13.838-2.328-16.094 1.58-2.256 3.908-.907 3.258-2.437 5.908l19.73 11.39s-5.605-8.255-4.235-10.628c2.515-4.356 8.77-1.256 10.365-4.019 2.414-4.181-5.103-9.639-14.778-17.625z\"/></svg>"
},
"$:/core/images/new-journal-button": {
"title": "$:/core/images/new-journal-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-new-journal-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.545 112.818v11.818c0 1.306 1.086 2.364 2.425 2.364h6.06c1.34 0 2.425-1.058 2.425-2.364v-11.818h12.12c1.34 0 2.425-1.058 2.425-2.363v-5.91c0-1.305-1.085-2.363-2.424-2.363h-12.121V90.364c0-1.306-1.086-2.364-2.425-2.364h-6.06c-1.34 0-2.425 1.058-2.425 2.364v11.818h-12.12c-1.34 0-2.425 1.058-2.425 2.363v5.91c0 1.305 1.085 2.363 2.424 2.363h12.121zM60.016 4.965c-4.781-2.76-10.897-1.118-13.656 3.66L5.553 79.305A9.993 9.993 0 009.21 92.963l51.04 29.468c4.78 2.76 10.897 1.118 13.655-3.66l40.808-70.681a9.993 9.993 0 00-3.658-13.656L60.016 4.965zm-3.567 27.963a6 6 0 106-10.393 6 6 0 00-6 10.393zm31.697 17.928a6 6 0 106-10.392 6 6 0 00-6 10.392z\"/><text class=\"tc-fill-background\" font-family=\"Helvetica\" font-size=\"47.172\" font-weight=\"bold\" transform=\"rotate(30 25.742 95.82)\"><tspan x=\"42\" y=\"77.485\" text-anchor=\"middle\"><<now \"DD\">></tspan></text></g></svg>"
},
"$:/core/images/opacity": {
"title": "$:/core/images/opacity",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-opacity tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M102.362 65a51.595 51.595 0 01-1.942 6H82.584a35.867 35.867 0 002.997-6h16.78zm.472-2c.423-1.961.734-3.963.929-6H87.656a35.78 35.78 0 01-1.368 6h16.546zm-3.249 10a51.847 51.847 0 01-3.135 6H75.812a36.205 36.205 0 005.432-6h18.341zm-4.416 8c-1.424 2.116-3 4.12-4.71 6H60.46a35.843 35.843 0 0012.874-6h21.834zm-7.513-34h16.107C101.247 20.627 79.033 0 52 0 23.281 0 0 23.281 0 52c0 25.228 17.965 46.26 41.8 51h20.4a51.66 51.66 0 0015.875-6H39v-2h42.25a52.257 52.257 0 007.288-6H39v-2h4.539C27.739 83.194 16 68.968 16 52c0-19.882 16.118-36 36-36 18.186 0 33.222 13.484 35.656 31zm.22 2h16.039a52.823 52.823 0 010 6H87.877a36.483 36.483 0 000-6z\"/><path d=\"M76 128c28.719 0 52-23.281 52-52s-23.281-52-52-52-52 23.281-52 52 23.281 52 52 52zm0-16c19.882 0 36-16.118 36-36S95.882 40 76 40 40 56.118 40 76s16.118 36 36 36z\"/><path d=\"M37 58h53v4H37v-4zm3-8h53v4H40v-4zm0-8h53v4H40v-4zm-8 24h53v4H32v-4zm-2 8h53v4H30v-4zm-3 8h53v4H27v-4z\"/></g></svg>"
},
"$:/core/images/open-window": {
"title": "$:/core/images/open-window",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-open-window tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M16 112h88.994c3.87 0 7.006 3.59 7.006 8 0 4.418-3.142 8-7.006 8H7.006C3.136 128 0 124.41 0 120a9.321 9.321 0 010-.01V24.01C0 19.586 3.59 16 8 16c4.418 0 8 3.584 8 8.01V112z\"/><path d=\"M96 43.196V56a8 8 0 1016 0V24c0-4.41-3.585-8-8.007-8H72.007C67.588 16 64 19.582 64 24c0 4.41 3.585 8 8.007 8H84.57l-36.3 36.299a8 8 0 00-.001 11.316c3.117 3.117 8.19 3.123 11.316-.003L96 43.196zM32 7.999C32 3.581 35.588 0 40 0h80c4.419 0 8 3.588 8 8v80c0 4.419-3.588 8-8 8H40c-4.419 0-8-3.588-8-8V8z\"/></g></svg>"
},
"$:/core/images/options-button": {
"title": "$:/core/images/options-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-options-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M110.488 76a47.712 47.712 0 01-5.134 12.384l6.724 6.724c3.123 3.123 3.132 8.192.011 11.313l-5.668 5.668c-3.12 3.12-8.186 3.117-11.313-.01l-6.724-6.725c-3.82 2.258-7.98 4-12.384 5.134v9.505c0 4.417-3.578 8.007-7.992 8.007h-8.016C55.58 128 52 124.415 52 119.993v-9.505a47.712 47.712 0 01-12.384-5.134l-6.724 6.725c-3.123 3.122-8.192 3.131-11.313.01l-5.668-5.668c-3.12-3.12-3.116-8.186.01-11.313l6.725-6.724c-2.257-3.82-4-7.98-5.134-12.384H8.007C3.591 76 0 72.422 0 68.01v-8.017C0 55.58 3.585 52 8.007 52h9.505a47.712 47.712 0 015.134-12.383l-6.724-6.725c-3.123-3.122-3.132-8.191-.011-11.312l5.668-5.669c3.12-3.12 8.186-3.116 11.313.01l6.724 6.725c3.82-2.257 7.98-4 12.384-5.134V8.007C52 3.591 55.578 0 59.992 0h8.016C72.42 0 76 3.585 76 8.007v9.505a47.712 47.712 0 0112.384 5.134l6.724-6.724c3.123-3.123 8.192-3.132 11.313-.01l5.668 5.668c3.12 3.12 3.116 8.186-.01 11.312l-6.725 6.725c2.257 3.82 4 7.979 5.134 12.383h9.505c4.416 0 8.007 3.578 8.007 7.992v8.017c0 4.411-3.585 7.991-8.007 7.991h-9.505zM64 96c17.673 0 32-14.327 32-32 0-17.673-14.327-32-32-32-17.673 0-32 14.327-32 32 0 17.673 14.327 32 32 32z\"/></svg>"
},
"$:/core/images/paint": {
"title": "$:/core/images/paint",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-paint tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M83.527 76.19C90.43 69.287 91.892 59 87.91 50.665l37.903-37.902c2.919-2.92 2.913-7.659 0-10.572a7.474 7.474 0 00-10.572 0L77.338 40.093c-8.335-3.982-18.622-2.521-25.526 4.383l31.715 31.715zm-2.643 2.644L49.169 47.119S8.506 81.243 0 80.282c0 0 3.782 5.592 6.827 8.039 14.024-5.69 37.326-24.6 37.326-24.6l.661.66S19.45 90.222 9.18 92.047c1.222 1.44 4.354 4.053 6.247 5.776 5.417-1.488 34.733-28.57 34.733-28.57l.661.66-32.407 31.022 5.285 5.286L56.106 75.2l.662.66s-27.864 30.536-28.684 32.432c0 0 6.032 6.853 7.569 7.824.702-2.836 27.884-33.485 27.884-33.485l.661.66s-20.597 23.755-24.964 36.732c3.21 3.549 7.5 5.137 10.926 6.298-2.19-11.817 30.724-47.487 30.724-47.487z\"/></svg>"
},
"$:/core/images/palette": {
"title": "$:/core/images/palette",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-palette tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.247 39.182a93.52 93.52 0 00-16.228-1.4C28.662 37.781 0 57.131 0 81.002c0 9.642 4.676 18.546 12.58 25.735C23.504 91.19 26.34 72.395 36.89 63.562c15.183-12.713 26.538-7.828 26.538-7.828l16.82-16.552zm26.535 9.655c13.049 7.913 21.257 19.392 21.257 32.166 0 9.35.519 17.411-11.874 25.08-10.797 6.681-3.824-6.536-11.844-10.898s-19.946 1.308-18.213 7.906c3.2 12.181 19.422 11.455 6.314 16.658-13.107 5.202-18.202 4.476-28.403 4.476-7.821 0-15.315-.947-22.243-2.68 9.844-4.197 27.88-12.539 33.354-19.456C82.788 92.409 87.37 80 83.324 72.484c-.194-.359 11.215-11.668 23.458-23.647zM1.134 123.867l-.66.002c33.479-14.94 22.161-64.226 58.818-64.226.317 1.418.644 2.944 1.062 4.494-25.907-4.166-23.567 48.031-59.22 59.73zm.713-.007c38.872-.506 78.152-22.347 78.152-44.813-9.27 0-14.073-3.48-16.816-7.942-16.597-7.003-30.365 45.715-61.336 52.755zm65.351-64.008c-4.45 4.115 4.886 16.433 11.318 11.318l45.27-45.27c11.317-11.318 0-22.635-11.318-11.318-11.317 11.318-33.518 34.405-45.27 45.27z\"/></svg>"
},
"$:/core/images/permalink-button": {
"title": "$:/core/images/permalink-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permalink-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M80.483 48l-7.387 32h-25.58l7.388-32h25.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L100.598 32h3.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-7.096l-7.387 32H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H85.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L69.402 96h-25.58L38.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L27.402 96h-3.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h7.096l7.387-32H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h18.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L58.598 32h25.58z\"/></svg>"
},
"$:/core/images/permaview-button": {
"title": "$:/core/images/permaview-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-permaview-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M81.483 48l-1.846 8h-5.58l1.847-8h5.58zm3.694-16l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L101.598 32h2.403c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8h-6.096l-1.847 8h7.944c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H92.364l-1.846 8H104c4.41 0 7.999 3.582 7.999 8 0 4.41-3.581 8-8 8H86.824l-5.624 24.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L70.402 96h-5.58L59.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L48.402 96h-5.58L37.2 120.358c-.993 4.303-5.29 6.996-9.596 6.002-4.296-.992-6.988-5.293-5.994-9.602L26.402 96h-2.403C19.59 96 16 92.418 16 88c0-4.41 3.581-8 8-8h6.096l1.847-8h-7.944C19.59 72 16 68.418 16 64c0-4.41 3.581-8 8-8h11.637l1.846-8H24C19.59 48 16 44.418 16 40c0-4.41 3.581-8 8-8h17.177l5.624-24.358c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L57.598 32h5.58L68.8 7.642c.993-4.303 5.29-6.996 9.596-6.002 4.296.992 6.988 5.293 5.994 9.602L79.598 32h5.58zM53.904 48l-1.847 8h5.58l1.846-8h-5.579zm22.039 24l-1.847 8h-5.58l1.847-8h5.58zm-27.58 0l-1.846 8h5.579l1.847-8h-5.58z\"/></svg>"
},
"$:/core/images/picture": {
"title": "$:/core/images/picture",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-picture tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M112 68.233v-48.23A4.001 4.001 0 00107.997 16H20.003A4.001 4.001 0 0016 20.003v38.31l9.241-14.593c2.8-4.422 9.023-5.008 12.6-1.186l18.247 20.613 13.687-6.407a8 8 0 018.903 1.492 264.97 264.97 0 002.92 2.739 249.44 249.44 0 006.798 6.066 166.5 166.5 0 002.106 1.778c2.108 1.747 3.967 3.188 5.482 4.237.748.518 1.383.92 2.044 1.33.444.117 1.046.144 1.809.05 1.873-.233 4.238-1.144 6.723-2.547a36.016 36.016 0 003.205-2.044c.558-.4.93-.686 1.07-.802.376-.31.765-.577 1.165-.806zM0 8.007A8.01 8.01 0 018.007 0h111.986A8.01 8.01 0 01128 8.007v111.986a8.01 8.01 0 01-8.007 8.007H8.007A8.01 8.01 0 010 119.993V8.007zM95 42a8 8 0 100-16 8 8 0 000 16zM32 76c15.859 4.83 20.035 7.244 20.035 12S32 95.471 32 102.347c0 6.876 1.285 4.99 1.285 9.653H68s-13.685-6.625-13.685-10.8c0-7.665 10.615-8.34 10.615-13.2 0-7.357-14.078-8.833-32.93-12z\"/></svg>"
},
"$:/core/images/plugin-generic-language": {
"title": "$:/core/images/plugin-generic-language",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M61.207 68.137c-4.324 2.795-6.999 6.656-6.999 10.921 0 7.906 9.19 14.424 21.042 15.336 2.162 3.902 8.598 6.785 16.318 7.01-5.126-1.125-9.117-3.742-10.62-7.01C92.805 93.487 102 86.967 102 79.059c0-8.53-10.699-15.445-23.896-15.445-6.599 0-12.572 1.729-16.897 4.524zm12.794-14.158c-4.324 2.795-10.298 4.524-16.897 4.524-2.619 0-5.14-.272-7.497-.775-3.312 2.25-8.383 3.69-14.067 3.69l-.255-.002c4.119-.892 7.511-2.747 9.478-5.13-6.925-2.704-11.555-7.617-11.555-13.228 0-8.53 10.699-15.445 23.896-15.445C70.301 27.613 81 34.528 81 43.058c0 4.265-2.675 8.126-6.999 10.921zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"
},
"$:/core/images/plugin-generic-plugin": {
"title": "$:/core/images/plugin-generic-plugin",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M40.397 76.446V95.34h14.12l-.001-.005a6.912 6.912 0 005.364-11.593l.046-.023a6.912 6.912 0 119.979.526l.086.055a6.914 6.914 0 004.408 10.948l-.023.092h21.32V75.568l-.15.038a6.912 6.912 0 00-11.593-5.364l-.022-.046a6.912 6.912 0 11.526-9.979l.055-.086a6.914 6.914 0 0010.948-4.408c.079.018.158.038.236.059v-15.74h-21.32l.023-.094a6.914 6.914 0 01-4.408-10.947 10.23 10.23 0 00-.086-.055 6.912 6.912 0 10-9.979-.526l-.046.023a6.912 6.912 0 01-5.364 11.593l.001.005h-14.12v12.847A6.912 6.912 0 0129.5 59.843l-.054.086a6.912 6.912 0 10-.526 9.979l.023.046a6.912 6.912 0 0111.455 6.492zM64 0l54.56 32v64L64 128 9.44 96V32L64 0z\"/></svg>"
},
"$:/core/images/plugin-generic-theme": {
"title": "$:/core/images/plugin-generic-theme",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M29.408 91.472L51.469 69.41l-.004-.005a2.22 2.22 0 01.004-3.146c.87-.87 2.281-.872 3.147-.005l9.465 9.464a2.22 2.22 0 01-.005 3.147c-.87.87-2.28.871-3.147.005l-.005-.005-22.061 22.062a6.686 6.686 0 11-9.455-9.455zM60.802 66.38c-2.436-2.704-4.465-5.091-5.817-6.869-6.855-9.014-10.313-4.268-14.226 0-3.913 4.268 1.03 7.726-2.683 10.741-3.713 3.015-3.484 4.06-9.752-1.455-6.267-5.516-6.7-7.034-3.823-10.181 2.877-3.147 5.281 1.808 11.159-3.785 5.877-5.593.94-10.55.94-10.55s12.237-25.014 28.588-23.167c16.351 1.848-6.186-2.392-11.792 17.226-2.4 8.4.447 6.42 4.998 9.968 1.394 1.086 6.03 4.401 11.794 8.685l20.677-20.676 1.615-4.766 7.84-4.689 3.151 3.152-4.688 7.84-4.766 1.615-20.224 20.223c12.663 9.547 28.312 22.146 28.312 26.709 0 7.217-3.071 11.526-9.535 9.164-4.693-1.715-18.768-15.192-28.753-25.897l-2.893 2.893-3.151-3.152 3.029-3.029zM63.953 0l54.56 32v64l-54.56 32-54.56-32V32l54.56-32z\"/></svg>"
},
"$:/core/images/preview-closed": {
"title": "$:/core/images/preview-closed",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-closed tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M.088 64a7.144 7.144 0 001.378 5.458C16.246 88.818 39.17 100.414 64 100.414c24.83 0 47.753-11.596 62.534-30.956A7.144 7.144 0 00127.912 64C110.582 78.416 88.304 87.086 64 87.086 39.696 87.086 17.418 78.416.088 64z\"/><rect width=\"4\" height=\"16\" x=\"62\" y=\"96\" rx=\"4\"/><rect width=\"4\" height=\"16\" x=\"78\" y=\"93\" rx=\"4\" transform=\"rotate(-5 80 101)\"/><rect width=\"4\" height=\"16\" x=\"46\" y=\"93\" rx=\"4\" transform=\"rotate(5 48 101)\"/><rect width=\"4\" height=\"16\" x=\"30\" y=\"88\" rx=\"4\" transform=\"rotate(10 32 96)\"/><rect width=\"4\" height=\"16\" x=\"94\" y=\"88\" rx=\"4\" transform=\"rotate(-10 96 96)\"/><rect width=\"4\" height=\"16\" x=\"110\" y=\"80\" rx=\"4\" transform=\"rotate(-20 112 88)\"/><rect width=\"4\" height=\"16\" x=\"14\" y=\"80\" rx=\"4\" transform=\"rotate(20 16 88)\"/></g></svg>"
},
"$:/core/images/preview-open": {
"title": "$:/core/images/preview-open",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-preview-open tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M64.11 99.588c-24.83 0-47.754-11.596-62.534-30.957a7.148 7.148 0 010-8.675C16.356 40.596 39.28 29 64.11 29c24.83 0 47.753 11.596 62.534 30.956a7.148 7.148 0 010 8.675c-14.78 19.36-37.703 30.957-62.534 30.957zm46.104-32.007c1.44-1.524 1.44-3.638 0-5.162C99.326 50.9 82.439 44 64.147 44S28.968 50.9 18.08 62.42c-1.44 1.523-1.44 3.637 0 5.16C28.968 79.1 45.855 86 64.147 86s35.179-6.9 46.067-18.42z\"/><path d=\"M63.5 88C76.479 88 87 77.479 87 64.5S76.479 41 63.5 41 40 51.521 40 64.5 50.521 88 63.5 88z\"/></g></svg>"
},
"$:/core/images/print-button": {
"title": "$:/core/images/print-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-print-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M112 71V30.5h-.032c-.035-2-.816-3.99-2.343-5.516L86.998 2.357A7.978 7.978 0 0081 .02V0H24a8 8 0 00-8 8v63h8V8h57v14.5c0 4.422 3.582 8 8 8h15V71h8z\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"36\" rx=\"4\"/><rect width=\"64\" height=\"8\" x=\"32\" y=\"52\" rx=\"4\"/><rect width=\"40\" height=\"8\" x=\"32\" y=\"20\" rx=\"4\"/><path d=\"M0 80.005C0 71.165 7.156 64 16 64h96c8.836 0 16 7.155 16 16.005v31.99c0 8.84-7.156 16.005-16 16.005H16c-8.836 0-16-7.155-16-16.005v-31.99zM104 96a8 8 0 100-16 8 8 0 000 16z\"/></g></svg>"
},
"$:/core/images/quote": {
"title": "$:/core/images/quote",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-quote tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M51.219 117.713V62.199H27.427c0-8.891 1.683-16.401 5.047-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.36 3.184-20.728 6.669-6.368 3.484-11.835 7.87-16.401 13.157C9.524 27.113 5.98 33.241 3.456 40.21.933 47.18-.21 54.63.03 62.56v55.153H51.22zm76.781 0V62.199h-23.791c0-8.891 1.682-16.401 5.046-22.53 3.365-6.127 9.613-10.754 18.745-13.878V2c-7.45.961-14.359 3.184-20.727 6.669-6.369 3.484-11.836 7.87-16.402 13.157-4.566 5.287-8.11 11.415-10.634 18.384-2.523 6.97-3.665 14.42-3.424 22.35v55.153H128z\"/></svg>"
},
"$:/core/images/refresh-button": {
"title": "$:/core/images/refresh-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-refresh-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M106.369 39.433c10.16 20.879 6.57 46.764-10.771 64.106-21.87 21.87-57.327 21.87-79.196 0-21.87-21.87-21.87-57.326 0-79.196a8 8 0 1111.314 11.314c-15.621 15.62-15.621 40.947 0 56.568 15.62 15.621 40.947 15.621 56.568 0C97.72 78.79 99.6 58.175 89.924 42.73l-6.44 12.264a8 8 0 11-14.166-7.437L84.435 18.76a8 8 0 0110.838-3.345l28.873 15.345a8 8 0 11-7.51 14.129l-10.267-5.457zm-8.222-12.368c-.167-.19-.336-.38-.506-.57l.96-.296-.454.866z\"/></svg>"
},
"$:/core/images/right-arrow": {
"title": "$:/core/images/right-arrow",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-right-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M99.069 64.173c0 2.027-.77 4.054-2.316 5.6l-55.98 55.98a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l50.382-50.382-50.382-50.382a7.92 7.92 0 010-11.195c3.086-3.085 8.104-3.092 11.196 0l55.98 55.98a7.892 7.892 0 012.316 5.595z\"/></svg>"
},
"$:/core/images/rotate-left": {
"title": "$:/core/images/rotate-left",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-rotate-left tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"32\" height=\"80\" rx=\"8\"/><rect width=\"80\" height=\"32\" x=\"48\" y=\"96\" rx=\"8\"/><path d=\"M61.32 36.65c19.743 2.45 35.023 19.287 35.023 39.693a4 4 0 01-8 0c0-15.663-11.254-28.698-26.117-31.46l3.916 3.916a4 4 0 11-5.657 5.657L49.172 43.142a4 4 0 010-5.657l11.313-11.313a4 4 0 115.657 5.656l-4.821 4.822z\"/></g></svg>"
},
"$:/core/images/save-button": {
"title": "$:/core/images/save-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-save-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M120.783 34.33c4.641 8.862 7.266 18.948 7.266 29.646 0 35.347-28.653 64-64 64-35.346 0-64-28.653-64-64 0-35.346 28.654-64 64-64 18.808 0 35.72 8.113 47.43 21.03l2.68-2.68c3.13-3.13 8.197-3.132 11.321-.008 3.118 3.118 3.121 8.193-.007 11.32l-4.69 4.691zm-12.058 12.058a47.876 47.876 0 013.324 17.588c0 26.51-21.49 48-48 48s-48-21.49-48-48 21.49-48 48-48c14.39 0 27.3 6.332 36.098 16.362L58.941 73.544 41.976 56.578c-3.127-3.127-8.201-3.123-11.32-.005-3.123 3.124-3.119 8.194.006 11.319l22.617 22.617a7.992 7.992 0 005.659 2.347c2.05 0 4.101-.783 5.667-2.349l44.12-44.12z\"/></svg>"
},
"$:/core/images/size": {
"title": "$:/core/images/size",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-size tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M92.343 26l-9.171 9.172a4 4 0 105.656 5.656l16-16a4 4 0 000-5.656l-16-16a4 4 0 10-5.656 5.656L92.343 18H22a4 4 0 00-4 4v70.343l-9.172-9.171a4 4 0 10-5.656 5.656l16 16a4 4 0 005.656 0l16-16a4 4 0 10-5.656-5.656L26 92.343V22l-4 4h70.343zM112 52v64l4-4H52a4 4 0 100 8h64a4 4 0 004-4V52a4 4 0 10-8 0z\"/></svg>"
},
"$:/core/images/spiral": {
"title": "$:/core/images/spiral",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-spiral tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M64.534 68.348c3.39 0 6.097-2.62 6.476-5.968l-4.755-.538 4.75.583c.377-3.07-1.194-6.054-3.89-7.78-2.757-1.773-6.34-2.01-9.566-.7-3.46 1.403-6.14 4.392-7.35 8.148l-.01.026c-1.3 4.08-.72 8.64 1.58 12.52 2.5 4.2 6.77 7.2 11.76 8.27 5.37 1.15 11.11-.05 15.83-3.31 5.04-3.51 8.46-9.02 9.45-15.3 1.05-6.7-.72-13.63-4.92-19.19l.02.02c-4.42-5.93-11.2-9.82-18.78-10.78-7.96-1.01-16.13 1.31-22.59 6.43-6.81 5.39-11.18 13.41-12.11 22.26-.98 9.27 1.87 18.65 7.93 26.02 6.32 7.69 15.6 12.56 25.74 13.48 10.54.96 21.15-2.42 29.45-9.4l.01-.01c8.58-7.25 13.94-17.78 14.86-29.21.94-11.84-2.96-23.69-10.86-32.9-8.19-9.5-19.95-15.36-32.69-16.27-13.16-.94-26.24 3.49-36.34 12.34l.01-.01c-10.41 9.08-16.78 22.1-17.68 36.15-.93 14.44 4.03 28.77 13.79 39.78 10.03 11.32 24.28 18.2 39.6 19.09 15.73.92 31.31-4.56 43.24-15.234 12.23-10.954 19.61-26.44 20.5-43.074a4.785 4.785 0 00-4.52-5.03 4.778 4.778 0 00-5.03 4.52c-.75 14.1-7 27.2-17.33 36.45-10.03 8.98-23.11 13.58-36.3 12.81-12.79-.75-24.67-6.48-33-15.89-8.07-9.11-12.17-20.94-11.41-32.827.74-11.52 5.942-22.15 14.43-29.54l.01-.01c8.18-7.17 18.74-10.75 29.35-9.998 10.21.726 19.6 5.41 26.11 12.96 6.24 7.273 9.32 16.61 8.573 25.894-.718 8.9-4.88 17.064-11.504 22.66l.01-.007c-6.36 5.342-14.44 7.92-22.425 7.19-7.604-.68-14.52-4.314-19.21-10.027-4.44-5.4-6.517-12.23-5.806-18.94.67-6.3 3.76-11.977 8.54-15.766 4.46-3.54 10.05-5.128 15.44-4.44 5.03.63 9.46 3.18 12.32 7.01l.02.024c2.65 3.5 3.75 7.814 3.1 11.92-.59 3.71-2.58 6.925-5.45 8.924-2.56 1.767-5.61 2.403-8.38 1.81-2.42-.516-4.42-1.92-5.53-3.79-.93-1.56-1.15-3.3-.69-4.75l-4.56-1.446L59.325 65c.36-1.12 1.068-1.905 1.84-2.22.25-.103.48-.14.668-.13.06.006.11.015.14.025.01 0 .01 0-.01-.01a1.047 1.047 0 01-.264-.332c-.15-.29-.23-.678-.18-1.11l-.005.04c.15-1.332 1.38-2.523 3.035-2.523-2.65 0-4.79 2.144-4.79 4.787s2.14 4.785 4.78 4.785z\"/></svg>"
},
"$:/core/images/stamp": {
"title": "$:/core/images/stamp",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-stamp tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M49.733 64H16.01C11.584 64 8 67.583 8 72.003V97h112V72.003A8 8 0 00111.99 64H78.267A22.813 22.813 0 0175.5 53.077c0-6.475 2.687-12.324 7.009-16.497A22.818 22.818 0 0087 22.952C87 10.276 76.703 0 64 0S41 10.276 41 22.952c0 5.103 1.669 9.817 4.491 13.628 4.322 4.173 7.009 10.022 7.009 16.497 0 3.954-1.002 7.675-2.767 10.923zM8 104h112v8H8v-8z\"/></svg>"
},
"$:/core/images/star-filled": {
"title": "$:/core/images/star-filled",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-star-filled tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M61.836 96.823l37.327 27.287c2.72 1.99 6.379-.69 5.343-3.912L90.29 75.988l-1.26 3.91 37.285-27.345c2.718-1.993 1.32-6.327-2.041-6.33l-46.113-.036 3.3 2.416L67.176 4.416c-1.04-3.221-5.563-3.221-6.604 0L46.29 48.603l3.3-2.416-46.113.036c-3.362.003-4.759 4.337-2.04 6.33L38.72 79.898l-1.26-3.91-14.216 44.21c-1.036 3.223 2.622 5.901 5.343 3.912l37.326-27.287h-4.078z\"/></svg>"
},
"$:/core/images/storyview-classic": {
"title": "$:/core/images/storyview-classic",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-classic tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm0 48C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0 32C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
},
"$:/core/images/storyview-pop": {
"title": "$:/core/images/storyview-pop",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-pop tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16C19.581 16 16 19.578 16 23.992v16.016C16 44.422 19.588 48 24 48h80c4.419 0 8-3.578 8-7.992V23.992c0-4.414-3.588-7.992-8-7.992H24zm-7.99 40C11.587 56 8 59.578 8 63.992v16.016C8 84.422 11.584 88 16.01 88h95.98c4.424 0 8.01-3.578 8.01-7.992V63.992c0-4.414-3.584-7.992-8.01-7.992H16.01zM24 96C19.581 96 16 99.59 16 104c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24zm0-32C19.581 64 16 67.59 16 72c0 4.418 3.588 8 8 8h80c4.419 0 8-3.59 8-8 0-4.418-3.588-8-8-8H24z\"/></svg>"
},
"$:/core/images/storyview-zoomin": {
"title": "$:/core/images/storyview-zoomin",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-storyview-zoomin tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M8.007 0A8.01 8.01 0 000 8.007v111.986A8.01 8.01 0 008.007 128h111.986a8.01 8.01 0 008.007-8.007V8.007A8.01 8.01 0 00119.993 0H8.007zm15.992 16A8 8 0 0016 24.009V71.99C16 76.414 19.588 80 24 80h80a8 8 0 008-8.009V24.01c0-4.423-3.588-8.009-8-8.009H24z\"/></svg>"
},
"$:/core/images/strikethrough": {
"title": "$:/core/images/strikethrough",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-strikethrough tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M92.794 38.726h15.422c-.229-6.74-1.514-12.538-3.856-17.393-2.342-4.855-5.54-8.881-9.596-12.08-4.055-3.199-8.767-5.54-14.136-7.025C75.258.743 69.433 0 63.15 0a62.76 62.76 0 00-16.364 2.142C41.474 3.57 36.733 5.74 32.564 8.653c-4.17 2.913-7.511 6.626-10.025 11.138-2.513 4.512-3.77 9.853-3.77 16.022 0 5.597 1.115 10.252 3.342 13.965 2.228 3.712 5.198 6.74 8.91 9.081 3.713 2.342 7.911 4.227 12.595 5.655a194.641 194.641 0 0014.308 3.77c4.855 1.085 9.624 2.142 14.308 3.17 4.683 1.028 8.881 2.37 12.594 4.027 3.713 1.656 6.683 3.798 8.91 6.425 2.228 2.628 3.342 6.055 3.342 10.281 0 4.456-.914 8.111-2.742 10.967a19.953 19.953 0 01-7.197 6.768c-2.97 1.657-6.311 2.828-10.024 3.513a60.771 60.771 0 01-11.052 1.028c-4.57 0-9.025-.571-13.366-1.713-4.34-1.143-8.139-2.913-11.394-5.312-3.256-2.4-5.884-5.455-7.883-9.168-1.999-3.712-2.998-8.139-2.998-13.28H15c0 7.426 1.342 13.852 4.027 19.278 2.684 5.426 6.34 9.881 10.966 13.365 4.627 3.484 9.996 6.083 16.107 7.797 6.112 1.713 12.595 2.57 19.449 2.57 5.597 0 11.223-.657 16.878-1.97 5.655-1.314 10.767-3.428 15.336-6.34 4.57-2.914 8.31-6.683 11.224-11.31 2.913-4.626 4.37-10.195 4.37-16.707 0-6.054-1.115-11.08-3.342-15.079-2.228-3.998-5.198-7.31-8.91-9.938-3.713-2.627-7.911-4.712-12.595-6.254a170.83 170.83 0 00-14.308-4.027 549.669 549.669 0 00-14.308-3.17c-4.683-.971-8.881-2.2-12.594-3.684-3.713-1.485-6.683-3.399-8.91-5.74-2.228-2.342-3.342-5.398-3.342-9.168 0-3.998.771-7.34 2.313-10.024 1.543-2.685 3.599-4.826 6.17-6.426 2.57-1.599 5.51-2.741 8.824-3.427a49.767 49.767 0 0110.11-1.028c8.453 0 15.393 1.97 20.819 5.912 5.426 3.94 8.596 10.31 9.51 19.106z\"/><path d=\"M5 54h118v16H5z\"/></g></svg>"
},
"$:/core/images/subscript": {
"title": "$:/core/images/subscript",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-subscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 128.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
},
"$:/core/images/superscript": {
"title": "$:/core/images/superscript",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-superscript tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M2.272 16h19.91l21.649 33.675L66.414 16h18.708L53.585 61.969l33.809 49.443H67.082L43.296 74.93l-24.187 36.48H0L33.808 61.97 2.272 16zM127.91 63.412H85.328c.059-5.168 1.306-9.681 3.741-13.542 2.435-3.86 5.761-7.216 9.978-10.066a112.388 112.388 0 016.325-4.321 50.09 50.09 0 006.058-4.499c1.841-1.603 3.356-3.34 4.543-5.211 1.188-1.871 1.812-4.024 1.871-6.46 0-1.128-.133-2.33-.4-3.607a9.545 9.545 0 00-1.56-3.564c-.772-1.098-1.84-2.019-3.207-2.761-1.366-.743-3.148-1.114-5.345-1.114-2.02 0-3.697.4-5.033 1.203-1.337.801-2.406 1.9-3.208 3.296-.801 1.396-1.395 3.044-1.781 4.944-.386 1.9-.609 3.95-.668 6.147H86.486c0-3.445.46-6.637 1.38-9.577.921-2.94 2.302-5.478 4.143-7.617 1.841-2.138 4.083-3.815 6.726-5.033 2.643-1.217 5.716-1.826 9.22-1.826 3.802 0 6.979.623 9.533 1.87 2.554 1.248 4.617 2.822 6.191 4.722 1.574 1.9 2.688 3.965 3.341 6.192.653 2.227.98 4.35.98 6.37 0 2.494-.386 4.75-1.158 6.77a21.803 21.803 0 01-3.118 5.568 31.516 31.516 0 01-4.454 4.677 66.788 66.788 0 01-5.167 4.009 139.198 139.198 0 01-5.346 3.563 79.237 79.237 0 00-4.944 3.386c-1.514 1.128-2.836 2.3-3.964 3.518-1.129 1.218-1.9 2.51-2.317 3.876h30.379v9.087z\"/></svg>"
},
"$:/core/images/tag-button": {
"title": "$:/core/images/tag-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tag-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M18.164 47.66l.004 4.105c.003 3.823 2.19 9.097 4.885 11.792l61.85 61.85c2.697 2.697 7.068 2.69 9.769-.01L125.767 94.3a6.903 6.903 0 00.01-9.77L63.928 22.683c-2.697-2.697-7.976-4.88-11.796-4.881l-27.076-.007a6.902 6.902 0 00-6.91 6.91l.008 9.96.287.033c3.73.411 8.489-.044 13.365-1.153a9.702 9.702 0 0111.14-3.662l.291-.13.128.285a9.7 9.7 0 013.3 2.17c3.796 3.796 3.801 9.945.012 13.734-3.618 3.618-9.386 3.777-13.204.482-5.365 1.122-10.674 1.596-15.309 1.237z\"/><path d=\"M47.633 39.532l.023.051c-9.689 4.356-21.584 6.799-30.396 5.828C5.273 44.089-1.028 36.43 2.443 24.078 5.562 12.976 14.3 4.361 24.047 1.548c10.68-3.083 19.749 1.968 19.749 13.225h-8.623c0-4.859-3.078-6.573-8.735-4.94-6.91 1.995-13.392 8.383-15.694 16.577-1.915 6.818.417 9.653 7.46 10.43 7.126.785 17.531-1.352 25.917-5.121l.027.06.036-.017c1.76-.758 6.266 6.549 3.524 7.74a2.8 2.8 0 01-.075.03z\"/></g></svg>"
},
"$:/core/images/theme-button": {
"title": "$:/core/images/theme-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-theme-button tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M55.854 66.945a122.626 122.626 0 01-3.9-4.819c-11.064-14.548-16.645-6.888-22.96 0-6.315 6.888 1.664 12.47-4.33 17.335-5.993 4.866-5.623 6.552-15.737-2.35-10.115-8.9-10.815-11.351-6.172-16.43 4.644-5.08 8.524 2.918 18.01-6.108 9.485-9.026 1.517-17.026 1.517-17.026S42.03-2.824 68.42.157c26.39 2.982-9.984-3.86-19.031 27.801-3.874 13.556.72 10.362 8.066 16.087 1.707 1.33 6.428 4.732 12.671 9.318-6.129 5.879-11.157 10.669-14.273 13.582zm11.641 12.947c16.013 17.036 37.742 37.726 45.117 40.42 10.432 3.813 15.388-3.141 15.388-14.79 0-7.151-23.83-26.542-43.924-41.769-7.408 7.156-13.376 12.953-16.58 16.139z\"/><path d=\"M11.069 109.828L46.31 74.587a3.56 3.56 0 115.037-5.032l15.098 15.098a3.56 3.56 0 11-5.032 5.037l-35.24 35.241c-4.171 4.17-10.933 4.17-15.104 0-4.17-4.17-4.17-10.933 0-15.103zM124.344 6.622l5.034 5.034-7.49 12.524-7.613 2.58L61.413 79.62l-5.034-5.034 52.861-52.862 2.58-7.614 12.524-7.49z\"/></g></svg>"
},
"$:/core/images/timestamp-off": {
"title": "$:/core/images/timestamp-off",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-off tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M58.25 35.88c-18.777 0-33.998 15.224-33.998 33.998 0 18.773 15.22 34.002 33.998 34.002 18.784 0 34.002-15.23 34.002-34.002 0-18.774-15.218-33.998-34.002-33.998zm-3.03 50.123H44.196v-34H55.22v34zm16.976 0H61.17v-34h11.025v34z\"/></g></svg>"
},
"$:/core/images/timestamp-on": {
"title": "$:/core/images/timestamp-on",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-timestamp-on tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><path d=\"M58.25 11C26.08 11 0 37.082 0 69.25s26.08 58.25 58.25 58.25c32.175 0 58.25-26.082 58.25-58.25S90.425 11 58.25 11zm0 100.5C34.914 111.5 16 92.586 16 69.25 16 45.92 34.914 27 58.25 27s42.25 18.92 42.25 42.25c0 23.336-18.914 42.25-42.25 42.25zM49.704 10a5 5 0 010-10H66.69a5 5 0 015 5c.006 2.757-2.238 5-5 5H49.705z\"/><path d=\"M13.41 27.178a5.005 5.005 0 01-7.045-.613 5.008 5.008 0 01.616-7.047l9.95-8.348a5 5 0 016.429 7.661l-9.95 8.348zm89.573 0a5.005 5.005 0 007.045-.613 5.008 5.008 0 00-.616-7.047l-9.95-8.348a5 5 0 00-6.428 7.661l9.95 8.348zM65.097 71.072c0 3.826-3.09 6.928-6.897 6.928-3.804.006-6.9-3.102-6.903-6.928 0 0 4.76-39.072 6.903-39.072s6.897 39.072 6.897 39.072z\"/></g></svg>"
},
"$:/core/images/tip": {
"title": "$:/core/images/tip",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-tip tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 128.242c35.346 0 64-28.654 64-64 0-35.346-28.654-64-64-64-35.346 0-64 28.654-64 64 0 35.346 28.654 64 64 64zm11.936-36.789c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349C54.33 94.05 58.824 95.82 64 95.82c5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.456c-.624 4.129-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zm0 4.492c-.624 4.13-5.73 7.349-11.936 7.349-6.206 0-11.312-3.22-11.936-7.349 2.266 2.597 6.76 4.366 11.936 4.366 5.175 0 9.67-1.769 11.936-4.366zM64.3 24.242c11.618 0 23.699 7.82 23.699 24.2S75.92 71.754 75.92 83.576c0 5.873-5.868 9.26-11.92 9.26s-12.027-3.006-12.027-9.26C51.973 71.147 40 65.47 40 48.442s12.683-24.2 24.301-24.2z\"/></svg>"
},
"$:/core/images/transcludify": {
"title": "$:/core/images/transcludify",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-transcludify-button tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M0 59.482c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.651-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02C1.36 67.377.591 67.288 0 67.288v-7.806zm24.66 0c.591 0 1.36-.089 2.306-.266a10.417 10.417 0 002.75-.932 6.762 6.762 0 002.306-1.907c.65-.828.976-1.863.976-3.104V35.709c0-2.01.414-3.74 1.242-5.19.828-1.448 1.833-2.66 3.016-3.636s2.425-1.7 3.726-2.173c1.3-.473 2.424-.71 3.37-.71h8.073v7.451h-4.88c-1.241 0-2.232.207-2.97.621-.74.414-1.302.932-1.686 1.552a4.909 4.909 0 00-.71 1.996c-.089.71-.133 1.39-.133 2.04v16.677c0 1.715-.325 3.134-.976 4.258-.65 1.123-1.434 2.025-2.35 2.705-.917.68-1.863 1.168-2.839 1.464-.976.296-1.818.473-2.528.532v.178c.71.059 1.552.207 2.528.443.976.237 1.922.68 2.839 1.33.916.651 1.7 1.583 2.35 2.795.65 1.212.976 2.853.976 4.923v16.144c0 .65.044 1.33.133 2.04.089.71.325 1.375.71 1.996.384.621.946 1.139 1.685 1.553.74.414 1.73.62 2.972.62h4.879v7.452h-8.073c-.946 0-2.07-.237-3.37-.71-1.301-.473-2.543-1.197-3.726-2.173-1.183-.976-2.188-2.188-3.016-3.637-.828-1.449-1.242-3.179-1.242-5.19V74.119c0-1.42-.325-2.572-.976-3.46-.65-.886-1.419-1.581-2.306-2.084a8.868 8.868 0 00-2.75-1.02c-.946-.177-1.715-.266-2.306-.266v-7.806zm43.965-3.538L80.6 52.041l2.306 7.097-12.063 3.903 7.628 10.378-6.12 4.435-7.63-10.467-7.45 10.201-5.943-4.524 7.628-10.023-12.152-4.17 2.306-7.096 12.064 4.17V43.347h7.451v12.596zm34.425 11.344c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806zm24.66 0c-.65 0-1.449.089-2.395.266-.946.177-1.863.488-2.75.931a6.356 6.356 0 00-2.262 1.908c-.62.828-.931 1.862-.931 3.104v17.564c0 2.01-.414 3.74-1.242 5.189-.828 1.449-1.833 2.661-3.016 3.637s-2.425 1.7-3.726 2.173c-1.3.473-2.424.71-3.37.71h-8.073v-7.451h4.88c1.241 0 2.232-.207 2.97-.621.74-.414 1.302-.932 1.686-1.553a4.9 4.9 0 00.71-1.995c.089-.71.133-1.39.133-2.04V72.432c0-1.715.325-3.134.976-4.258.65-1.124 1.434-2.01 2.35-2.661.917-.65 1.863-1.124 2.839-1.42.976-.295 1.818-.502 2.528-.62v-.178c-.71-.059-1.552-.207-2.528-.443-.976-.237-1.922-.68-2.839-1.33-.916-.651-1.7-1.583-2.35-2.795-.65-1.212-.976-2.853-.976-4.923V37.66c0-.651-.044-1.331-.133-2.04a4.909 4.909 0 00-.71-1.997c-.384-.62-.946-1.138-1.685-1.552-.74-.414-1.73-.62-2.972-.62h-4.879V24h8.073c.946 0 2.07.237 3.37.71 1.301.473 2.543 1.197 3.726 2.173 1.183.976 2.188 2.188 3.016 3.637.828 1.449 1.242 3.178 1.242 5.189v16.943c0 1.419.31 2.572.931 3.46a6.897 6.897 0 002.262 2.084 8.868 8.868 0 002.75 1.02c.946.177 1.745.266 2.395.266v7.806z\"/></svg>"
},
"$:/core/images/twitter": {
"title": "$:/core/images/twitter",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-twitter tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M41.626 115.803A73.376 73.376 0 012 104.235c2.022.238 4.08.36 6.166.36 12.111 0 23.258-4.117 32.105-11.023-11.312-.208-20.859-7.653-24.148-17.883a25.98 25.98 0 0011.674-.441C15.971 72.881 7.061 62.474 7.061 49.997c0-.108 0-.216.002-.323a25.824 25.824 0 0011.709 3.22c-6.936-4.617-11.5-12.5-11.5-21.433 0-4.719 1.274-9.142 3.5-12.945 12.75 15.579 31.797 25.83 53.281 26.904-.44-1.884-.67-3.85-.67-5.868 0-14.22 11.575-25.75 25.852-25.75a25.865 25.865 0 0118.869 8.132 51.892 51.892 0 0016.415-6.248c-1.93 6.012-6.029 11.059-11.366 14.246A51.844 51.844 0 00128 25.878a52.428 52.428 0 01-12.9 13.33c.05 1.104.075 2.214.075 3.33 0 34.028-26 73.265-73.549 73.265\"/></svg>"
},
"$:/core/images/underline": {
"title": "$:/core/images/underline",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-underline tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M7 117.421h114.248V128H7v-10.579zm97.871-18.525V0h-16.26v55.856c0 4.463-.605 8.576-1.816 12.338-1.212 3.762-3.03 7.046-5.452 9.851-2.423 2.806-5.452 4.974-9.086 6.504-3.635 1.53-7.939 2.296-12.912 2.296-6.25 0-11.159-1.786-14.73-5.356-3.57-3.571-5.356-8.417-5.356-14.538V0H23v65.038c0 5.356.542 10.234 1.626 14.633 1.084 4.4 2.965 8.194 5.643 11.382 2.678 3.188 6.185 5.643 10.52 7.365 4.337 1.721 9.756 2.582 16.26 2.582 7.27 0 13.582-1.435 18.938-4.304 5.356-2.87 9.755-7.365 13.199-13.486h.382v15.686h15.303z\"/></svg>"
},
"$:/core/images/unfold-all-button": {
"title": "$:/core/images/unfold-all-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold-all tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><rect width=\"128\" height=\"16\" y=\"64\" rx=\"8\"/><path d=\"M63.945 60.624c-2.05 0-4.101-.78-5.666-2.345L35.662 35.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 41.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 58.279a7.986 7.986 0 01-5.663 2.346zM64.004 124.565c-2.05 0-4.102-.78-5.666-2.345L35.721 99.603c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 105.255l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.662 122.22a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
},
"$:/core/images/unfold-button": {
"title": "$:/core/images/unfold-button",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unfold tc-image-button\" viewBox=\"0 0 128 128\"><g fill-rule=\"evenodd\"><rect width=\"128\" height=\"16\" rx=\"8\"/><path d=\"M63.945 63.624c-2.05 0-4.101-.78-5.666-2.345L35.662 38.662c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.192-3.122 11.319.005L63.94 44.314l16.966-16.966c3.124-3.124 8.194-3.129 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319L69.603 61.279a7.986 7.986 0 01-5.663 2.346zM64.004 105.682c-2.05.001-4.102-.78-5.666-2.344L35.721 80.721c-3.125-3.125-3.13-8.195-.005-11.319 3.118-3.118 8.191-3.122 11.318.005L64 86.373l16.966-16.966c3.124-3.125 8.194-3.13 11.318-.005 3.118 3.118 3.122 8.192-.005 11.319l-22.617 22.617a7.986 7.986 0 01-5.663 2.346z\"/></g></svg>"
},
"$:/core/images/unlocked-padlock": {
"title": "$:/core/images/unlocked-padlock",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-unlocked-padlock tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M48.627 64H105v32.01C105 113.674 90.674 128 73.001 128H56C38.318 128 24 113.677 24 96.01V64h6.136c-10.455-12.651-27.364-35.788-4.3-55.142 24.636-20.672 45.835 4.353 55.777 16.201 9.943 11.85-2.676 22.437-12.457 9.892-9.78-12.545-21.167-24.146-33.207-14.043-12.041 10.104-1.757 22.36 8.813 34.958 2.467 2.94 3.641 5.732 3.865 8.134zm19.105 28.364A8.503 8.503 0 0064.5 76a8.5 8.5 0 00-3.498 16.25l-5.095 22.77H72.8l-5.07-22.656z\"/></svg>"
},
"$:/core/images/up-arrow": {
"title": "$:/core/images/up-arrow",
"created": "20150316000544368",
"modified": "20150316000831867",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-up-arrow tc-image-button\" viewBox=\"0 0 128 128\"><path d=\"M63.892.281c2.027 0 4.054.77 5.6 2.316l55.98 55.98a7.92 7.92 0 010 11.196c-3.086 3.085-8.104 3.092-11.196 0L63.894 19.393 13.513 69.774a7.92 7.92 0 01-11.196 0c-3.085-3.086-3.092-8.105 0-11.196l55.98-55.98A7.892 7.892 0 0163.893.28z\"/></svg>"
},
"$:/core/images/video": {
"title": "$:/core/images/video",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-video tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M64 12c-34.91 0-55.273 2.917-58.182 5.833C2.91 20.75 0 41.167 0 64.5c0 23.333 2.91 43.75 5.818 46.667C8.728 114.083 29.091 117 64 117c34.91 0 55.273-2.917 58.182-5.833C125.09 108.25 128 87.833 128 64.5c0-23.333-2.91-43.75-5.818-46.667C119.272 14.917 98.909 12 64 12zm-9.084 32.618c-3.813-2.542-6.905-.879-6.905 3.698v31.368c0 4.585 3.099 6.235 6.905 3.698l22.168-14.779c3.813-2.542 3.806-6.669 0-9.206L54.916 44.618z\"/></svg>"
},
"$:/core/images/warning": {
"title": "$:/core/images/warning",
"tags": "$:/tags/Image",
"text": "<svg width=\"22pt\" height=\"22pt\" class=\"tc-image-warning tc-image-button\" viewBox=\"0 0 128 128\"><path fill-rule=\"evenodd\" d=\"M57.072 11c3.079-5.333 10.777-5.333 13.856 0l55.426 96c3.079 5.333-.77 12-6.928 12H8.574c-6.158 0-10.007-6.667-6.928-12l55.426-96zM64 37c-4.418 0-8 3.582-8 7.994v28.012C56 77.421 59.59 81 64 81c4.418 0 8-3.582 8-7.994V44.994C72 40.579 68.41 37 64 37zm0 67a8 8 0 100-16 8 8 0 000 16z\"/></svg>"
},
"$:/language/Buttons/AdvancedSearch/Caption": {
"title": "$:/language/Buttons/AdvancedSearch/Caption",
"text": "advanced search"
},
"$:/language/Buttons/AdvancedSearch/Hint": {
"title": "$:/language/Buttons/AdvancedSearch/Hint",
"text": "Advanced search"
},
"$:/language/Buttons/Cancel/Caption": {
"title": "$:/language/Buttons/Cancel/Caption",
"text": "cancel"
},
"$:/language/Buttons/Cancel/Hint": {
"title": "$:/language/Buttons/Cancel/Hint",
"text": "Discard changes to this tiddler"
},
"$:/language/Buttons/Clone/Caption": {
"title": "$:/language/Buttons/Clone/Caption",
"text": "clone"
},
"$:/language/Buttons/Clone/Hint": {
"title": "$:/language/Buttons/Clone/Hint",
"text": "Clone this tiddler"
},
"$:/language/Buttons/Close/Caption": {
"title": "$:/language/Buttons/Close/Caption",
"text": "close"
},
"$:/language/Buttons/Close/Hint": {
"title": "$:/language/Buttons/Close/Hint",
"text": "Close this tiddler"
},
"$:/language/Buttons/CloseAll/Caption": {
"title": "$:/language/Buttons/CloseAll/Caption",
"text": "close all"
},
"$:/language/Buttons/CloseAll/Hint": {
"title": "$:/language/Buttons/CloseAll/Hint",
"text": "Close all tiddlers"
},
"$:/language/Buttons/CloseOthers/Caption": {
"title": "$:/language/Buttons/CloseOthers/Caption",
"text": "close others"
},
"$:/language/Buttons/CloseOthers/Hint": {
"title": "$:/language/Buttons/CloseOthers/Hint",
"text": "Close other tiddlers"
},
"$:/language/Buttons/ControlPanel/Caption": {
"title": "$:/language/Buttons/ControlPanel/Caption",
"text": "control panel"
},
"$:/language/Buttons/ControlPanel/Hint": {
"title": "$:/language/Buttons/ControlPanel/Hint",
"text": "Open control panel"
},
"$:/language/Buttons/CopyToClipboard/Caption": {
"title": "$:/language/Buttons/CopyToClipboard/Caption",
"text": "copy to clipboard"
},
"$:/language/Buttons/CopyToClipboard/Hint": {
"title": "$:/language/Buttons/CopyToClipboard/Hint",
"text": "Copy this text to the clipboard"
},
"$:/language/Buttons/Delete/Caption": {
"title": "$:/language/Buttons/Delete/Caption",
"text": "delete"
},
"$:/language/Buttons/Delete/Hint": {
"title": "$:/language/Buttons/Delete/Hint",
"text": "Delete this tiddler"
},
"$:/language/Buttons/Edit/Caption": {
"title": "$:/language/Buttons/Edit/Caption",
"text": "edit"
},
"$:/language/Buttons/Edit/Hint": {
"title": "$:/language/Buttons/Edit/Hint",
"text": "Edit this tiddler"
},
"$:/language/Buttons/Encryption/Caption": {
"title": "$:/language/Buttons/Encryption/Caption",
"text": "encryption"
},
"$:/language/Buttons/Encryption/Hint": {
"title": "$:/language/Buttons/Encryption/Hint",
"text": "Set or clear a password for saving this wiki"
},
"$:/language/Buttons/Encryption/ClearPassword/Caption": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Caption",
"text": "clear password"
},
"$:/language/Buttons/Encryption/ClearPassword/Hint": {
"title": "$:/language/Buttons/Encryption/ClearPassword/Hint",
"text": "Clear the password and save this wiki without encryption"
},
"$:/language/Buttons/Encryption/SetPassword/Caption": {
"title": "$:/language/Buttons/Encryption/SetPassword/Caption",
"text": "set password"
},
"$:/language/Buttons/Encryption/SetPassword/Hint": {
"title": "$:/language/Buttons/Encryption/SetPassword/Hint",
"text": "Set a password for saving this wiki with encryption"
},
"$:/language/Buttons/ExportPage/Caption": {
"title": "$:/language/Buttons/ExportPage/Caption",
"text": "export all"
},
"$:/language/Buttons/ExportPage/Hint": {
"title": "$:/language/Buttons/ExportPage/Hint",
"text": "Export all tiddlers"
},
"$:/language/Buttons/ExportTiddler/Caption": {
"title": "$:/language/Buttons/ExportTiddler/Caption",
"text": "export tiddler"
},
"$:/language/Buttons/ExportTiddler/Hint": {
"title": "$:/language/Buttons/ExportTiddler/Hint",
"text": "Export tiddler"
},
"$:/language/Buttons/ExportTiddlers/Caption": {
"title": "$:/language/Buttons/ExportTiddlers/Caption",
"text": "export tiddlers"
},
"$:/language/Buttons/ExportTiddlers/Hint": {
"title": "$:/language/Buttons/ExportTiddlers/Hint",
"text": "Export tiddlers"
},
"$:/language/Buttons/SidebarSearch/Hint": {
"title": "$:/language/Buttons/SidebarSearch/Hint",
"text": "Select the sidebar search field"
},
"$:/language/Buttons/Fold/Caption": {
"title": "$:/language/Buttons/Fold/Caption",
"text": "fold tiddler"
},
"$:/language/Buttons/Fold/Hint": {
"title": "$:/language/Buttons/Fold/Hint",
"text": "Fold the body of this tiddler"
},
"$:/language/Buttons/Fold/FoldBar/Caption": {
"title": "$:/language/Buttons/Fold/FoldBar/Caption",
"text": "fold-bar"
},
"$:/language/Buttons/Fold/FoldBar/Hint": {
"title": "$:/language/Buttons/Fold/FoldBar/Hint",
"text": "Optional bars to fold and unfold tiddlers"
},
"$:/language/Buttons/Unfold/Caption": {
"title": "$:/language/Buttons/Unfold/Caption",
"text": "unfold tiddler"
},
"$:/language/Buttons/Unfold/Hint": {
"title": "$:/language/Buttons/Unfold/Hint",
"text": "Unfold the body of this tiddler"
},
"$:/language/Buttons/FoldOthers/Caption": {
"title": "$:/language/Buttons/FoldOthers/Caption",
"text": "fold other tiddlers"
},
"$:/language/Buttons/FoldOthers/Hint": {
"title": "$:/language/Buttons/FoldOthers/Hint",
"text": "Fold the bodies of other opened tiddlers"
},
"$:/language/Buttons/FoldAll/Caption": {
"title": "$:/language/Buttons/FoldAll/Caption",
"text": "fold all tiddlers"
},
"$:/language/Buttons/FoldAll/Hint": {
"title": "$:/language/Buttons/FoldAll/Hint",
"text": "Fold the bodies of all opened tiddlers"
},
"$:/language/Buttons/UnfoldAll/Caption": {
"title": "$:/language/Buttons/UnfoldAll/Caption",
"text": "unfold all tiddlers"
},
"$:/language/Buttons/UnfoldAll/Hint": {
"title": "$:/language/Buttons/UnfoldAll/Hint",
"text": "Unfold the bodies of all opened tiddlers"
},
"$:/language/Buttons/FullScreen/Caption": {
"title": "$:/language/Buttons/FullScreen/Caption",
"text": "full-screen"
},
"$:/language/Buttons/FullScreen/Hint": {
"title": "$:/language/Buttons/FullScreen/Hint",
"text": "Enter or leave full-screen mode"
},
"$:/language/Buttons/Help/Caption": {
"title": "$:/language/Buttons/Help/Caption",
"text": "help"
},
"$:/language/Buttons/Help/Hint": {
"title": "$:/language/Buttons/Help/Hint",
"text": "Show help panel"
},
"$:/language/Buttons/Import/Caption": {
"title": "$:/language/Buttons/Import/Caption",
"text": "import"
},
"$:/language/Buttons/Import/Hint": {
"title": "$:/language/Buttons/Import/Hint",
"text": "Import many types of file including text, image, TiddlyWiki or JSON"
},
"$:/language/Buttons/Info/Caption": {
"title": "$:/language/Buttons/Info/Caption",
"text": "info"
},
"$:/language/Buttons/Info/Hint": {
"title": "$:/language/Buttons/Info/Hint",
"text": "Show information for this tiddler"
},
"$:/language/Buttons/Home/Caption": {
"title": "$:/language/Buttons/Home/Caption",
"text": "home"
},
"$:/language/Buttons/Home/Hint": {
"title": "$:/language/Buttons/Home/Hint",
"text": "Open the default tiddlers"
},
"$:/language/Buttons/Language/Caption": {
"title": "$:/language/Buttons/Language/Caption",
"text": "language"
},
"$:/language/Buttons/Language/Hint": {
"title": "$:/language/Buttons/Language/Hint",
"text": "Choose the user interface language"
},
"$:/language/Buttons/Manager/Caption": {
"title": "$:/language/Buttons/Manager/Caption",
"text": "tiddler manager"
},
"$:/language/Buttons/Manager/Hint": {
"title": "$:/language/Buttons/Manager/Hint",
"text": "Open tiddler manager"
},
"$:/language/Buttons/More/Caption": {
"title": "$:/language/Buttons/More/Caption",
"text": "more"
},
"$:/language/Buttons/More/Hint": {
"title": "$:/language/Buttons/More/Hint",
"text": "More actions"
},
"$:/language/Buttons/NewHere/Caption": {
"title": "$:/language/Buttons/NewHere/Caption",
"text": "new here"
},
"$:/language/Buttons/NewHere/Hint": {
"title": "$:/language/Buttons/NewHere/Hint",
"text": "Create a new tiddler tagged with this one"
},
"$:/language/Buttons/NewJournal/Caption": {
"title": "$:/language/Buttons/NewJournal/Caption",
"text": "new journal"
},
"$:/language/Buttons/NewJournal/Hint": {
"title": "$:/language/Buttons/NewJournal/Hint",
"text": "Create a new journal tiddler"
},
"$:/language/Buttons/NewJournalHere/Caption": {
"title": "$:/language/Buttons/NewJournalHere/Caption",
"text": "new journal here"
},
"$:/language/Buttons/NewJournalHere/Hint": {
"title": "$:/language/Buttons/NewJournalHere/Hint",
"text": "Create a new journal tiddler tagged with this one"
},
"$:/language/Buttons/NewImage/Caption": {
"title": "$:/language/Buttons/NewImage/Caption",
"text": "new image"
},
"$:/language/Buttons/NewImage/Hint": {
"title": "$:/language/Buttons/NewImage/Hint",
"text": "Create a new image tiddler"
},
"$:/language/Buttons/NewMarkdown/Caption": {
"title": "$:/language/Buttons/NewMarkdown/Caption",
"text": "new Markdown tiddler"
},
"$:/language/Buttons/NewMarkdown/Hint": {
"title": "$:/language/Buttons/NewMarkdown/Hint",
"text": "Create a new Markdown tiddler"
},
"$:/language/Buttons/NewTiddler/Caption": {
"title": "$:/language/Buttons/NewTiddler/Caption",
"text": "new tiddler"
},
"$:/language/Buttons/NewTiddler/Hint": {
"title": "$:/language/Buttons/NewTiddler/Hint",
"text": "Create a new tiddler"
},
"$:/language/Buttons/OpenWindow/Caption": {
"title": "$:/language/Buttons/OpenWindow/Caption",
"text": "open in new window"
},
"$:/language/Buttons/OpenWindow/Hint": {
"title": "$:/language/Buttons/OpenWindow/Hint",
"text": "Open tiddler in new window"
},
"$:/language/Buttons/Palette/Caption": {
"title": "$:/language/Buttons/Palette/Caption",
"text": "palette"
},
"$:/language/Buttons/Palette/Hint": {
"title": "$:/language/Buttons/Palette/Hint",
"text": "Choose the colour palette"
},
"$:/language/Buttons/Permalink/Caption": {
"title": "$:/language/Buttons/Permalink/Caption",
"text": "permalink"
},
"$:/language/Buttons/Permalink/Hint": {
"title": "$:/language/Buttons/Permalink/Hint",
"text": "Set browser address bar to a direct link to this tiddler"
},
"$:/language/Buttons/Permaview/Caption": {
"title": "$:/language/Buttons/Permaview/Caption",
"text": "permaview"
},
"$:/language/Buttons/Permaview/Hint": {
"title": "$:/language/Buttons/Permaview/Hint",
"text": "Set browser address bar to a direct link to all the tiddlers in this story"
},
"$:/language/Buttons/Print/Caption": {
"title": "$:/language/Buttons/Print/Caption",
"text": "print page"
},
"$:/language/Buttons/Print/Hint": {
"title": "$:/language/Buttons/Print/Hint",
"text": "Print the current page"
},
"$:/language/Buttons/Refresh/Caption": {
"title": "$:/language/Buttons/Refresh/Caption",
"text": "refresh"
},
"$:/language/Buttons/Refresh/Hint": {
"title": "$:/language/Buttons/Refresh/Hint",
"text": "Perform a full refresh of the wiki"
},
"$:/language/Buttons/Save/Caption": {
"title": "$:/language/Buttons/Save/Caption",
"text": "ok"
},
"$:/language/Buttons/Save/Hint": {
"title": "$:/language/Buttons/Save/Hint",
"text": "Confirm changes to this tiddler"
},
"$:/language/Buttons/SaveWiki/Caption": {
"title": "$:/language/Buttons/SaveWiki/Caption",
"text": "save changes"
},
"$:/language/Buttons/SaveWiki/Hint": {
"title": "$:/language/Buttons/SaveWiki/Hint",
"text": "Save changes"
},
"$:/language/Buttons/StoryView/Caption": {
"title": "$:/language/Buttons/StoryView/Caption",
"text": "storyview"
},
"$:/language/Buttons/StoryView/Hint": {
"title": "$:/language/Buttons/StoryView/Hint",
"text": "Choose the story visualisation"
},
"$:/language/Buttons/HideSideBar/Caption": {
"title": "$:/language/Buttons/HideSideBar/Caption",
"text": "hide sidebar"
},
"$:/language/Buttons/HideSideBar/Hint": {
"title": "$:/language/Buttons/HideSideBar/Hint",
"text": "Hide sidebar"
},
"$:/language/Buttons/ShowSideBar/Caption": {
"title": "$:/language/Buttons/ShowSideBar/Caption",
"text": "show sidebar"
},
"$:/language/Buttons/ShowSideBar/Hint": {
"title": "$:/language/Buttons/ShowSideBar/Hint",
"text": "Show sidebar"
},
"$:/language/Buttons/TagManager/Caption": {
"title": "$:/language/Buttons/TagManager/Caption",
"text": "tag manager"
},
"$:/language/Buttons/TagManager/Hint": {
"title": "$:/language/Buttons/TagManager/Hint",
"text": "Open tag manager"
},
"$:/language/Buttons/Timestamp/Caption": {
"title": "$:/language/Buttons/Timestamp/Caption",
"text": "timestamps"
},
"$:/language/Buttons/Timestamp/Hint": {
"title": "$:/language/Buttons/Timestamp/Hint",
"text": "Choose whether modifications update timestamps"
},
"$:/language/Buttons/Timestamp/On/Caption": {
"title": "$:/language/Buttons/Timestamp/On/Caption",
"text": "timestamps are on"
},
"$:/language/Buttons/Timestamp/On/Hint": {
"title": "$:/language/Buttons/Timestamp/On/Hint",
"text": "Update timestamps when tiddlers are modified"
},
"$:/language/Buttons/Timestamp/Off/Caption": {
"title": "$:/language/Buttons/Timestamp/Off/Caption",
"text": "timestamps are off"
},
"$:/language/Buttons/Timestamp/Off/Hint": {
"title": "$:/language/Buttons/Timestamp/Off/Hint",
"text": "Don't update timestamps when tiddlers are modified"
},
"$:/language/Buttons/Theme/Caption": {
"title": "$:/language/Buttons/Theme/Caption",
"text": "theme"
},
"$:/language/Buttons/Theme/Hint": {
"title": "$:/language/Buttons/Theme/Hint",
"text": "Choose the display theme"
},
"$:/language/Buttons/Bold/Caption": {
"title": "$:/language/Buttons/Bold/Caption",
"text": "bold"
},
"$:/language/Buttons/Bold/Hint": {
"title": "$:/language/Buttons/Bold/Hint",
"text": "Apply bold formatting to selection"
},
"$:/language/Buttons/Clear/Caption": {
"title": "$:/language/Buttons/Clear/Caption",
"text": "clear"
},
"$:/language/Buttons/Clear/Hint": {
"title": "$:/language/Buttons/Clear/Hint",
"text": "Clear image to solid colour"
},
"$:/language/Buttons/EditorHeight/Caption": {
"title": "$:/language/Buttons/EditorHeight/Caption",
"text": "editor height"
},
"$:/language/Buttons/EditorHeight/Caption/Auto": {
"title": "$:/language/Buttons/EditorHeight/Caption/Auto",
"text": "Automatically adjust height to fit content"
},
"$:/language/Buttons/EditorHeight/Caption/Fixed": {
"title": "$:/language/Buttons/EditorHeight/Caption/Fixed",
"text": "Fixed height:"
},
"$:/language/Buttons/EditorHeight/Hint": {
"title": "$:/language/Buttons/EditorHeight/Hint",
"text": "Choose the height of the text editor"
},
"$:/language/Buttons/Excise/Caption": {
"title": "$:/language/Buttons/Excise/Caption",
"text": "excise"
},
"$:/language/Buttons/Excise/Caption/Excise": {
"title": "$:/language/Buttons/Excise/Caption/Excise",
"text": "Perform excision"
},
"$:/language/Buttons/Excise/Caption/MacroName": {
"title": "$:/language/Buttons/Excise/Caption/MacroName",
"text": "Macro name:"
},
"$:/language/Buttons/Excise/Caption/NewTitle": {
"title": "$:/language/Buttons/Excise/Caption/NewTitle",
"text": "Title of new tiddler:"
},
"$:/language/Buttons/Excise/Caption/Replace": {
"title": "$:/language/Buttons/Excise/Caption/Replace",
"text": "Replace excised text with:"
},
"$:/language/Buttons/Excise/Caption/Replace/Macro": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Macro",
"text": "macro"
},
"$:/language/Buttons/Excise/Caption/Replace/Link": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Link",
"text": "link"
},
"$:/language/Buttons/Excise/Caption/Replace/Transclusion": {
"title": "$:/language/Buttons/Excise/Caption/Replace/Transclusion",
"text": "transclusion"
},
"$:/language/Buttons/Excise/Caption/Tag": {
"title": "$:/language/Buttons/Excise/Caption/Tag",
"text": "Tag new tiddler with the title of this tiddler"
},
"$:/language/Buttons/Excise/Caption/TiddlerExists": {
"title": "$:/language/Buttons/Excise/Caption/TiddlerExists",
"text": "Warning: tiddler already exists"
},
"$:/language/Buttons/Excise/Hint": {
"title": "$:/language/Buttons/Excise/Hint",
"text": "Excise the selected text into a new tiddler"
},
"$:/language/Buttons/Heading1/Caption": {
"title": "$:/language/Buttons/Heading1/Caption",
"text": "heading 1"
},
"$:/language/Buttons/Heading1/Hint": {
"title": "$:/language/Buttons/Heading1/Hint",
"text": "Apply heading level 1 formatting to lines containing selection"
},
"$:/language/Buttons/Heading2/Caption": {
"title": "$:/language/Buttons/Heading2/Caption",
"text": "heading 2"
},
"$:/language/Buttons/Heading2/Hint": {
"title": "$:/language/Buttons/Heading2/Hint",
"text": "Apply heading level 2 formatting to lines containing selection"
},
"$:/language/Buttons/Heading3/Caption": {
"title": "$:/language/Buttons/Heading3/Caption",
"text": "heading 3"
},
"$:/language/Buttons/Heading3/Hint": {
"title": "$:/language/Buttons/Heading3/Hint",
"text": "Apply heading level 3 formatting to lines containing selection"
},
"$:/language/Buttons/Heading4/Caption": {
"title": "$:/language/Buttons/Heading4/Caption",
"text": "heading 4"
},
"$:/language/Buttons/Heading4/Hint": {
"title": "$:/language/Buttons/Heading4/Hint",
"text": "Apply heading level 4 formatting to lines containing selection"
},
"$:/language/Buttons/Heading5/Caption": {
"title": "$:/language/Buttons/Heading5/Caption",
"text": "heading 5"
},
"$:/language/Buttons/Heading5/Hint": {
"title": "$:/language/Buttons/Heading5/Hint",
"text": "Apply heading level 5 formatting to lines containing selection"
},
"$:/language/Buttons/Heading6/Caption": {
"title": "$:/language/Buttons/Heading6/Caption",
"text": "heading 6"
},
"$:/language/Buttons/Heading6/Hint": {
"title": "$:/language/Buttons/Heading6/Hint",
"text": "Apply heading level 6 formatting to lines containing selection"
},
"$:/language/Buttons/Italic/Caption": {
"title": "$:/language/Buttons/Italic/Caption",
"text": "italic"
},
"$:/language/Buttons/Italic/Hint": {
"title": "$:/language/Buttons/Italic/Hint",
"text": "Apply italic formatting to selection"
},
"$:/language/Buttons/LineWidth/Caption": {
"title": "$:/language/Buttons/LineWidth/Caption",
"text": "line width"
},
"$:/language/Buttons/LineWidth/Hint": {
"title": "$:/language/Buttons/LineWidth/Hint",
"text": "Set line width for painting"
},
"$:/language/Buttons/Link/Caption": {
"title": "$:/language/Buttons/Link/Caption",
"text": "link"
},
"$:/language/Buttons/Link/Hint": {
"title": "$:/language/Buttons/Link/Hint",
"text": "Create wikitext link"
},
"$:/language/Buttons/Linkify/Caption": {
"title": "$:/language/Buttons/Linkify/Caption",
"text": "wikilink"
},
"$:/language/Buttons/Linkify/Hint": {
"title": "$:/language/Buttons/Linkify/Hint",
"text": "Wrap selection in square brackets"
},
"$:/language/Buttons/ListBullet/Caption": {
"title": "$:/language/Buttons/ListBullet/Caption",
"text": "bulleted list"
},
"$:/language/Buttons/ListBullet/Hint": {
"title": "$:/language/Buttons/ListBullet/Hint",
"text": "Apply bulleted list formatting to lines containing selection"
},
"$:/language/Buttons/ListNumber/Caption": {
"title": "$:/language/Buttons/ListNumber/Caption",
"text": "numbered list"
},
"$:/language/Buttons/ListNumber/Hint": {
"title": "$:/language/Buttons/ListNumber/Hint",
"text": "Apply numbered list formatting to lines containing selection"
},
"$:/language/Buttons/MonoBlock/Caption": {
"title": "$:/language/Buttons/MonoBlock/Caption",
"text": "monospaced block"
},
"$:/language/Buttons/MonoBlock/Hint": {
"title": "$:/language/Buttons/MonoBlock/Hint",
"text": "Apply monospaced block formatting to lines containing selection"
},
"$:/language/Buttons/MonoLine/Caption": {
"title": "$:/language/Buttons/MonoLine/Caption",
"text": "monospaced"
},
"$:/language/Buttons/MonoLine/Hint": {
"title": "$:/language/Buttons/MonoLine/Hint",
"text": "Apply monospaced character formatting to selection"
},
"$:/language/Buttons/Opacity/Caption": {
"title": "$:/language/Buttons/Opacity/Caption",
"text": "opacity"
},
"$:/language/Buttons/Opacity/Hint": {
"title": "$:/language/Buttons/Opacity/Hint",
"text": "Set painting opacity"
},
"$:/language/Buttons/Paint/Caption": {
"title": "$:/language/Buttons/Paint/Caption",
"text": "paint colour"
},
"$:/language/Buttons/Paint/Hint": {
"title": "$:/language/Buttons/Paint/Hint",
"text": "Set painting colour"
},
"$:/language/Buttons/Picture/Caption": {
"title": "$:/language/Buttons/Picture/Caption",
"text": "picture"
},
"$:/language/Buttons/Picture/Hint": {
"title": "$:/language/Buttons/Picture/Hint",
"text": "Insert picture"
},
"$:/language/Buttons/Preview/Caption": {
"title": "$:/language/Buttons/Preview/Caption",
"text": "preview"
},
"$:/language/Buttons/Preview/Hint": {
"title": "$:/language/Buttons/Preview/Hint",
"text": "Show preview pane"
},
"$:/language/Buttons/PreviewType/Caption": {
"title": "$:/language/Buttons/PreviewType/Caption",
"text": "preview type"
},
"$:/language/Buttons/PreviewType/Hint": {
"title": "$:/language/Buttons/PreviewType/Hint",
"text": "Choose preview type"
},
"$:/language/Buttons/Quote/Caption": {
"title": "$:/language/Buttons/Quote/Caption",
"text": "quote"
},
"$:/language/Buttons/Quote/Hint": {
"title": "$:/language/Buttons/Quote/Hint",
"text": "Apply quoted text formatting to lines containing selection"
},
"$:/language/Buttons/RotateLeft/Caption": {
"title": "$:/language/Buttons/RotateLeft/Caption",
"text": "rotate left"
},
"$:/language/Buttons/RotateLeft/Hint": {
"title": "$:/language/Buttons/RotateLeft/Hint",
"text": "Rotate image left by 90 degrees"
},
"$:/language/Buttons/Size/Caption": {
"title": "$:/language/Buttons/Size/Caption",
"text": "image size"
},
"$:/language/Buttons/Size/Caption/Height": {
"title": "$:/language/Buttons/Size/Caption/Height",
"text": "Height:"
},
"$:/language/Buttons/Size/Caption/Resize": {
"title": "$:/language/Buttons/Size/Caption/Resize",
"text": "Resize image"
},
"$:/language/Buttons/Size/Caption/Width": {
"title": "$:/language/Buttons/Size/Caption/Width",
"text": "Width:"
},
"$:/language/Buttons/Size/Hint": {
"title": "$:/language/Buttons/Size/Hint",
"text": "Set image size"
},
"$:/language/Buttons/Stamp/Caption": {
"title": "$:/language/Buttons/Stamp/Caption",
"text": "stamp"
},
"$:/language/Buttons/Stamp/Caption/New": {
"title": "$:/language/Buttons/Stamp/Caption/New",
"text": "Add your own"
},
"$:/language/Buttons/Stamp/Hint": {
"title": "$:/language/Buttons/Stamp/Hint",
"text": "Insert a preconfigured snippet of text"
},
"$:/language/Buttons/Stamp/New/Title": {
"title": "$:/language/Buttons/Stamp/New/Title",
"text": "Name as shown in menu"
},
"$:/language/Buttons/Stamp/New/Text": {
"title": "$:/language/Buttons/Stamp/New/Text",
"text": "Text of snippet. (Remember to add a descriptive title in the caption field)."
},
"$:/language/Buttons/Strikethrough/Caption": {
"title": "$:/language/Buttons/Strikethrough/Caption",
"text": "strikethrough"
},
"$:/language/Buttons/Strikethrough/Hint": {
"title": "$:/language/Buttons/Strikethrough/Hint",
"text": "Apply strikethrough formatting to selection"
},
"$:/language/Buttons/Subscript/Caption": {
"title": "$:/language/Buttons/Subscript/Caption",
"text": "subscript"
},
"$:/language/Buttons/Subscript/Hint": {
"title": "$:/language/Buttons/Subscript/Hint",
"text": "Apply subscript formatting to selection"
},
"$:/language/Buttons/Superscript/Caption": {
"title": "$:/language/Buttons/Superscript/Caption",
"text": "superscript"
},
"$:/language/Buttons/Superscript/Hint": {
"title": "$:/language/Buttons/Superscript/Hint",
"text": "Apply superscript formatting to selection"
},
"$:/language/Buttons/ToggleSidebar/Hint": {
"title": "$:/language/Buttons/ToggleSidebar/Hint",
"text": "Toggle the sidebar visibility"
},
"$:/language/Buttons/Transcludify/Caption": {
"title": "$:/language/Buttons/Transcludify/Caption",
"text": "transclusion"
},
"$:/language/Buttons/Transcludify/Hint": {
"title": "$:/language/Buttons/Transcludify/Hint",
"text": "Wrap selection in curly brackets"
},
"$:/language/Buttons/Underline/Caption": {
"title": "$:/language/Buttons/Underline/Caption",
"text": "underline"
},
"$:/language/Buttons/Underline/Hint": {
"title": "$:/language/Buttons/Underline/Hint",
"text": "Apply underline formatting to selection"
},
"$:/language/ControlPanel/Advanced/Caption": {
"title": "$:/language/ControlPanel/Advanced/Caption",
"text": "Advanced"
},
"$:/language/ControlPanel/Advanced/Hint": {
"title": "$:/language/ControlPanel/Advanced/Hint",
"text": "Internal information about this TiddlyWiki"
},
"$:/language/ControlPanel/Appearance/Caption": {
"title": "$:/language/ControlPanel/Appearance/Caption",
"text": "Appearance"
},
"$:/language/ControlPanel/Appearance/Hint": {
"title": "$:/language/ControlPanel/Appearance/Hint",
"text": "Ways to customise the appearance of your TiddlyWiki."
},
"$:/language/ControlPanel/Basics/AnimDuration/Prompt": {
"title": "$:/language/ControlPanel/Basics/AnimDuration/Prompt",
"text": "Animation duration"
},
"$:/language/ControlPanel/Basics/AutoFocus/Prompt": {
"title": "$:/language/ControlPanel/Basics/AutoFocus/Prompt",
"text": "Default focus field for new tiddlers"
},
"$:/language/ControlPanel/Basics/Caption": {
"title": "$:/language/ControlPanel/Basics/Caption",
"text": "Basics"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/BottomHint",
"text": "Use [[double square brackets]] for titles with spaces. Or you can choose to <$button set=\"$:/DefaultTiddlers\" setTo=\"[list[$:/StoryList]]\">retain story ordering</$button>"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/Prompt",
"text": "Default tiddlers"
},
"$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint": {
"title": "$:/language/ControlPanel/Basics/DefaultTiddlers/TopHint",
"text": "Choose which tiddlers are displayed at startup"
},
"$:/language/ControlPanel/Basics/Language/Prompt": {
"title": "$:/language/ControlPanel/Basics/Language/Prompt",
"text": "Hello! Current language:"
},
"$:/language/ControlPanel/Basics/NewJournal/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Title/Prompt",
"text": "Title of new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewJournal/Text/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Text/Prompt",
"text": "Text for new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewJournal/Tags/Prompt",
"text": "Tags for new journal tiddlers"
},
"$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewTiddler/Title/Prompt",
"text": "Title of new tiddlers"
},
"$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/NewTiddler/Tags/Prompt",
"text": "Tags for new tiddlers"
},
"$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/OverriddenShadowTiddlers/Prompt",
"text": "Number of overridden shadow tiddlers"
},
"$:/language/ControlPanel/Basics/RemoveTags": {
"title": "$:/language/ControlPanel/Basics/RemoveTags",
"text": "Update to current format"
},
"$:/language/ControlPanel/Basics/RemoveTags/Hint": {
"title": "$:/language/ControlPanel/Basics/RemoveTags/Hint",
"text": "Update the tags configuration to the latest format"
},
"$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/ShadowTiddlers/Prompt",
"text": "Number of shadow tiddlers"
},
"$:/language/ControlPanel/Basics/Subtitle/Prompt": {
"title": "$:/language/ControlPanel/Basics/Subtitle/Prompt",
"text": "Subtitle"
},
"$:/language/ControlPanel/Basics/SystemTiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/SystemTiddlers/Prompt",
"text": "Number of system tiddlers"
},
"$:/language/ControlPanel/Basics/Tags/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tags/Prompt",
"text": "Number of tags"
},
"$:/language/ControlPanel/Basics/Tiddlers/Prompt": {
"title": "$:/language/ControlPanel/Basics/Tiddlers/Prompt",
"text": "Number of tiddlers"
},
"$:/language/ControlPanel/Basics/Title/Prompt": {
"title": "$:/language/ControlPanel/Basics/Title/Prompt",
"text": "Title of this ~TiddlyWiki"
},
"$:/language/ControlPanel/Basics/Username/Prompt": {
"title": "$:/language/ControlPanel/Basics/Username/Prompt",
"text": "Username for signing edits"
},
"$:/language/ControlPanel/Basics/Version/Prompt": {
"title": "$:/language/ControlPanel/Basics/Version/Prompt",
"text": "~TiddlyWiki version"
},
"$:/language/ControlPanel/EditorTypes/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Caption",
"text": "Editor Types"
},
"$:/language/ControlPanel/EditorTypes/Editor/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Editor/Caption",
"text": "Editor"
},
"$:/language/ControlPanel/EditorTypes/Hint": {
"title": "$:/language/ControlPanel/EditorTypes/Hint",
"text": "These tiddlers determine which editor is used to edit specific tiddler types."
},
"$:/language/ControlPanel/EditorTypes/Type/Caption": {
"title": "$:/language/ControlPanel/EditorTypes/Type/Caption",
"text": "Type"
},
"$:/language/ControlPanel/Info/Caption": {
"title": "$:/language/ControlPanel/Info/Caption",
"text": "Info"
},
"$:/language/ControlPanel/Info/Hint": {
"title": "$:/language/ControlPanel/Info/Hint",
"text": "Information about this TiddlyWiki"
},
"$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt",
"text": "Type shortcut here"
},
"$:/language/ControlPanel/KeyboardShortcuts/Add/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Add/Caption",
"text": "add shortcut"
},
"$:/language/ControlPanel/KeyboardShortcuts/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Caption",
"text": "Keyboard Shortcuts"
},
"$:/language/ControlPanel/KeyboardShortcuts/Hint": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Hint",
"text": "Manage keyboard shortcut assignments"
},
"$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/NoShortcuts/Caption",
"text": "No keyboard shortcuts assigned"
},
"$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint",
"text": "remove keyboard shortcut"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/All": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/All",
"text": "All platforms"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Mac",
"text": "Macintosh platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonMac",
"text": "Non-Macintosh platforms only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Linux",
"text": "Linux platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonLinux",
"text": "Non-Linux platforms only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/Windows",
"text": "Windows platform only"
},
"$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows": {
"title": "$:/language/ControlPanel/KeyboardShortcuts/Platform/NonWindows",
"text": "Non-Windows platforms only"
},
"$:/language/ControlPanel/LayoutSwitcher/Caption": {
"title": "$:/language/ControlPanel/LayoutSwitcher/Caption",
"text": "Layout"
},
"$:/language/ControlPanel/LoadedModules/Caption": {
"title": "$:/language/ControlPanel/LoadedModules/Caption",
"text": "Loaded Modules"
},
"$:/language/ControlPanel/LoadedModules/Hint": {
"title": "$:/language/ControlPanel/LoadedModules/Hint",
"text": "These are the currently loaded tiddler modules linked to their source tiddlers. Any italicised modules lack a source tiddler, typically because they were setup during the boot process."
},
"$:/language/ControlPanel/Palette/Caption": {
"title": "$:/language/ControlPanel/Palette/Caption",
"text": "Palette"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Caption",
"text": "clone"
},
"$:/language/ControlPanel/Palette/Editor/Clone/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Clone/Prompt",
"text": "It is recommended that you clone this shadow palette before editing it"
},
"$:/language/ControlPanel/Palette/Editor/Delete/Hint": {
"title": "$:/language/ControlPanel/Palette/Editor/Delete/Hint",
"text": "delete this entry from the current palette"
},
"$:/language/ControlPanel/Palette/Editor/Names/External/Show": {
"title": "$:/language/ControlPanel/Palette/Editor/Names/External/Show",
"text": "Show color names that are not part of the current palette"
},
"$:/language/ControlPanel/Palette/Editor/Prompt/Modified": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt/Modified",
"text": "This shadow palette has been modified"
},
"$:/language/ControlPanel/Palette/Editor/Prompt": {
"title": "$:/language/ControlPanel/Palette/Editor/Prompt",
"text": "Editing"
},
"$:/language/ControlPanel/Palette/Editor/Reset/Caption": {
"title": "$:/language/ControlPanel/Palette/Editor/Reset/Caption",
"text": "reset"
},
"$:/language/ControlPanel/Palette/HideEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/HideEditor/Caption",
"text": "hide editor"
},
"$:/language/ControlPanel/Palette/Prompt": {
"title": "$:/language/ControlPanel/Palette/Prompt",
"text": "Current palette:"
},
"$:/language/ControlPanel/Palette/ShowEditor/Caption": {
"title": "$:/language/ControlPanel/Palette/ShowEditor/Caption",
"text": "show editor"
},
"$:/language/ControlPanel/Parsing/Caption": {
"title": "$:/language/ControlPanel/Parsing/Caption",
"text": "Parsing"
},
"$:/language/ControlPanel/Parsing/Hint": {
"title": "$:/language/ControlPanel/Parsing/Hint",
"text": "Here you can globally disable/enable wiki parser rules. For changes to take effect, save and reload your wiki. Disabling certain parser rules can prevent <$text text=\"TiddlyWiki\"/> from functioning correctly. Use [[safe mode|https://tiddlywiki.com/#SafeMode]] to restore normal operation."
},
"$:/language/ControlPanel/Parsing/Block/Caption": {
"title": "$:/language/ControlPanel/Parsing/Block/Caption",
"text": "Block Parse Rules"
},
"$:/language/ControlPanel/Parsing/Inline/Caption": {
"title": "$:/language/ControlPanel/Parsing/Inline/Caption",
"text": "Inline Parse Rules"
},
"$:/language/ControlPanel/Parsing/Pragma/Caption": {
"title": "$:/language/ControlPanel/Parsing/Pragma/Caption",
"text": "Pragma Parse Rules"
},
"$:/language/ControlPanel/Plugins/Add/Caption": {
"title": "$:/language/ControlPanel/Plugins/Add/Caption",
"text": "Get more plugins"
},
"$:/language/ControlPanel/Plugins/Add/Hint": {
"title": "$:/language/ControlPanel/Plugins/Add/Hint",
"text": "Install plugins from the official library"
},
"$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint": {
"title": "$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint",
"text": "This plugin is already installed at version <$text text=<<installedVersion>>/>"
},
"$:/language/ControlPanel/Plugins/AlsoRequires": {
"title": "$:/language/ControlPanel/Plugins/AlsoRequires",
"text": "Also requires:"
},
"$:/language/ControlPanel/Plugins/Caption": {
"title": "$:/language/ControlPanel/Plugins/Caption",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Disable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Disable/Caption",
"text": "disable"
},
"$:/language/ControlPanel/Plugins/Disable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Disable/Hint",
"text": "Disable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Disabled/Status": {
"title": "$:/language/ControlPanel/Plugins/Disabled/Status",
"text": "(disabled)"
},
"$:/language/ControlPanel/Plugins/Downgrade/Caption": {
"title": "$:/language/ControlPanel/Plugins/Downgrade/Caption",
"text": "downgrade"
},
"$:/language/ControlPanel/Plugins/Empty/Hint": {
"title": "$:/language/ControlPanel/Plugins/Empty/Hint",
"text": "None"
},
"$:/language/ControlPanel/Plugins/Enable/Caption": {
"title": "$:/language/ControlPanel/Plugins/Enable/Caption",
"text": "enable"
},
"$:/language/ControlPanel/Plugins/Enable/Hint": {
"title": "$:/language/ControlPanel/Plugins/Enable/Hint",
"text": "Enable this plugin when reloading page"
},
"$:/language/ControlPanel/Plugins/Install/Caption": {
"title": "$:/language/ControlPanel/Plugins/Install/Caption",
"text": "install"
},
"$:/language/ControlPanel/Plugins/Installed/Hint": {
"title": "$:/language/ControlPanel/Plugins/Installed/Hint",
"text": "Currently installed plugins:"
},
"$:/language/ControlPanel/Plugins/Languages/Caption": {
"title": "$:/language/ControlPanel/Plugins/Languages/Caption",
"text": "Languages"
},
"$:/language/ControlPanel/Plugins/Languages/Hint": {
"title": "$:/language/ControlPanel/Plugins/Languages/Hint",
"text": "Language pack plugins"
},
"$:/language/ControlPanel/Plugins/NoInfoFound/Hint": {
"title": "$:/language/ControlPanel/Plugins/NoInfoFound/Hint",
"text": "No ''\"<$text text=<<currentTab>>/>\"'' found"
},
"$:/language/ControlPanel/Plugins/NotInstalled/Hint": {
"title": "$:/language/ControlPanel/Plugins/NotInstalled/Hint",
"text": "This plugin is not currently installed"
},
"$:/language/ControlPanel/Plugins/OpenPluginLibrary": {
"title": "$:/language/ControlPanel/Plugins/OpenPluginLibrary",
"text": "open plugin library"
},
"$:/language/ControlPanel/Plugins/ClosePluginLibrary": {
"title": "$:/language/ControlPanel/Plugins/ClosePluginLibrary",
"text": "close plugin library"
},
"$:/language/ControlPanel/Plugins/PluginWillRequireReload": {
"title": "$:/language/ControlPanel/Plugins/PluginWillRequireReload",
"text": "(requires reload)"
},
"$:/language/ControlPanel/Plugins/Plugins/Caption": {
"title": "$:/language/ControlPanel/Plugins/Plugins/Caption",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Plugins/Hint": {
"title": "$:/language/ControlPanel/Plugins/Plugins/Hint",
"text": "Plugins"
},
"$:/language/ControlPanel/Plugins/Reinstall/Caption": {
"title": "$:/language/ControlPanel/Plugins/Reinstall/Caption",
"text": "reinstall"
},
"$:/language/ControlPanel/Plugins/Themes/Caption": {
"title": "$:/language/ControlPanel/Plugins/Themes/Caption",
"text": "Themes"
},
"$:/language/ControlPanel/Plugins/Themes/Hint": {
"title": "$:/language/ControlPanel/Plugins/Themes/Hint",
"text": "Theme plugins"
},
"$:/language/ControlPanel/Plugins/Update/Caption": {
"title": "$:/language/ControlPanel/Plugins/Update/Caption",
"text": "update"
},
"$:/language/ControlPanel/Plugins/Updates/Caption": {
"title": "$:/language/ControlPanel/Plugins/Updates/Caption",
"text": "Updates"
},
"$:/language/ControlPanel/Plugins/Updates/Hint": {
"title": "$:/language/ControlPanel/Plugins/Updates/Hint",
"text": "Available updates to installed plugins"
},
"$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption": {
"title": "$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption",
"text": "Update <<update-count>> plugins"
},
"$:/language/ControlPanel/Plugins/SubPluginPrompt": {
"title": "$:/language/ControlPanel/Plugins/SubPluginPrompt",
"text": "With <<count>> sub-plugins available"
},
"$:/language/ControlPanel/Saving/Caption": {
"title": "$:/language/ControlPanel/Saving/Caption",
"text": "Saving"
},
"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Description",
"text": "Permit automatic saving for the download saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/AutoSave/Hint",
"text": "Enable Autosave for Download Saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/Caption": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/Caption",
"text": "Download Saver"
},
"$:/language/ControlPanel/Saving/DownloadSaver/Hint": {
"title": "$:/language/ControlPanel/Saving/DownloadSaver/Hint",
"text": "These settings apply to the HTML5-compatible download saver"
},
"$:/language/ControlPanel/Saving/General/Caption": {
"title": "$:/language/ControlPanel/Saving/General/Caption",
"text": "General"
},
"$:/language/ControlPanel/Saving/General/Hint": {
"title": "$:/language/ControlPanel/Saving/General/Hint",
"text": "These settings apply to all the loaded savers"
},
"$:/language/ControlPanel/Saving/Hint": {
"title": "$:/language/ControlPanel/Saving/Hint",
"text": "Settings used for saving the entire TiddlyWiki as a single file via a saver module"
},
"$:/language/ControlPanel/Saving/GitService/Branch": {
"title": "$:/language/ControlPanel/Saving/GitService/Branch",
"text": "Target branch for saving"
},
"$:/language/ControlPanel/Saving/GitService/CommitMessage": {
"title": "$:/language/ControlPanel/Saving/GitService/CommitMessage",
"text": "Saved by TiddlyWiki"
},
"$:/language/ControlPanel/Saving/GitService/Description": {
"title": "$:/language/ControlPanel/Saving/GitService/Description",
"text": "These settings are only used when saving to <<service-name>>"
},
"$:/language/ControlPanel/Saving/GitService/Filename": {
"title": "$:/language/ControlPanel/Saving/GitService/Filename",
"text": "Filename of target file (e.g. `index.html`)"
},
"$:/language/ControlPanel/Saving/GitService/Path": {
"title": "$:/language/ControlPanel/Saving/GitService/Path",
"text": "Path to target file (e.g. `/wiki/`)"
},
"$:/language/ControlPanel/Saving/GitService/Repo": {
"title": "$:/language/ControlPanel/Saving/GitService/Repo",
"text": "Target repository (e.g. `Jermolene/TiddlyWiki5`)"
},
"$:/language/ControlPanel/Saving/GitService/ServerURL": {
"title": "$:/language/ControlPanel/Saving/GitService/ServerURL",
"text": "Server API URL"
},
"$:/language/ControlPanel/Saving/GitService/UserName": {
"title": "$:/language/ControlPanel/Saving/GitService/UserName",
"text": "Username"
},
"$:/language/ControlPanel/Saving/GitService/GitHub/Caption": {
"title": "$:/language/ControlPanel/Saving/GitService/GitHub/Caption",
"text": "~GitHub Saver"
},
"$:/language/ControlPanel/Saving/GitService/GitHub/Password": {
"title": "$:/language/ControlPanel/Saving/GitService/GitHub/Password",
"text": "Password, OAUTH token, or personal access token (see [[GitHub help page|https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line]] for details)"
},
"$:/language/ControlPanel/Saving/GitService/GitLab/Caption": {
"title": "$:/language/ControlPanel/Saving/GitService/GitLab/Caption",
"text": "~GitLab Saver"
},
"$:/language/ControlPanel/Saving/GitService/GitLab/Password": {
"title": "$:/language/ControlPanel/Saving/GitService/GitLab/Password",
"text": "Personal access token for API (see [[GitLab help page|https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html]] for details)"
},
"$:/language/ControlPanel/Saving/GitService/Gitea/Caption": {
"title": "$:/language/ControlPanel/Saving/GitService/Gitea/Caption",
"text": "Gitea Saver"
},
"$:/language/ControlPanel/Saving/GitService/Gitea/Password": {
"title": "$:/language/ControlPanel/Saving/GitService/Gitea/Password",
"text": "Personal access token for API (via Gitea’s web interface: `Settings | Applications | Generate New Token`)"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Advanced/Heading",
"text": "Advanced Settings"
},
"$:/language/ControlPanel/Saving/TiddlySpot/BackupDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/BackupDir",
"text": "Backup Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/ControlPanel",
"text": "~TiddlySpot Control Panel"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Backups": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Backups",
"text": "Backups"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Caption": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Caption",
"text": "~TiddlySpot Saver"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Description": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Description",
"text": "These settings are only used when saving to http://tiddlyspot.com or a compatible remote server"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Filename": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Filename",
"text": "Upload Filename"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Heading": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Heading",
"text": "~TiddlySpot"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Hint": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Hint",
"text": "//The server URL defaults to `http://<wikiname>.tiddlyspot.com/store.cgi` and can be changed to use a custom server address, e.g. `http://example.com/store.php`.//"
},
"$:/language/ControlPanel/Saving/TiddlySpot/Password": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/Password",
"text": "Password"
},
"$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/ReadOnly",
"text": "The ~TiddlySpot service is currently only available in read-only form. Please see http://tiddlyspot.com/ for the latest details. The ~TiddlySpot saver can still be used to save to compatible servers."
},
"$:/language/ControlPanel/Saving/TiddlySpot/ServerURL": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/ServerURL",
"text": "Server URL"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UploadDir": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UploadDir",
"text": "Upload Directory"
},
"$:/language/ControlPanel/Saving/TiddlySpot/UserName": {
"title": "$:/language/ControlPanel/Saving/TiddlySpot/UserName",
"text": "Wiki Name"
},
"$:/language/ControlPanel/Settings/AutoSave/Caption": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Caption",
"text": "Autosave"
},
"$:/language/ControlPanel/Settings/AutoSave/Disabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Disabled/Description",
"text": "Do not save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Enabled/Description": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Enabled/Description",
"text": "Save changes automatically"
},
"$:/language/ControlPanel/Settings/AutoSave/Hint": {
"title": "$:/language/ControlPanel/Settings/AutoSave/Hint",
"text": "Attempt to automatically save changes during editing when using a supporting saver"
},
"$:/language/ControlPanel/Settings/CamelCase/Caption": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Caption",
"text": "Camel Case Wiki Links"
},
"$:/language/ControlPanel/Settings/CamelCase/Hint": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Hint",
"text": "You can globally disable automatic linking of ~CamelCase phrases. Requires reload to take effect"
},
"$:/language/ControlPanel/Settings/CamelCase/Description": {
"title": "$:/language/ControlPanel/Settings/CamelCase/Description",
"text": "Enable automatic ~CamelCase linking"
},
"$:/language/ControlPanel/Settings/Caption": {
"title": "$:/language/ControlPanel/Settings/Caption",
"text": "Settings"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Caption": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Caption",
"text": "Editor Toolbar"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Hint": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Hint",
"text": "Enable or disable the editor toolbar:"
},
"$:/language/ControlPanel/Settings/EditorToolbar/Description": {
"title": "$:/language/ControlPanel/Settings/EditorToolbar/Description",
"text": "Show editor toolbar"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Caption": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Caption",
"text": "Tiddler Info Panel Mode"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Hint": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Hint",
"text": "Control when the tiddler info panel closes:"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Popup/Description",
"text": "Tiddler info panel closes automatically"
},
"$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description": {
"title": "$:/language/ControlPanel/Settings/InfoPanelMode/Sticky/Description",
"text": "Tiddler info panel stays open until explicitly closed"
},
"$:/language/ControlPanel/Settings/Hint": {
"title": "$:/language/ControlPanel/Settings/Hint",
"text": "These settings let you customise the behaviour of TiddlyWiki."
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Caption",
"text": "Navigation Address Bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Hint",
"text": "Behaviour of the browser address bar when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/No/Description",
"text": "Do not update the address bar"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permalink/Description",
"text": "Include the target tiddler"
},
"$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationAddressBar/Permaview/Description",
"text": "Include the target tiddler and the current story sequence"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Caption",
"text": "Navigation History"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Hint",
"text": "Update browser history when navigating to a tiddler:"
},
"$:/language/ControlPanel/Settings/NavigationHistory/No/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/No/Description",
"text": "Do not update history"
},
"$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationHistory/Yes/Description",
"text": "Update history"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption",
"text": "Permalink/permaview Mode"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Hint",
"text": "Choose how permalink/permaview is handled:"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/CopyToClipboard/Description",
"text": "Copy permalink/permaview URL to clipboard"
},
"$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description": {
"title": "$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/UpdateAddressBar/Description",
"text": "Update address bar with permalink/permaview URL"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption",
"text": "Performance Instrumentation"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Hint",
"text": "Displays performance statistics in the browser developer console. Requires reload to take effect"
},
"$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description": {
"title": "$:/language/ControlPanel/Settings/PerformanceInstrumentation/Description",
"text": "Enable performance instrumentation"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption",
"text": "Toolbar Button Style"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Hint",
"text": "Choose the style for toolbar buttons:"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless",
"text": "Borderless"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed",
"text": "Boxed"
},
"$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded",
"text": "Rounded"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Caption": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Caption",
"text": "Toolbar Buttons"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Hint": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Hint",
"text": "Default toolbar button appearance:"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Icons/Description",
"text": "Include icon"
},
"$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description": {
"title": "$:/language/ControlPanel/Settings/ToolbarButtons/Text/Description",
"text": "Include text"
},
"$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption": {
"title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption",
"text": "Default Sidebar Tab"
},
"$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint": {
"title": "$:/language/ControlPanel/Settings/DefaultSidebarTab/Hint",
"text": "Specify which sidebar tab is displayed by default"
},
"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption": {
"title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption",
"text": "Default More Sidebar Tab"
},
"$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint": {
"title": "$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Hint",
"text": "Specify which More sidebar tab is displayed by default"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/Caption": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/Caption",
"text": "Tiddler Opening Behaviour"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/InsideRiver/Hint",
"text": "Navigation from //within// the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OutsideRiver/Hint",
"text": "Navigation from //outside// the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAbove",
"text": "Open above the current tiddler"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenBelow",
"text": "Open below the current tiddler"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtTop",
"text": "Open at the top of the story river"
},
"$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom": {
"title": "$:/language/ControlPanel/Settings/LinkToBehaviour/OpenAtBottom",
"text": "Open at the bottom of the story river"
},
"$:/language/ControlPanel/Settings/TitleLinks/Caption": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Caption",
"text": "Tiddler Titles"
},
"$:/language/ControlPanel/Settings/TitleLinks/Hint": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Hint",
"text": "Optionally display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/TitleLinks/No/Description": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/No/Description",
"text": "Do not display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/TitleLinks/Yes/Description": {
"title": "$:/language/ControlPanel/Settings/TitleLinks/Yes/Description",
"text": "Display tiddler titles as links"
},
"$:/language/ControlPanel/Settings/MissingLinks/Caption": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Caption",
"text": "Wiki Links"
},
"$:/language/ControlPanel/Settings/MissingLinks/Hint": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Hint",
"text": "Choose whether to link to tiddlers that do not exist yet"
},
"$:/language/ControlPanel/Settings/MissingLinks/Description": {
"title": "$:/language/ControlPanel/Settings/MissingLinks/Description",
"text": "Enable links to missing tiddlers"
},
"$:/language/ControlPanel/StoryView/Caption": {
"title": "$:/language/ControlPanel/StoryView/Caption",
"text": "Story View"
},
"$:/language/ControlPanel/StoryView/Prompt": {
"title": "$:/language/ControlPanel/StoryView/Prompt",
"text": "Current view:"
},
"$:/language/ControlPanel/Stylesheets/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Caption",
"text": "Stylesheets"
},
"$:/language/ControlPanel/Stylesheets/Expand/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Expand/Caption",
"text": "Expand All"
},
"$:/language/ControlPanel/Stylesheets/Hint": {
"title": "$:/language/ControlPanel/Stylesheets/Hint",
"text": "This is the rendered CSS of the current stylesheet tiddlers tagged with <<tag \"$:/tags/Stylesheet\">>"
},
"$:/language/ControlPanel/Stylesheets/Restore/Caption": {
"title": "$:/language/ControlPanel/Stylesheets/Restore/Caption",
"text": "Restore"
},
"$:/language/ControlPanel/Theme/Caption": {
"title": "$:/language/ControlPanel/Theme/Caption",
"text": "Theme"
},
"$:/language/ControlPanel/Theme/Prompt": {
"title": "$:/language/ControlPanel/Theme/Prompt",
"text": "Current theme:"
},
"$:/language/ControlPanel/TiddlerFields/Caption": {
"title": "$:/language/ControlPanel/TiddlerFields/Caption",
"text": "Tiddler Fields"
},
"$:/language/ControlPanel/TiddlerFields/Hint": {
"title": "$:/language/ControlPanel/TiddlerFields/Hint",
"text": "This is the full set of TiddlerFields in use in this wiki (including system tiddlers but excluding shadow tiddlers)."
},
"$:/language/ControlPanel/Toolbars/Caption": {
"title": "$:/language/ControlPanel/Toolbars/Caption",
"text": "Toolbars"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Caption",
"text": "Edit Toolbar"
},
"$:/language/ControlPanel/Toolbars/EditToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/EditToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in edit mode. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/Hint": {
"title": "$:/language/ControlPanel/Toolbars/Hint",
"text": "Select which toolbar buttons are displayed"
},
"$:/language/ControlPanel/Toolbars/PageControls/Caption": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Caption",
"text": "Page Toolbar"
},
"$:/language/ControlPanel/Toolbars/PageControls/Hint": {
"title": "$:/language/ControlPanel/Toolbars/PageControls/Hint",
"text": "Choose which buttons are displayed on the main page toolbar. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/EditorToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Caption",
"text": "Editor Toolbar"
},
"$:/language/ControlPanel/Toolbars/EditorToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/EditorToolbar/Hint",
"text": "Choose which buttons are displayed in the editor toolbar. Note that some buttons will only appear when editing tiddlers of a certain type. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Caption": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Caption",
"text": "View Toolbar"
},
"$:/language/ControlPanel/Toolbars/ViewToolbar/Hint": {
"title": "$:/language/ControlPanel/Toolbars/ViewToolbar/Hint",
"text": "Choose which buttons are displayed for tiddlers in view mode. Drag and drop to change the ordering"
},
"$:/language/ControlPanel/Tools/Download/Full/Caption": {
"title": "$:/language/ControlPanel/Tools/Download/Full/Caption",
"text": "Download full wiki"
},
"$:/language/Date/DaySuffix/1": {
"title": "$:/language/Date/DaySuffix/1",
"text": "st"
},
"$:/language/Date/DaySuffix/2": {
"title": "$:/language/Date/DaySuffix/2",
"text": "nd"
},
"$:/language/Date/DaySuffix/3": {
"title": "$:/language/Date/DaySuffix/3",
"text": "rd"
},
"$:/language/Date/DaySuffix/4": {
"title": "$:/language/Date/DaySuffix/4",
"text": "th"
},
"$:/language/Date/DaySuffix/5": {
"title": "$:/language/Date/DaySuffix/5",
"text": "th"
},
"$:/language/Date/DaySuffix/6": {
"title": "$:/language/Date/DaySuffix/6",
"text": "th"
},
"$:/language/Date/DaySuffix/7": {
"title": "$:/language/Date/DaySuffix/7",
"text": "th"
},
"$:/language/Date/DaySuffix/8": {
"title": "$:/language/Date/DaySuffix/8",
"text": "th"
},
"$:/language/Date/DaySuffix/9": {
"title": "$:/language/Date/DaySuffix/9",
"text": "th"
},
"$:/language/Date/DaySuffix/10": {
"title": "$:/language/Date/DaySuffix/10",
"text": "th"
},
"$:/language/Date/DaySuffix/11": {
"title": "$:/language/Date/DaySuffix/11",
"text": "th"
},
"$:/language/Date/DaySuffix/12": {
"title": "$:/language/Date/DaySuffix/12",
"text": "th"
},
"$:/language/Date/DaySuffix/13": {
"title": "$:/language/Date/DaySuffix/13",
"text": "th"
},
"$:/language/Date/DaySuffix/14": {
"title": "$:/language/Date/DaySuffix/14",
"text": "th"
},
"$:/language/Date/DaySuffix/15": {
"title": "$:/language/Date/DaySuffix/15",
"text": "th"
},
"$:/language/Date/DaySuffix/16": {
"title": "$:/language/Date/DaySuffix/16",
"text": "th"
},
"$:/language/Date/DaySuffix/17": {
"title": "$:/language/Date/DaySuffix/17",
"text": "th"
},
"$:/language/Date/DaySuffix/18": {
"title": "$:/language/Date/DaySuffix/18",
"text": "th"
},
"$:/language/Date/DaySuffix/19": {
"title": "$:/language/Date/DaySuffix/19",
"text": "th"
},
"$:/language/Date/DaySuffix/20": {
"title": "$:/language/Date/DaySuffix/20",
"text": "th"
},
"$:/language/Date/DaySuffix/21": {
"title": "$:/language/Date/DaySuffix/21",
"text": "st"
},
"$:/language/Date/DaySuffix/22": {
"title": "$:/language/Date/DaySuffix/22",
"text": "nd"
},
"$:/language/Date/DaySuffix/23": {
"title": "$:/language/Date/DaySuffix/23",
"text": "rd"
},
"$:/language/Date/DaySuffix/24": {
"title": "$:/language/Date/DaySuffix/24",
"text": "th"
},
"$:/language/Date/DaySuffix/25": {
"title": "$:/language/Date/DaySuffix/25",
"text": "th"
},
"$:/language/Date/DaySuffix/26": {
"title": "$:/language/Date/DaySuffix/26",
"text": "th"
},
"$:/language/Date/DaySuffix/27": {
"title": "$:/language/Date/DaySuffix/27",
"text": "th"
},
"$:/language/Date/DaySuffix/28": {
"title": "$:/language/Date/DaySuffix/28",
"text": "th"
},
"$:/language/Date/DaySuffix/29": {
"title": "$:/language/Date/DaySuffix/29",
"text": "th"
},
"$:/language/Date/DaySuffix/30": {
"title": "$:/language/Date/DaySuffix/30",
"text": "th"
},
"$:/language/Date/DaySuffix/31": {
"title": "$:/language/Date/DaySuffix/31",
"text": "st"
},
"$:/language/Date/Long/Day/0": {
"title": "$:/language/Date/Long/Day/0",
"text": "Sunday"
},
"$:/language/Date/Long/Day/1": {
"title": "$:/language/Date/Long/Day/1",
"text": "Monday"
},
"$:/language/Date/Long/Day/2": {
"title": "$:/language/Date/Long/Day/2",
"text": "Tuesday"
},
"$:/language/Date/Long/Day/3": {
"title": "$:/language/Date/Long/Day/3",
"text": "Wednesday"
},
"$:/language/Date/Long/Day/4": {
"title": "$:/language/Date/Long/Day/4",
"text": "Thursday"
},
"$:/language/Date/Long/Day/5": {
"title": "$:/language/Date/Long/Day/5",
"text": "Friday"
},
"$:/language/Date/Long/Day/6": {
"title": "$:/language/Date/Long/Day/6",
"text": "Saturday"
},
"$:/language/Date/Long/Month/1": {
"title": "$:/language/Date/Long/Month/1",
"text": "January"
},
"$:/language/Date/Long/Month/2": {
"title": "$:/language/Date/Long/Month/2",
"text": "February"
},
"$:/language/Date/Long/Month/3": {
"title": "$:/language/Date/Long/Month/3",
"text": "March"
},
"$:/language/Date/Long/Month/4": {
"title": "$:/language/Date/Long/Month/4",
"text": "April"
},
"$:/language/Date/Long/Month/5": {
"title": "$:/language/Date/Long/Month/5",
"text": "May"
},
"$:/language/Date/Long/Month/6": {
"title": "$:/language/Date/Long/Month/6",
"text": "June"
},
"$:/language/Date/Long/Month/7": {
"title": "$:/language/Date/Long/Month/7",
"text": "July"
},
"$:/language/Date/Long/Month/8": {
"title": "$:/language/Date/Long/Month/8",
"text": "August"
},
"$:/language/Date/Long/Month/9": {
"title": "$:/language/Date/Long/Month/9",
"text": "September"
},
"$:/language/Date/Long/Month/10": {
"title": "$:/language/Date/Long/Month/10",
"text": "October"
},
"$:/language/Date/Long/Month/11": {
"title": "$:/language/Date/Long/Month/11",
"text": "November"
},
"$:/language/Date/Long/Month/12": {
"title": "$:/language/Date/Long/Month/12",
"text": "December"
},
"$:/language/Date/Period/am": {
"title": "$:/language/Date/Period/am",
"text": "am"
},
"$:/language/Date/Period/pm": {
"title": "$:/language/Date/Period/pm",
"text": "pm"
},
"$:/language/Date/Short/Day/0": {
"title": "$:/language/Date/Short/Day/0",
"text": "Sun"
},
"$:/language/Date/Short/Day/1": {
"title": "$:/language/Date/Short/Day/1",
"text": "Mon"
},
"$:/language/Date/Short/Day/2": {
"title": "$:/language/Date/Short/Day/2",
"text": "Tue"
},
"$:/language/Date/Short/Day/3": {
"title": "$:/language/Date/Short/Day/3",
"text": "Wed"
},
"$:/language/Date/Short/Day/4": {
"title": "$:/language/Date/Short/Day/4",
"text": "Thu"
},
"$:/language/Date/Short/Day/5": {
"title": "$:/language/Date/Short/Day/5",
"text": "Fri"
},
"$:/language/Date/Short/Day/6": {
"title": "$:/language/Date/Short/Day/6",
"text": "Sat"
},
"$:/language/Date/Short/Month/1": {
"title": "$:/language/Date/Short/Month/1",
"text": "Jan"
},
"$:/language/Date/Short/Month/2": {
"title": "$:/language/Date/Short/Month/2",
"text": "Feb"
},
"$:/language/Date/Short/Month/3": {
"title": "$:/language/Date/Short/Month/3",
"text": "Mar"
},
"$:/language/Date/Short/Month/4": {
"title": "$:/language/Date/Short/Month/4",
"text": "Apr"
},
"$:/language/Date/Short/Month/5": {
"title": "$:/language/Date/Short/Month/5",
"text": "May"
},
"$:/language/Date/Short/Month/6": {
"title": "$:/language/Date/Short/Month/6",
"text": "Jun"
},
"$:/language/Date/Short/Month/7": {
"title": "$:/language/Date/Short/Month/7",
"text": "Jul"
},
"$:/language/Date/Short/Month/8": {
"title": "$:/language/Date/Short/Month/8",
"text": "Aug"
},
"$:/language/Date/Short/Month/9": {
"title": "$:/language/Date/Short/Month/9",
"text": "Sep"
},
"$:/language/Date/Short/Month/10": {
"title": "$:/language/Date/Short/Month/10",
"text": "Oct"
},
"$:/language/Date/Short/Month/11": {
"title": "$:/language/Date/Short/Month/11",
"text": "Nov"
},
"$:/language/Date/Short/Month/12": {
"title": "$:/language/Date/Short/Month/12",
"text": "Dec"
},
"$:/language/RelativeDate/Future/Days": {
"title": "$:/language/RelativeDate/Future/Days",
"text": "<<period>> days from now"
},
"$:/language/RelativeDate/Future/Hours": {
"title": "$:/language/RelativeDate/Future/Hours",
"text": "<<period>> hours from now"
},
"$:/language/RelativeDate/Future/Minutes": {
"title": "$:/language/RelativeDate/Future/Minutes",
"text": "<<period>> minutes from now"
},
"$:/language/RelativeDate/Future/Months": {
"title": "$:/language/RelativeDate/Future/Months",
"text": "<<period>> months from now"
},
"$:/language/RelativeDate/Future/Second": {
"title": "$:/language/RelativeDate/Future/Second",
"text": "1 second from now"
},
"$:/language/RelativeDate/Future/Seconds": {
"title": "$:/language/RelativeDate/Future/Seconds",
"text": "<<period>> seconds from now"
},
"$:/language/RelativeDate/Future/Years": {
"title": "$:/language/RelativeDate/Future/Years",
"text": "<<period>> years from now"
},
"$:/language/RelativeDate/Past/Days": {
"title": "$:/language/RelativeDate/Past/Days",
"text": "<<period>> days ago"
},
"$:/language/RelativeDate/Past/Hours": {
"title": "$:/language/RelativeDate/Past/Hours",
"text": "<<period>> hours ago"
},
"$:/language/RelativeDate/Past/Minutes": {
"title": "$:/language/RelativeDate/Past/Minutes",
"text": "<<period>> minutes ago"
},
"$:/language/RelativeDate/Past/Months": {
"title": "$:/language/RelativeDate/Past/Months",
"text": "<<period>> months ago"
},
"$:/language/RelativeDate/Past/Second": {
"title": "$:/language/RelativeDate/Past/Second",
"text": "1 second ago"
},
"$:/language/RelativeDate/Past/Seconds": {
"title": "$:/language/RelativeDate/Past/Seconds",
"text": "<<period>> seconds ago"
},
"$:/language/RelativeDate/Past/Years": {
"title": "$:/language/RelativeDate/Past/Years",
"text": "<<period>> years ago"
},
"$:/language/Docs/ModuleTypes/allfilteroperator": {
"title": "$:/language/Docs/ModuleTypes/allfilteroperator",
"text": "A sub-operator for the ''all'' filter operator."
},
"$:/language/Docs/ModuleTypes/animation": {
"title": "$:/language/Docs/ModuleTypes/animation",
"text": "Animations that may be used with the RevealWidget."
},
"$:/language/Docs/ModuleTypes/authenticator": {
"title": "$:/language/Docs/ModuleTypes/authenticator",
"text": "Defines how requests are authenticated by the built-in HTTP server."
},
"$:/language/Docs/ModuleTypes/bitmapeditoroperation": {
"title": "$:/language/Docs/ModuleTypes/bitmapeditoroperation",
"text": "A bitmap editor toolbar operation."
},
"$:/language/Docs/ModuleTypes/command": {
"title": "$:/language/Docs/ModuleTypes/command",
"text": "Commands that can be executed under Node.js."
},
"$:/language/Docs/ModuleTypes/config": {
"title": "$:/language/Docs/ModuleTypes/config",
"text": "Data to be inserted into `$tw.config`."
},
"$:/language/Docs/ModuleTypes/filteroperator": {
"title": "$:/language/Docs/ModuleTypes/filteroperator",
"text": "Individual filter operator methods."
},
"$:/language/Docs/ModuleTypes/global": {
"title": "$:/language/Docs/ModuleTypes/global",
"text": "Global data to be inserted into `$tw`."
},
"$:/language/Docs/ModuleTypes/info": {
"title": "$:/language/Docs/ModuleTypes/info",
"text": "Publishes system information via the [[$:/temp/info-plugin]] pseudo-plugin."
},
"$:/language/Docs/ModuleTypes/isfilteroperator": {
"title": "$:/language/Docs/ModuleTypes/isfilteroperator",
"text": "Operands for the ''is'' filter operator."
},
"$:/language/Docs/ModuleTypes/library": {
"title": "$:/language/Docs/ModuleTypes/library",
"text": "Generic module type for general purpose JavaScript modules."
},
"$:/language/Docs/ModuleTypes/macro": {
"title": "$:/language/Docs/ModuleTypes/macro",
"text": "JavaScript macro definitions."
},
"$:/language/Docs/ModuleTypes/parser": {
"title": "$:/language/Docs/ModuleTypes/parser",
"text": "Parsers for different content types."
},
"$:/language/Docs/ModuleTypes/route": {
"title": "$:/language/Docs/ModuleTypes/route",
"text": "Defines how individual URL patterns are handled by the built-in HTTP server."
},
"$:/language/Docs/ModuleTypes/saver": {
"title": "$:/language/Docs/ModuleTypes/saver",
"text": "Savers handle different methods for saving files from the browser."
},
"$:/language/Docs/ModuleTypes/startup": {
"title": "$:/language/Docs/ModuleTypes/startup",
"text": "Startup functions."
},
"$:/language/Docs/ModuleTypes/storyview": {
"title": "$:/language/Docs/ModuleTypes/storyview",
"text": "Story views customise the animation and behaviour of list widgets."
},
"$:/language/Docs/ModuleTypes/texteditoroperation": {
"title": "$:/language/Docs/ModuleTypes/texteditoroperation",
"text": "A text editor toolbar operation."
},
"$:/language/Docs/ModuleTypes/tiddlerdeserializer": {
"title": "$:/language/Docs/ModuleTypes/tiddlerdeserializer",
"text": "Converts different content types into tiddlers."
},
"$:/language/Docs/ModuleTypes/tiddlerfield": {
"title": "$:/language/Docs/ModuleTypes/tiddlerfield",
"text": "Defines the behaviour of an individual tiddler field."
},
"$:/language/Docs/ModuleTypes/tiddlermethod": {
"title": "$:/language/Docs/ModuleTypes/tiddlermethod",
"text": "Adds methods to the `$tw.Tiddler` prototype."
},
"$:/language/Docs/ModuleTypes/upgrader": {
"title": "$:/language/Docs/ModuleTypes/upgrader",
"text": "Applies upgrade processing to tiddlers during an upgrade/import."
},
"$:/language/Docs/ModuleTypes/utils": {
"title": "$:/language/Docs/ModuleTypes/utils",
"text": "Adds methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/utils-node": {
"title": "$:/language/Docs/ModuleTypes/utils-node",
"text": "Adds Node.js-specific methods to `$tw.utils`."
},
"$:/language/Docs/ModuleTypes/widget": {
"title": "$:/language/Docs/ModuleTypes/widget",
"text": "Widgets encapsulate DOM rendering and refreshing."
},
"$:/language/Docs/ModuleTypes/wikimethod": {
"title": "$:/language/Docs/ModuleTypes/wikimethod",
"text": "Adds methods to `$tw.Wiki`."
},
"$:/language/Docs/ModuleTypes/wikirule": {
"title": "$:/language/Docs/ModuleTypes/wikirule",
"text": "Individual parser rules for the main WikiText parser."
},
"$:/language/Docs/PaletteColours/alert-background": {
"title": "$:/language/Docs/PaletteColours/alert-background",
"text": "Alert background"
},
"$:/language/Docs/PaletteColours/alert-border": {
"title": "$:/language/Docs/PaletteColours/alert-border",
"text": "Alert border"
},
"$:/language/Docs/PaletteColours/alert-highlight": {
"title": "$:/language/Docs/PaletteColours/alert-highlight",
"text": "Alert highlight"
},
"$:/language/Docs/PaletteColours/alert-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/alert-muted-foreground",
"text": "Alert muted foreground"
},
"$:/language/Docs/PaletteColours/background": {
"title": "$:/language/Docs/PaletteColours/background",
"text": "General background"
},
"$:/language/Docs/PaletteColours/blockquote-bar": {
"title": "$:/language/Docs/PaletteColours/blockquote-bar",
"text": "Blockquote bar"
},
"$:/language/Docs/PaletteColours/button-background": {
"title": "$:/language/Docs/PaletteColours/button-background",
"text": "Default button background"
},
"$:/language/Docs/PaletteColours/button-border": {
"title": "$:/language/Docs/PaletteColours/button-border",
"text": "Default button border"
},
"$:/language/Docs/PaletteColours/button-foreground": {
"title": "$:/language/Docs/PaletteColours/button-foreground",
"text": "Default button foreground"
},
"$:/language/Docs/PaletteColours/dirty-indicator": {
"title": "$:/language/Docs/PaletteColours/dirty-indicator",
"text": "Unsaved changes indicator"
},
"$:/language/Docs/PaletteColours/code-background": {
"title": "$:/language/Docs/PaletteColours/code-background",
"text": "Code background"
},
"$:/language/Docs/PaletteColours/code-border": {
"title": "$:/language/Docs/PaletteColours/code-border",
"text": "Code border"
},
"$:/language/Docs/PaletteColours/code-foreground": {
"title": "$:/language/Docs/PaletteColours/code-foreground",
"text": "Code foreground"
},
"$:/language/Docs/PaletteColours/download-background": {
"title": "$:/language/Docs/PaletteColours/download-background",
"text": "Download button background"
},
"$:/language/Docs/PaletteColours/download-foreground": {
"title": "$:/language/Docs/PaletteColours/download-foreground",
"text": "Download button foreground"
},
"$:/language/Docs/PaletteColours/dragger-background": {
"title": "$:/language/Docs/PaletteColours/dragger-background",
"text": "Dragger background"
},
"$:/language/Docs/PaletteColours/dragger-foreground": {
"title": "$:/language/Docs/PaletteColours/dragger-foreground",
"text": "Dragger foreground"
},
"$:/language/Docs/PaletteColours/dropdown-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-background",
"text": "Dropdown background"
},
"$:/language/Docs/PaletteColours/dropdown-border": {
"title": "$:/language/Docs/PaletteColours/dropdown-border",
"text": "Dropdown border"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background-selected",
"text": "Dropdown tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/dropdown-tab-background": {
"title": "$:/language/Docs/PaletteColours/dropdown-tab-background",
"text": "Dropdown tab background"
},
"$:/language/Docs/PaletteColours/dropzone-background": {
"title": "$:/language/Docs/PaletteColours/dropzone-background",
"text": "Dropzone background"
},
"$:/language/Docs/PaletteColours/external-link-background-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-background-hover",
"text": "External link background hover"
},
"$:/language/Docs/PaletteColours/external-link-background-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-background-visited",
"text": "External link background visited"
},
"$:/language/Docs/PaletteColours/external-link-background": {
"title": "$:/language/Docs/PaletteColours/external-link-background",
"text": "External link background"
},
"$:/language/Docs/PaletteColours/external-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-hover",
"text": "External link foreground hover"
},
"$:/language/Docs/PaletteColours/external-link-foreground-visited": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground-visited",
"text": "External link foreground visited"
},
"$:/language/Docs/PaletteColours/external-link-foreground": {
"title": "$:/language/Docs/PaletteColours/external-link-foreground",
"text": "External link foreground"
},
"$:/language/Docs/PaletteColours/foreground": {
"title": "$:/language/Docs/PaletteColours/foreground",
"text": "General foreground"
},
"$:/language/Docs/PaletteColours/menubar-background": {
"title": "$:/language/Docs/PaletteColours/menubar-background",
"text": "Menu bar background"
},
"$:/language/Docs/PaletteColours/menubar-foreground": {
"title": "$:/language/Docs/PaletteColours/menubar-foreground",
"text": "Menu bar foreground"
},
"$:/language/Docs/PaletteColours/message-background": {
"title": "$:/language/Docs/PaletteColours/message-background",
"text": "Message box background"
},
"$:/language/Docs/PaletteColours/message-border": {
"title": "$:/language/Docs/PaletteColours/message-border",
"text": "Message box border"
},
"$:/language/Docs/PaletteColours/message-foreground": {
"title": "$:/language/Docs/PaletteColours/message-foreground",
"text": "Message box foreground"
},
"$:/language/Docs/PaletteColours/modal-backdrop": {
"title": "$:/language/Docs/PaletteColours/modal-backdrop",
"text": "Modal backdrop"
},
"$:/language/Docs/PaletteColours/modal-background": {
"title": "$:/language/Docs/PaletteColours/modal-background",
"text": "Modal background"
},
"$:/language/Docs/PaletteColours/modal-border": {
"title": "$:/language/Docs/PaletteColours/modal-border",
"text": "Modal border"
},
"$:/language/Docs/PaletteColours/modal-footer-background": {
"title": "$:/language/Docs/PaletteColours/modal-footer-background",
"text": "Modal footer background"
},
"$:/language/Docs/PaletteColours/modal-footer-border": {
"title": "$:/language/Docs/PaletteColours/modal-footer-border",
"text": "Modal footer border"
},
"$:/language/Docs/PaletteColours/modal-header-border": {
"title": "$:/language/Docs/PaletteColours/modal-header-border",
"text": "Modal header border"
},
"$:/language/Docs/PaletteColours/muted-foreground": {
"title": "$:/language/Docs/PaletteColours/muted-foreground",
"text": "General muted foreground"
},
"$:/language/Docs/PaletteColours/notification-background": {
"title": "$:/language/Docs/PaletteColours/notification-background",
"text": "Notification background"
},
"$:/language/Docs/PaletteColours/notification-border": {
"title": "$:/language/Docs/PaletteColours/notification-border",
"text": "Notification border"
},
"$:/language/Docs/PaletteColours/page-background": {
"title": "$:/language/Docs/PaletteColours/page-background",
"text": "Page background"
},
"$:/language/Docs/PaletteColours/pre-background": {
"title": "$:/language/Docs/PaletteColours/pre-background",
"text": "Preformatted code background"
},
"$:/language/Docs/PaletteColours/pre-border": {
"title": "$:/language/Docs/PaletteColours/pre-border",
"text": "Preformatted code border"
},
"$:/language/Docs/PaletteColours/primary": {
"title": "$:/language/Docs/PaletteColours/primary",
"text": "General primary"
},
"$:/language/Docs/PaletteColours/select-tag-background": {
"title": "$:/language/Docs/PaletteColours/select-tag-background",
"text": "`<select>` element background"
},
"$:/language/Docs/PaletteColours/select-tag-foreground": {
"title": "$:/language/Docs/PaletteColours/select-tag-foreground",
"text": "`<select>` element text"
},
"$:/language/Docs/PaletteColours/sidebar-button-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-button-foreground",
"text": "Sidebar button foreground"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground-hover",
"text": "Sidebar controls foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-controls-foreground",
"text": "Sidebar controls foreground"
},
"$:/language/Docs/PaletteColours/sidebar-foreground-shadow": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground-shadow",
"text": "Sidebar foreground shadow"
},
"$:/language/Docs/PaletteColours/sidebar-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-foreground",
"text": "Sidebar foreground"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground-hover",
"text": "Sidebar muted foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-muted-foreground",
"text": "Sidebar muted foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background-selected",
"text": "Sidebar tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-background": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-background",
"text": "Sidebar tab background"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border-selected",
"text": "Sidebar tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-border": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-border",
"text": "Sidebar tab border"
},
"$:/language/Docs/PaletteColours/sidebar-tab-divider": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-divider",
"text": "Sidebar tab divider"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground-selected",
"text": "Sidebar tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/sidebar-tab-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tab-foreground",
"text": "Sidebar tab foreground"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground-hover",
"text": "Sidebar tiddler link foreground hover"
},
"$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/sidebar-tiddler-link-foreground",
"text": "Sidebar tiddler link foreground"
},
"$:/language/Docs/PaletteColours/site-title-foreground": {
"title": "$:/language/Docs/PaletteColours/site-title-foreground",
"text": "Site title foreground"
},
"$:/language/Docs/PaletteColours/static-alert-foreground": {
"title": "$:/language/Docs/PaletteColours/static-alert-foreground",
"text": "Static alert foreground"
},
"$:/language/Docs/PaletteColours/tab-background-selected": {
"title": "$:/language/Docs/PaletteColours/tab-background-selected",
"text": "Tab background for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-background": {
"title": "$:/language/Docs/PaletteColours/tab-background",
"text": "Tab background"
},
"$:/language/Docs/PaletteColours/tab-border-selected": {
"title": "$:/language/Docs/PaletteColours/tab-border-selected",
"text": "Tab border for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-border": {
"title": "$:/language/Docs/PaletteColours/tab-border",
"text": "Tab border"
},
"$:/language/Docs/PaletteColours/tab-divider": {
"title": "$:/language/Docs/PaletteColours/tab-divider",
"text": "Tab divider"
},
"$:/language/Docs/PaletteColours/tab-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tab-foreground-selected",
"text": "Tab foreground for selected tabs"
},
"$:/language/Docs/PaletteColours/tab-foreground": {
"title": "$:/language/Docs/PaletteColours/tab-foreground",
"text": "Tab foreground"
},
"$:/language/Docs/PaletteColours/table-border": {
"title": "$:/language/Docs/PaletteColours/table-border",
"text": "Table border"
},
"$:/language/Docs/PaletteColours/table-footer-background": {
"title": "$:/language/Docs/PaletteColours/table-footer-background",
"text": "Table footer background"
},
"$:/language/Docs/PaletteColours/table-header-background": {
"title": "$:/language/Docs/PaletteColours/table-header-background",
"text": "Table header background"
},
"$:/language/Docs/PaletteColours/tag-background": {
"title": "$:/language/Docs/PaletteColours/tag-background",
"text": "Tag background"
},
"$:/language/Docs/PaletteColours/tag-foreground": {
"title": "$:/language/Docs/PaletteColours/tag-foreground",
"text": "Tag foreground"
},
"$:/language/Docs/PaletteColours/tiddler-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-background",
"text": "Tiddler background"
},
"$:/language/Docs/PaletteColours/tiddler-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-border",
"text": "Tiddler border"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-hover",
"text": "Tiddler controls foreground hover"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground-selected",
"text": "Tiddler controls foreground for selected controls"
},
"$:/language/Docs/PaletteColours/tiddler-controls-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-controls-foreground",
"text": "Tiddler controls foreground"
},
"$:/language/Docs/PaletteColours/tiddler-editor-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-background",
"text": "Tiddler editor background"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border-image": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border-image",
"text": "Tiddler editor border image"
},
"$:/language/Docs/PaletteColours/tiddler-editor-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-border",
"text": "Tiddler editor border"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-even": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-even",
"text": "Tiddler editor background for even fields"
},
"$:/language/Docs/PaletteColours/tiddler-editor-fields-odd": {
"title": "$:/language/Docs/PaletteColours/tiddler-editor-fields-odd",
"text": "Tiddler editor background for odd fields"
},
"$:/language/Docs/PaletteColours/tiddler-info-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-background",
"text": "Tiddler info panel background"
},
"$:/language/Docs/PaletteColours/tiddler-info-border": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-border",
"text": "Tiddler info panel border"
},
"$:/language/Docs/PaletteColours/tiddler-info-tab-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-info-tab-background",
"text": "Tiddler info panel tab background"
},
"$:/language/Docs/PaletteColours/tiddler-link-background": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-background",
"text": "Tiddler link background"
},
"$:/language/Docs/PaletteColours/tiddler-link-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-link-foreground",
"text": "Tiddler link foreground"
},
"$:/language/Docs/PaletteColours/tiddler-subtitle-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-subtitle-foreground",
"text": "Tiddler subtitle foreground"
},
"$:/language/Docs/PaletteColours/tiddler-title-foreground": {
"title": "$:/language/Docs/PaletteColours/tiddler-title-foreground",
"text": "Tiddler title foreground"
},
"$:/language/Docs/PaletteColours/toolbar-new-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-new-button",
"text": "Toolbar 'new tiddler' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-options-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-options-button",
"text": "Toolbar 'options' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-save-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-save-button",
"text": "Toolbar 'save' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-info-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-info-button",
"text": "Toolbar 'info' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-edit-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-edit-button",
"text": "Toolbar 'edit' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-close-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-close-button",
"text": "Toolbar 'close' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-delete-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-delete-button",
"text": "Toolbar 'delete' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-cancel-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-cancel-button",
"text": "Toolbar 'cancel' button foreground"
},
"$:/language/Docs/PaletteColours/toolbar-done-button": {
"title": "$:/language/Docs/PaletteColours/toolbar-done-button",
"text": "Toolbar 'done' button foreground"
},
"$:/language/Docs/PaletteColours/untagged-background": {
"title": "$:/language/Docs/PaletteColours/untagged-background",
"text": "Untagged pill background"
},
"$:/language/Docs/PaletteColours/very-muted-foreground": {
"title": "$:/language/Docs/PaletteColours/very-muted-foreground",
"text": "Very muted foreground"
},
"$:/language/EditTemplate/Body/External/Hint": {
"title": "$:/language/EditTemplate/Body/External/Hint",
"text": "This tiddler shows content stored outside of the main TiddlyWiki file. You can edit the tags and fields but cannot directly edit the content itself"
},
"$:/language/EditTemplate/Body/Placeholder": {
"title": "$:/language/EditTemplate/Body/Placeholder",
"text": "Type the text for this tiddler"
},
"$:/language/EditTemplate/Body/Preview/Type/Output": {
"title": "$:/language/EditTemplate/Body/Preview/Type/Output",
"text": "output"
},
"$:/language/EditTemplate/Field/Remove/Caption": {
"title": "$:/language/EditTemplate/Field/Remove/Caption",
"text": "remove field"
},
"$:/language/EditTemplate/Field/Remove/Hint": {
"title": "$:/language/EditTemplate/Field/Remove/Hint",
"text": "Remove field"
},
"$:/language/EditTemplate/Field/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Field/Dropdown/Caption",
"text": "field list"
},
"$:/language/EditTemplate/Field/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Field/Dropdown/Hint",
"text": "Show field list"
},
"$:/language/EditTemplate/Fields/Add/Button": {
"title": "$:/language/EditTemplate/Fields/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Fields/Add/Button/Hint": {
"title": "$:/language/EditTemplate/Fields/Add/Button/Hint",
"text": "Add the new field to the tiddler"
},
"$:/language/EditTemplate/Fields/Add/Name/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Name/Placeholder",
"text": "field name"
},
"$:/language/EditTemplate/Fields/Add/Prompt": {
"title": "$:/language/EditTemplate/Fields/Add/Prompt",
"text": "Add a new field:"
},
"$:/language/EditTemplate/Fields/Add/Value/Placeholder": {
"title": "$:/language/EditTemplate/Fields/Add/Value/Placeholder",
"text": "field value"
},
"$:/language/EditTemplate/Fields/Add/Dropdown/System": {
"title": "$:/language/EditTemplate/Fields/Add/Dropdown/System",
"text": "System fields"
},
"$:/language/EditTemplate/Fields/Add/Dropdown/User": {
"title": "$:/language/EditTemplate/Fields/Add/Dropdown/User",
"text": "User fields"
},
"$:/language/EditTemplate/Shadow/Warning": {
"title": "$:/language/EditTemplate/Shadow/Warning",
"text": "This is a shadow tiddler. Any changes you make will override the default version from the plugin <<pluginLink>>"
},
"$:/language/EditTemplate/Shadow/OverriddenWarning": {
"title": "$:/language/EditTemplate/Shadow/OverriddenWarning",
"text": "This is a modified shadow tiddler. You can revert to the default version in the plugin <<pluginLink>> by deleting this tiddler"
},
"$:/language/EditTemplate/Tags/Add/Button": {
"title": "$:/language/EditTemplate/Tags/Add/Button",
"text": "add"
},
"$:/language/EditTemplate/Tags/Add/Button/Hint": {
"title": "$:/language/EditTemplate/Tags/Add/Button/Hint",
"text": "add tag"
},
"$:/language/EditTemplate/Tags/Add/Placeholder": {
"title": "$:/language/EditTemplate/Tags/Add/Placeholder",
"text": "tag name"
},
"$:/language/EditTemplate/Tags/ClearInput/Caption": {
"title": "$:/language/EditTemplate/Tags/ClearInput/Caption",
"text": "clear input"
},
"$:/language/EditTemplate/Tags/ClearInput/Hint": {
"title": "$:/language/EditTemplate/Tags/ClearInput/Hint",
"text": "Clear tag input"
},
"$:/language/EditTemplate/Tags/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Caption",
"text": "tag list"
},
"$:/language/EditTemplate/Tags/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Tags/Dropdown/Hint",
"text": "Show tag list"
},
"$:/language/EditTemplate/Title/BadCharacterWarning": {
"title": "$:/language/EditTemplate/Title/BadCharacterWarning",
"text": "Warning: avoid using any of the characters <<bad-chars>> in tiddler titles"
},
"$:/language/EditTemplate/Title/Exists/Prompt": {
"title": "$:/language/EditTemplate/Title/Exists/Prompt",
"text": "Target tiddler already exists"
},
"$:/language/EditTemplate/Title/Relink/Prompt": {
"title": "$:/language/EditTemplate/Title/Relink/Prompt",
"text": "Update ''<$text text=<<fromTitle>>/>'' to ''<$text text=<<toTitle>>/>'' in the //tags// and //list// fields of other tiddlers"
},
"$:/language/EditTemplate/Title/References/Prompt": {
"title": "$:/language/EditTemplate/Title/References/Prompt",
"text": "The following references to this tiddler will not be automatically updated:"
},
"$:/language/EditTemplate/Type/Dropdown/Caption": {
"title": "$:/language/EditTemplate/Type/Dropdown/Caption",
"text": "content type list"
},
"$:/language/EditTemplate/Type/Dropdown/Hint": {
"title": "$:/language/EditTemplate/Type/Dropdown/Hint",
"text": "Show content type list"
},
"$:/language/EditTemplate/Type/Delete/Caption": {
"title": "$:/language/EditTemplate/Type/Delete/Caption",
"text": "delete content type"
},
"$:/language/EditTemplate/Type/Delete/Hint": {
"title": "$:/language/EditTemplate/Type/Delete/Hint",
"text": "Delete content type"
},
"$:/language/EditTemplate/Type/Placeholder": {
"title": "$:/language/EditTemplate/Type/Placeholder",
"text": "content type"
},
"$:/language/EditTemplate/Type/Prompt": {
"title": "$:/language/EditTemplate/Type/Prompt",
"text": "Type:"
},
"$:/language/Exporters/StaticRiver": {
"title": "$:/language/Exporters/StaticRiver",
"text": "Static HTML"
},
"$:/language/Exporters/JsonFile": {
"title": "$:/language/Exporters/JsonFile",
"text": "JSON file"
},
"$:/language/Exporters/CsvFile": {
"title": "$:/language/Exporters/CsvFile",
"text": "CSV file"
},
"$:/language/Exporters/TidFile": {
"title": "$:/language/Exporters/TidFile",
"text": "\".tid\" file"
},
"$:/language/Docs/Fields/_canonical_uri": {
"title": "$:/language/Docs/Fields/_canonical_uri",
"text": "The full URI of an external image tiddler"
},
"$:/language/Docs/Fields/bag": {
"title": "$:/language/Docs/Fields/bag",
"text": "The name of the bag from which a tiddler came"
},
"$:/language/Docs/Fields/caption": {
"title": "$:/language/Docs/Fields/caption",
"text": "The text to be displayed on a tab or button"
},
"$:/language/Docs/Fields/color": {
"title": "$:/language/Docs/Fields/color",
"text": "The CSS color value associated with a tiddler"
},
"$:/language/Docs/Fields/component": {
"title": "$:/language/Docs/Fields/component",
"text": "The name of the component responsible for an [[alert tiddler|AlertMechanism]]"
},
"$:/language/Docs/Fields/current-tiddler": {
"title": "$:/language/Docs/Fields/current-tiddler",
"text": "Used to cache the top tiddler in a [[history list|HistoryMechanism]]"
},
"$:/language/Docs/Fields/created": {
"title": "$:/language/Docs/Fields/created",
"text": "The date a tiddler was created"
},
"$:/language/Docs/Fields/creator": {
"title": "$:/language/Docs/Fields/creator",
"text": "The name of the person who created a tiddler"
},
"$:/language/Docs/Fields/dependents": {
"title": "$:/language/Docs/Fields/dependents",
"text": "For a plugin, lists the dependent plugin titles"
},
"$:/language/Docs/Fields/description": {
"title": "$:/language/Docs/Fields/description",
"text": "The descriptive text for a plugin, or a modal dialogue"
},
"$:/language/Docs/Fields/draft.of": {
"title": "$:/language/Docs/Fields/draft.of",
"text": "For draft tiddlers, contains the title of the tiddler of which this is a draft"
},
"$:/language/Docs/Fields/draft.title": {
"title": "$:/language/Docs/Fields/draft.title",
"text": "For draft tiddlers, contains the proposed new title of the tiddler"
},
"$:/language/Docs/Fields/footer": {
"title": "$:/language/Docs/Fields/footer",
"text": "The footer text for a wizard"
},
"$:/language/Docs/Fields/hide-body": {
"title": "$:/language/Docs/Fields/hide-body",
"text": "The view template will hide bodies of tiddlers if set to: ''yes''"
},
"$:/language/Docs/Fields/icon": {
"title": "$:/language/Docs/Fields/icon",
"text": "The title of the tiddler containing the icon associated with a tiddler"
},
"$:/language/Docs/Fields/library": {
"title": "$:/language/Docs/Fields/library",
"text": "Indicates that a tiddler should be saved as a JavaScript library if set to: ''yes''"
},
"$:/language/Docs/Fields/list": {
"title": "$:/language/Docs/Fields/list",
"text": "An ordered list of tiddler titles associated with a tiddler"
},
"$:/language/Docs/Fields/list-before": {
"title": "$:/language/Docs/Fields/list-before",
"text": "If set, the title of a tiddler before which this tiddler should be added to the ordered list of tiddler titles, or at the start of the list if this field is present but empty"
},
"$:/language/Docs/Fields/list-after": {
"title": "$:/language/Docs/Fields/list-after",
"text": "If set, the title of the tiddler after which this tiddler should be added to the ordered list of tiddler titles, or at the end of the list if this field is present but empty"
},
"$:/language/Docs/Fields/modified": {
"title": "$:/language/Docs/Fields/modified",
"text": "The date and time at which a tiddler was last modified"
},
"$:/language/Docs/Fields/modifier": {
"title": "$:/language/Docs/Fields/modifier",
"text": "The tiddler title associated with the person who last modified a tiddler"
},
"$:/language/Docs/Fields/name": {
"title": "$:/language/Docs/Fields/name",
"text": "The human readable name associated with a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-priority": {
"title": "$:/language/Docs/Fields/plugin-priority",
"text": "A numerical value indicating the priority of a plugin tiddler"
},
"$:/language/Docs/Fields/plugin-type": {
"title": "$:/language/Docs/Fields/plugin-type",
"text": "The type of plugin in a plugin tiddler"
},
"$:/language/Docs/Fields/revision": {
"title": "$:/language/Docs/Fields/revision",
"text": "The revision of the tiddler held at the server"
},
"$:/language/Docs/Fields/released": {
"title": "$:/language/Docs/Fields/released",
"text": "Date of a TiddlyWiki release"
},
"$:/language/Docs/Fields/source": {
"title": "$:/language/Docs/Fields/source",
"text": "The source URL associated with a tiddler"
},
"$:/language/Docs/Fields/subtitle": {
"title": "$:/language/Docs/Fields/subtitle",
"text": "The subtitle text for a wizard"
},
"$:/language/Docs/Fields/tags": {
"title": "$:/language/Docs/Fields/tags",
"text": "A list of tags associated with a tiddler"
},
"$:/language/Docs/Fields/text": {
"title": "$:/language/Docs/Fields/text",
"text": "The body text of a tiddler"
},
"$:/language/Docs/Fields/throttle.refresh": {
"title": "$:/language/Docs/Fields/throttle.refresh",
"text": "If present, throttles refreshes of this tiddler"
},
"$:/language/Docs/Fields/title": {
"title": "$:/language/Docs/Fields/title",
"text": "The unique name of a tiddler"
},
"$:/language/Docs/Fields/toc-link": {
"title": "$:/language/Docs/Fields/toc-link",
"text": "Suppresses the tiddler's link in a Table of Contents tree if set to: ''no''"
},
"$:/language/Docs/Fields/type": {
"title": "$:/language/Docs/Fields/type",
"text": "The content type of a tiddler"
},
"$:/language/Docs/Fields/version": {
"title": "$:/language/Docs/Fields/version",
"text": "Version information for a plugin"
},
"$:/language/Docs/Fields/_is_skinny": {
"title": "$:/language/Docs/Fields/_is_skinny",
"text": "If present, indicates that the tiddler text field must be loaded from the server"
},
"$:/language/Filters/AllTiddlers": {
"title": "$:/language/Filters/AllTiddlers",
"text": "All tiddlers except system tiddlers"
},
"$:/language/Filters/RecentSystemTiddlers": {
"title": "$:/language/Filters/RecentSystemTiddlers",
"text": "Recently modified tiddlers, including system tiddlers"
},
"$:/language/Filters/RecentTiddlers": {
"title": "$:/language/Filters/RecentTiddlers",
"text": "Recently modified tiddlers"
},
"$:/language/Filters/AllTags": {
"title": "$:/language/Filters/AllTags",
"text": "All tags except system tags"
},
"$:/language/Filters/Missing": {
"title": "$:/language/Filters/Missing",
"text": "Missing tiddlers"
},
"$:/language/Filters/Drafts": {
"title": "$:/language/Filters/Drafts",
"text": "Draft tiddlers"
},
"$:/language/Filters/Orphans": {
"title": "$:/language/Filters/Orphans",
"text": "Orphan tiddlers"
},
"$:/language/Filters/SystemTiddlers": {
"title": "$:/language/Filters/SystemTiddlers",
"text": "System tiddlers"
},
"$:/language/Filters/ShadowTiddlers": {
"title": "$:/language/Filters/ShadowTiddlers",
"text": "Shadow tiddlers"
},
"$:/language/Filters/OverriddenShadowTiddlers": {
"title": "$:/language/Filters/OverriddenShadowTiddlers",
"text": "Overridden shadow tiddlers"
},
"$:/language/Filters/SessionTiddlers": {
"title": "$:/language/Filters/SessionTiddlers",
"text": "Tiddlers modified since the wiki was loaded"
},
"$:/language/Filters/SystemTags": {
"title": "$:/language/Filters/SystemTags",
"text": "System tags"
},
"$:/language/Filters/StoryList": {
"title": "$:/language/Filters/StoryList",
"text": "Tiddlers in the story river, excluding <$text text=\"$:/AdvancedSearch\"/>"
},
"$:/language/Filters/TypedTiddlers": {
"title": "$:/language/Filters/TypedTiddlers",
"text": "Non wiki-text tiddlers"
},
"GettingStarted": {
"title": "GettingStarted",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\nWelcome to ~TiddlyWiki and the ~TiddlyWiki community\n\nBefore you start storing important information in ~TiddlyWiki it is vital to make sure that you can reliably save changes. See https://tiddlywiki.com/#GettingStarted for details\n\n!! Set up this ~TiddlyWiki\n\n<div class=\"tc-control-panel\">\n\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n</div>\n\nSee the [[control panel|$:/ControlPanel]] for more options.\n"
},
"$:/language/Help/build": {
"title": "$:/language/Help/build",
"description": "Automatically run configured commands",
"text": "Build the specified build targets for the current wiki. If no build targets are specified then all available targets will be built.\n\n```\n--build <target> [<target> ...]\n```\n\nBuild targets are defined in the `tiddlywiki.info` file of a wiki folder.\n\n"
},
"$:/language/Help/clearpassword": {
"title": "$:/language/Help/clearpassword",
"description": "Clear a password for subsequent crypto operations",
"text": "Clear the password for subsequent crypto operations\n\n```\n--clearpassword\n```\n"
},
"$:/language/Help/default": {
"title": "$:/language/Help/default",
"text": "\\define commandTitle()\n$:/language/Help/$(command)$\n\\end\n```\nusage: tiddlywiki [<wikifolder>] [--<command> [<args>...]...]\n```\n\nAvailable commands:\n\n<ul>\n<$list filter=\"[commands[]sort[title]]\" variable=\"command\">\n<li><$link to=<<commandTitle>>><$macrocall $name=\"command\" $type=\"text/plain\" $output=\"text/plain\"/></$link>: <$transclude tiddler=<<commandTitle>> field=\"description\"/></li>\n</$list>\n</ul>\n\nTo get detailed help on a command:\n\n```\ntiddlywiki --help <command>\n```\n"
},
"$:/language/Help/deletetiddlers": {
"title": "$:/language/Help/deletetiddlers",
"description": "Deletes a group of tiddlers",
"text": "<<.from-version \"5.1.20\">> Deletes a group of tiddlers identified by a filter.\n\n```\n--deletetiddlers <filter>\n```\n"
},
"$:/language/Help/editions": {
"title": "$:/language/Help/editions",
"description": "Lists the available editions of TiddlyWiki",
"text": "Lists the names and descriptions of the available editions. You can create a new wiki of a specified edition with the `--init` command.\n\n```\n--editions\n```\n"
},
"$:/language/Help/fetch": {
"title": "$:/language/Help/fetch",
"description": "Fetch tiddlers from wiki by URL",
"text": "Fetch one or more files over HTTP/HTTPS, and import the tiddlers matching a filter, optionally transforming the incoming titles.\n\n```\n--fetch file <url> <import-filter> <transform-filter>\n--fetch files <url-filter> <import-filter> <transform-filter>\n--fetch raw-file <url> <transform-filter>\n--fetch raw-files <url-filter> <transform-filter>\n```\n\nThe \"file\" and \"files\" variants fetch the specified files and attempt to import the tiddlers within them (the same processing as if the files were dragged into the browser window). The \"raw-file\" and \"raw-files\" variants fetch the specified files and then store the raw file data in tiddlers, without applying the import logic.\n\nWith the \"file\" and \"raw-file\" variants only a single file is fetched and the first parameter is the URL of the file to read.\n\nWith the \"files\" and \"raw-files\" variants, multiple files are fetched and the first parameter is a filter yielding a list of URLs of the files to read. For example, given a set of tiddlers tagged \"remote-server\" that have a field \"url\" the filter `[tag[remote-server]get[url]]` will retrieve all the available URLs.\n\nFor the \"file\" and \"files\" variants, the `<import-filter>` parameter specifies a filter determining which tiddlers are imported. It defaults to `[all[tiddlers]]` if not provided.\n\nFor all variants, the `<transform-filter>` parameter specifies an optional filter that transforms the titles of the imported tiddlers. For example, `[addprefix[$:/myimports/]]` would add the prefix `$:/myimports/` to each title.\n\nPreceding the `--fetch` command with `--verbose` will output progress information during the import.\n\nNote that TiddlyWiki will not fetch an older version of an already loaded plugin.\n\nThe following example retrieves all the non-system tiddlers from https://tiddlywiki.com and saves them to a JSON file:\n\n```\ntiddlywiki --verbose --fetch file \"https://tiddlywiki.com/\" \"[!is[system]]\" \"\" --rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[!is[system]]\"\n```\n\nThe following example retrieves the \"favicon\" file from tiddlywiki.com and saves it in a file called \"output.ico\". Note that the intermediate tiddler \"Icon Tiddler\" is quoted in the \"--fetch\" command because it is being used as a transformation filter to replace the default title, while there are no quotes for the \"--savetiddler\" command because it is being used directly as a title.\n\n```\ntiddlywiki --verbose --fetch raw-file \"https://tiddlywiki.com/favicon.ico\" \"[[Icon Tiddler]]\" --savetiddler \"Icon Tiddler\" output.ico\n```\n\n"
},
"$:/language/Help/help": {
"title": "$:/language/Help/help",
"description": "Display help for TiddlyWiki commands",
"text": "Displays help text for a command:\n\n```\n--help [<command>]\n```\n\nIf the command name is omitted then a list of available commands is displayed.\n"
},
"$:/language/Help/import": {
"title": "$:/language/Help/import",
"description": "Import tiddlers from a file",
"text": "Import tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The deserializer must be explicitly specified, unlike the `load` command which infers the deserializer from the file extension.\n\n```\n--import <filepath> <deserializer> [<title>] [<encoding>]\n```\n\nThe deserializers in the core include:\n\n* application/javascript\n* application/json\n* application/x-tiddler\n* application/x-tiddler-html-div\n* application/x-tiddlers\n* text/html\n* text/plain\n\nThe title of the imported tiddler defaults to the filename.\n\nThe encoding defaults to \"utf8\", but can be \"base64\" for importing binary files.\n\nNote that TiddlyWiki will not import an older version of an already loaded plugin.\n"
},
"$:/language/Help/init": {
"title": "$:/language/Help/init",
"description": "Initialise a new wiki folder",
"text": "Initialise an empty [[WikiFolder|WikiFolders]] with a copy of the specified edition.\n\n```\n--init <edition> [<edition> ...]\n```\n\nFor example:\n\n```\ntiddlywiki ./MyWikiFolder --init empty\n```\n\nNote:\n\n* The wiki folder directory will be created if necessary\n* The \"edition\" defaults to ''empty''\n* The init command will fail if the wiki folder is not empty\n* The init command removes any `includeWikis` definitions in the edition's `tiddlywiki.info` file\n* When multiple editions are specified, editions initialised later will overwrite any files shared with earlier editions (so, the final `tiddlywiki.info` file will be copied from the last edition)\n* `--editions` returns a list of available editions\n"
},
"$:/language/Help/listen": {
"title": "$:/language/Help/listen",
"description": "Provides an HTTP server interface to TiddlyWiki",
"text": "Serves a wiki over HTTP.\n\nThe listen command uses NamedCommandParameters:\n\n```\n--listen [<name>=<value>]...\n```\n\nAll parameters are optional with safe defaults, and can be specified in any order. The recognised parameters are:\n\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''credentials'' - pathname of credentials CSV file (relative to wiki folder)\n* ''anon-username'' - the username for signing edits for anonymous users\n* ''username'' - optional username for basic authentication\n* ''password'' - optional password for basic authentication\n* ''authenticated-user-header'' - optional name of header to be used for trusted authentication\n* ''readers'' - comma separated list of principals allowed to read from this wiki\n* ''writers'' - comma separated list of principals allowed to write to this wiki\n* ''csrf-disable'' - set to \"yes\" to disable CSRF checks (defaults to \"no\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''tls-cert'' - pathname of TLS certificate file (relative to wiki folder)\n* ''tls-key'' - pathname of TLS key file (relative to wiki folder)\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n* ''gzip'' - set to \"yes\" to enable gzip compression for some http endpoints (defaults to \"no\")\n\nFor information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\n"
},
"$:/language/Help/load": {
"title": "$:/language/Help/load",
"description": "Load tiddlers from a file",
"text": "Load tiddlers from TiddlyWiki (`.html`), `.tiddler`, `.tid`, `.json` or other local files. The processing applied to incoming files is determined by the file extension. Use the alternative `import` command if you need to specify the deserializer and encoding explicitly.\n\n```\n--load <filepath> [noerror]\n--load <dirpath> [noerror]\n```\n\nBy default, the load command raises an error if no tiddlers are found. The error can be suppressed by providing the optional \"noerror\" parameter.\n\nTo load tiddlers from an encrypted TiddlyWiki file you should first specify the password with the PasswordCommand. For example:\n\n```\ntiddlywiki ./MyWiki --password pa55w0rd --load my_encrypted_wiki.html\n```\n\nNote that TiddlyWiki will not load an older version of an already loaded plugin.\n"
},
"$:/language/Help/makelibrary": {
"title": "$:/language/Help/makelibrary",
"description": "Construct library plugin required by upgrade process",
"text": "Constructs the `$:/UpgradeLibrary` tiddler for the upgrade process.\n\nThe upgrade library is formatted as an ordinary plugin tiddler with the plugin type `library`. It contains a copy of each of the plugins, themes and language packs available within the TiddlyWiki5 repository.\n\nThis command is intended for internal use; it is only relevant to users constructing a custom upgrade procedure.\n\n```\n--makelibrary <title>\n```\n\nThe title argument defaults to `$:/UpgradeLibrary`.\n"
},
"$:/language/Help/notfound": {
"title": "$:/language/Help/notfound",
"text": "No such help item"
},
"$:/language/Help/output": {
"title": "$:/language/Help/output",
"description": "Set the base output directory for subsequent commands",
"text": "Sets the base output directory for subsequent commands. The default output directory is the `output` subdirectory of the edition directory.\n\n```\n--output <pathname>\n```\n\nIf the specified pathname is relative then it is resolved relative to the current working directory. For example `--output .` sets the output directory to the current working directory.\n\n"
},
"$:/language/Help/password": {
"title": "$:/language/Help/password",
"description": "Set a password for subsequent crypto operations",
"text": "Set a password for subsequent crypto operations\n\n```\n--password <password>\n```\n\n''Note'': This should not be used for serving TiddlyWiki with password protection. Instead, see the password option under the [[ServerCommand]].\n"
},
"$:/language/Help/render": {
"title": "$:/language/Help/render",
"description": "Renders individual tiddlers to files",
"text": "Render individual tiddlers identified by a filter and save the results to the specified files.\n\nOptionally, the title of a template tiddler can be specified. In this case, instead of directly rendering each tiddler, the template tiddler is rendered with the \"currentTiddler\" variable set to the title of the tiddler that is being rendered.\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--render <tiddler-filter> [<filename-filter>] [<render-type>] [<template>] [<name>] [<value>]\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be rendered\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]addsuffix[.html]]`, which uses the unchanged tiddler title as the filename\n* ''render-type'': Optional render type: `text/html` (the default) returns the full HTML text and `text/plain` just returns the text content (ie it ignores HTML tags and other unprintable material)\n* ''template'': Optional template through which each tiddler is rendered\n* ''name'': Name of optional variable\n* ''value'': Value of optional variable\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When referring to a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--render \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being rendered, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--render` command is a more flexible replacement for both the `--rendertiddler` and `--rendertiddlers` commands, which are deprecated\n\nExamples:\n\n* `--render \"[!is[system]]\" \"[encodeuricomponent[]addprefix[tiddlers/]addsuffix[.html]]\"` -- renders all non-system tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles and the extension HTML\n\n"
},
"$:/language/Help/rendertiddler": {
"title": "$:/language/Help/rendertiddler",
"description": "Render an individual tiddler as a specified ContentType",
"text": "(Note: The `--rendertiddler` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender an individual tiddler as a specified ContentType, defaulting to `text/html` and save it to the specified filename.\n\nOptionally the title of a template tiddler can be specified, in which case the template tiddler is rendered with the \"currentTiddler\" variable set to the tiddler that is being rendered (the first parameter value).\n\nA name and value for an additional variable may optionally also be specified.\n\n```\n--rendertiddler <title> <filename> [<type>] [<template>] [<name>] [<value>]\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n\nFor example, the following command saves all tiddlers matching the filter `[tag[done]]` to a JSON file titled `output.json` by employing the core template `$:/core/templates/exporters/JsonFile`.\n\n```\n--rendertiddler \"$:/core/templates/exporters/JsonFile\" output.json text/plain \"\" exportFilter \"[tag[done]]\"\n```\n"
},
"$:/language/Help/rendertiddlers": {
"title": "$:/language/Help/rendertiddlers",
"description": "Render tiddlers matching a filter to a specified ContentType",
"text": "(Note: The `--rendertiddlers` command is deprecated in favour of the new, more flexible `--render` command)\n\nRender a set of tiddlers matching a filter to separate files of a specified ContentType (defaults to `text/html`) and extension (defaults to `.html`).\n\n```\n--rendertiddlers '<filter>' <template> <pathname> [<type>] [<extension>] [\"noclean\"]\n```\n\nFor example:\n\n```\n--rendertiddlers '[!is[system]]' $:/core/templates/static.tiddler.html ./static text/plain\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny files in the target directory are deleted unless the ''noclean'' flag is specified. The target directory is recursively created if it is missing.\n"
},
"$:/language/Help/save": {
"title": "$:/language/Help/save",
"description": "Saves individual raw tiddlers to files",
"text": "Saves individual tiddlers identified by a filter in their raw text or binary format to the specified files.\n\n```\n--save <tiddler-filter> <filename-filter>\n```\n\n* ''tiddler-filter'': A filter identifying the tiddler(s) to be saved\n* ''filename-filter'': Optional filter transforming tiddler titles into pathnames. If omitted, defaults to `[is[tiddler]]`, which uses the unchanged tiddler title as the filename\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nNotes:\n\n* The output directory is not cleared of any existing files\n* Any missing directories in the path to the filename are automatically created.\n* When saving a tiddler with spaces in its title, take care to use both the quotes required by your shell and also TiddlyWiki's double square brackets : `--save \"[[Motovun Jack.jpg]]\"`\n* The filename filter is evaluated with the selected items being set to the title of the tiddler currently being saved, allowing the title to be used as the basis for computing the filename. For example `[encodeuricomponent[]addprefix[static/]]` applies URI encoding to each title, and then adds the prefix `static/`\n* The `--save` command is a more flexible replacement for both the `--savetiddler` and `--savetiddlers` commands, which are deprecated\n\nExamples:\n\n* `--save \"[!is[system]is[image]]\" \"[encodeuricomponent[]addprefix[tiddlers/]]\"` -- saves all non-system image tiddlers as files in the subdirectory \"tiddlers\" with URL-encoded titles\n"
},
"$:/language/Help/savetiddler": {
"title": "$:/language/Help/savetiddler",
"description": "Saves a raw tiddler to a file",
"text": "(Note: The `--savetiddler` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves an individual tiddler in its raw text or binary format to the specified filename.\n\n```\n--savetiddler <title> <filename>\n```\n\nBy default, the filename is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nAny missing directories in the path to the filename are automatically created.\n"
},
"$:/language/Help/savetiddlers": {
"title": "$:/language/Help/savetiddlers",
"description": "Saves a group of raw tiddlers to a directory",
"text": "(Note: The `--savetiddlers` command is deprecated in favour of the new, more flexible `--save` command)\n\nSaves a group of tiddlers in their raw text or binary format to the specified directory.\n\n```\n--savetiddlers <filter> <pathname> [\"noclean\"]\n```\n\nBy default, the pathname is resolved relative to the `output` subdirectory of the edition directory. The `--output` command can be used to direct output to a different directory.\n\nThe output directory is cleared of existing files before saving the specified files. The deletion can be disabled by specifying the ''noclean'' flag.\n\nAny missing directories in the pathname are automatically created.\n"
},
"$:/language/Help/savewikifolder": {
"title": "$:/language/Help/savewikifolder",
"description": "Saves a wiki to a new wiki folder",
"text": "<<.from-version \"5.1.20\">> Saves the current wiki as a wiki folder, including tiddlers, plugins and configuration:\n\n```\n--savewikifolder <wikifolderpath> [<filter>]\n```\n\n* The target wiki folder must be empty or non-existent\n* The filter specifies which tiddlers should be included. It is optional, defaulting to `[all[tiddlers]]`\n* Plugins from the official plugin library are replaced with references to those plugins in the `tiddlywiki.info` file\n* Custom plugins are unpacked into their own folder\n\nA common usage is to convert a TiddlyWiki HTML file into a wiki folder:\n\n```\ntiddlywiki --load ./mywiki.html --savewikifolder ./mywikifolder\n```\n"
},
"$:/language/Help/server": {
"title": "$:/language/Help/server",
"description": "Provides an HTTP server interface to TiddlyWiki (deprecated in favour of the new listen command)",
"text": "Legacy command to serve a wiki over HTTP.\n\n```\n--server <port> <root-tiddler> <root-render-type> <root-serve-type> <username> <password> <host> <path-prefix> <debug-level>\n```\n\nThe parameters are:\n\n* ''port'' - port number on which to listen; non-numeric values are interpreted as a system environment variable from which the port number is extracted (defaults to \"8080\")\n* ''root-tiddler'' - the tiddler to serve at the root (defaults to \"$:/core/save/all\")\n* ''root-render-type'' - the content type to which the root tiddler should be rendered (defaults to \"text/plain\")\n* ''root-serve-type'' - the content type with which the root tiddler should be served (defaults to \"text/html\")\n* ''username'' - the default username for signing edits\n* ''password'' - optional password for basic authentication\n* ''host'' - optional hostname to serve from (defaults to \"127.0.0.1\" aka \"localhost\")\n* ''path-prefix'' - optional prefix for paths\n* ''debug-level'' - optional debug level; set to \"debug\" to view request details (defaults to \"none\")\n\nIf the password parameter is specified then the browser will prompt the user for the username and password. Note that the password is transmitted in plain text so this implementation should only be used on a trusted network or over HTTPS.\n\nFor example:\n\n```\n--server 8080 $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n\nThe username and password can be specified as empty strings if you need to set the hostname or pathprefix and don't want to require a password.\n\n\n```\n--server 8080 $:/core/save/all text/plain text/html \"\" \"\" 192.168.0.245\n```\n\nUsing an address like this exposes your system to the local network. For information on opening up your instance to the entire local network, and possible security concerns, see the WebServer tiddler at TiddlyWiki.com.\n\nTo run multiple TiddlyWiki servers at the same time you'll need to put each one on a different port. It can be useful to use an environment variable to pass the port number to the Node.js process. This example references an environment variable called \"MY_PORT_NUMBER\":\n\n```\n--server MY_PORT_NUMBER $:/core/save/all text/plain text/html MyUserName passw0rd\n```\n"
},
"$:/language/Help/setfield": {
"title": "$:/language/Help/setfield",
"description": "Prepares external tiddlers for use",
"text": "//Note that this command is experimental and may change or be replaced before being finalised//\n\nSets the specified field of a group of tiddlers to the result of wikifying a template tiddler with the `currentTiddler` variable set to the tiddler.\n\n```\n--setfield <filter> <fieldname> <templatetitle> <rendertype>\n```\n\nThe parameters are:\n\n* ''filter'' - filter identifying the tiddlers to be affected\n* ''fieldname'' - the field to modify (defaults to \"text\")\n* ''templatetitle'' - the tiddler to wikify into the specified field. If blank or missing then the specified field is deleted\n* ''rendertype'' - the text type to render (defaults to \"text/plain\"; \"text/html\" can be used to include HTML tags)\n"
},
"$:/language/Help/unpackplugin": {
"title": "$:/language/Help/unpackplugin",
"description": "Unpack the payload tiddlers from a plugin",
"text": "Extract the payload tiddlers from a plugin, creating them as ordinary tiddlers:\n\n```\n--unpackplugin <title>\n```\n"
},
"$:/language/Help/verbose": {
"title": "$:/language/Help/verbose",
"description": "Triggers verbose output mode",
"text": "Triggers verbose output, useful for debugging\n\n```\n--verbose\n```\n"
},
"$:/language/Help/version": {
"title": "$:/language/Help/version",
"description": "Displays the version number of TiddlyWiki",
"text": "Displays the version number of TiddlyWiki.\n\n```\n--version\n```\n"
},
"$:/languages/en-GB/icon": {
"title": "$:/languages/en-GB/icon",
"type": "image/svg+xml",
"text": "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 60 30\" width=\"1200\" height=\"600\">\n<clipPath id=\"t\">\n\t<path d=\"M30,15 h30 v15 z v15 h-30 z h-30 v-15 z v-15 h30 z\"/>\n</clipPath>\n<path d=\"M0,0 v30 h60 v-30 z\" fill=\"#00247d\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" stroke=\"#fff\" stroke-width=\"6\"/>\n<path d=\"M0,0 L60,30 M60,0 L0,30\" clip-path=\"url(#t)\" stroke=\"#cf142b\" stroke-width=\"4\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#fff\" stroke-width=\"10\"/>\n<path d=\"M30,0 v30 M0,15 h60\" stroke=\"#cf142b\" stroke-width=\"6\"/>\n</svg>\n"
},
"$:/language/Import/Imported/Hint": {
"title": "$:/language/Import/Imported/Hint",
"text": "The following tiddlers were imported:"
},
"$:/language/Import/Listing/Cancel/Caption": {
"title": "$:/language/Import/Listing/Cancel/Caption",
"text": "Cancel"
},
"$:/language/Import/Listing/Hint": {
"title": "$:/language/Import/Listing/Hint",
"text": "These tiddlers are ready to import:"
},
"$:/language/Import/Listing/Import/Caption": {
"title": "$:/language/Import/Listing/Import/Caption",
"text": "Import"
},
"$:/language/Import/Listing/Select/Caption": {
"title": "$:/language/Import/Listing/Select/Caption",
"text": "Select"
},
"$:/language/Import/Listing/Status/Caption": {
"title": "$:/language/Import/Listing/Status/Caption",
"text": "Status"
},
"$:/language/Import/Listing/Title/Caption": {
"title": "$:/language/Import/Listing/Title/Caption",
"text": "Title"
},
"$:/language/Import/Listing/Preview": {
"title": "$:/language/Import/Listing/Preview",
"text": "Preview:"
},
"$:/language/Import/Listing/Preview/Text": {
"title": "$:/language/Import/Listing/Preview/Text",
"text": "Text"
},
"$:/language/Import/Listing/Preview/TextRaw": {
"title": "$:/language/Import/Listing/Preview/TextRaw",
"text": "Text (Raw)"
},
"$:/language/Import/Listing/Preview/Fields": {
"title": "$:/language/Import/Listing/Preview/Fields",
"text": "Fields"
},
"$:/language/Import/Listing/Preview/Diff": {
"title": "$:/language/Import/Listing/Preview/Diff",
"text": "Diff"
},
"$:/language/Import/Listing/Preview/DiffFields": {
"title": "$:/language/Import/Listing/Preview/DiffFields",
"text": "Diff (Fields)"
},
"$:/language/Import/Listing/Rename/Tooltip": {
"title": "$:/language/Import/Listing/Rename/Tooltip",
"text": "Rename tiddler before importing"
},
"$:/language/Import/Listing/Rename/Prompt": {
"title": "$:/language/Import/Listing/Rename/Prompt",
"text": "Rename to:"
},
"$:/language/Import/Listing/Rename/ConfirmRename": {
"title": "$:/language/Import/Listing/Rename/ConfirmRename",
"text": "Rename tiddler"
},
"$:/language/Import/Listing/Rename/CancelRename": {
"title": "$:/language/Import/Listing/Rename/CancelRename",
"text": "Cancel"
},
"$:/language/Import/Listing/Rename/OverwriteWarning": {
"title": "$:/language/Import/Listing/Rename/OverwriteWarning",
"text": "A tiddler with this title already exists."
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Incompatible",
"text": "Blocked incompatible or obsolete plugin."
},
"$:/language/Import/Upgrader/Plugins/Suppressed/Version": {
"title": "$:/language/Import/Upgrader/Plugins/Suppressed/Version",
"text": "Blocked plugin (due to incoming <<incoming>> not being newer than existing <<existing>>)."
},
"$:/language/Import/Upgrader/Plugins/Upgraded": {
"title": "$:/language/Import/Upgrader/Plugins/Upgraded",
"text": "Upgraded plugin from <<incoming>> to <<upgraded>>."
},
"$:/language/Import/Upgrader/State/Suppressed": {
"title": "$:/language/Import/Upgrader/State/Suppressed",
"text": "Blocked temporary state tiddler."
},
"$:/language/Import/Upgrader/System/Suppressed": {
"title": "$:/language/Import/Upgrader/System/Suppressed",
"text": "Blocked system tiddler."
},
"$:/language/Import/Upgrader/System/Warning": {
"title": "$:/language/Import/Upgrader/System/Warning",
"text": "Core module tiddler."
},
"$:/language/Import/Upgrader/System/Alert": {
"title": "$:/language/Import/Upgrader/System/Alert",
"text": "You are about to import a tiddler that will overwrite a core module tiddler. This is not recommended as it may make the system unstable."
},
"$:/language/Import/Upgrader/ThemeTweaks/Created": {
"title": "$:/language/Import/Upgrader/ThemeTweaks/Created",
"text": "Migrated theme tweak from <$text text=<<from>>/>."
},
"$:/language/AboveStory/ClassicPlugin/Warning": {
"title": "$:/language/AboveStory/ClassicPlugin/Warning",
"text": "It looks like you are trying to load a plugin designed for ~TiddlyWiki Classic. Please note that [[these plugins do not work with TiddlyWiki version 5.x.x|https://tiddlywiki.com/#TiddlyWikiClassic]]. ~TiddlyWiki Classic plugins detected:"
},
"$:/language/BinaryWarning/Prompt": {
"title": "$:/language/BinaryWarning/Prompt",
"text": "This tiddler contains binary data"
},
"$:/language/ClassicWarning/Hint": {
"title": "$:/language/ClassicWarning/Hint",
"text": "This tiddler is written in TiddlyWiki Classic wiki text format, which is not fully compatible with TiddlyWiki version 5. See https://tiddlywiki.com/static/Upgrading.html for more details."
},
"$:/language/ClassicWarning/Upgrade/Caption": {
"title": "$:/language/ClassicWarning/Upgrade/Caption",
"text": "upgrade"
},
"$:/language/CloseAll/Button": {
"title": "$:/language/CloseAll/Button",
"text": "close all"
},
"$:/language/ColourPicker/Recent": {
"title": "$:/language/ColourPicker/Recent",
"text": "Recent:"
},
"$:/language/ConfirmCancelTiddler": {
"title": "$:/language/ConfirmCancelTiddler",
"text": "Do you wish to discard changes to the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmDeleteTiddler": {
"title": "$:/language/ConfirmDeleteTiddler",
"text": "Do you wish to delete the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmOverwriteTiddler": {
"title": "$:/language/ConfirmOverwriteTiddler",
"text": "Do you wish to overwrite the tiddler \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmEditShadowTiddler": {
"title": "$:/language/ConfirmEditShadowTiddler",
"text": "You are about to edit a ShadowTiddler. Any changes will override the default system making future upgrades non-trivial. Are you sure you want to edit \"<$text text=<<title>>/>\"?"
},
"$:/language/ConfirmAction": {
"title": "$:/language/ConfirmAction",
"text": "Do you wish to proceed?"
},
"$:/language/Count": {
"title": "$:/language/Count",
"text": "count"
},
"$:/language/DefaultNewTiddlerTitle": {
"title": "$:/language/DefaultNewTiddlerTitle",
"text": "New Tiddler"
},
"$:/language/Diffs/CountMessage": {
"title": "$:/language/Diffs/CountMessage",
"text": "<<diff-count>> differences"
},
"$:/language/DropMessage": {
"title": "$:/language/DropMessage",
"text": "Drop here (or use the 'Escape' key to cancel)"
},
"$:/language/Encryption/Cancel": {
"title": "$:/language/Encryption/Cancel",
"text": "Cancel"
},
"$:/language/Encryption/ConfirmClearPassword": {
"title": "$:/language/Encryption/ConfirmClearPassword",
"text": "Do you wish to clear the password? This will remove the encryption applied when saving this wiki"
},
"$:/language/Encryption/PromptSetPassword": {
"title": "$:/language/Encryption/PromptSetPassword",
"text": "Set a new password for this TiddlyWiki"
},
"$:/language/Encryption/Username": {
"title": "$:/language/Encryption/Username",
"text": "Username"
},
"$:/language/Encryption/Password": {
"title": "$:/language/Encryption/Password",
"text": "Password"
},
"$:/language/Encryption/RepeatPassword": {
"title": "$:/language/Encryption/RepeatPassword",
"text": "Repeat password"
},
"$:/language/Encryption/PasswordNoMatch": {
"title": "$:/language/Encryption/PasswordNoMatch",
"text": "Passwords do not match"
},
"$:/language/Encryption/SetPassword": {
"title": "$:/language/Encryption/SetPassword",
"text": "Set password"
},
"$:/language/Error/Caption": {
"title": "$:/language/Error/Caption",
"text": "Error"
},
"$:/language/Error/EditConflict": {
"title": "$:/language/Error/EditConflict",
"text": "File changed on server"
},
"$:/language/Error/Filter": {
"title": "$:/language/Error/Filter",
"text": "Filter error"
},
"$:/language/Error/FilterSyntax": {
"title": "$:/language/Error/FilterSyntax",
"text": "Syntax error in filter expression"
},
"$:/language/Error/FilterRunPrefix": {
"title": "$:/language/Error/FilterRunPrefix",
"text": "Filter Error: Unknown prefix for filter run"
},
"$:/language/Error/IsFilterOperator": {
"title": "$:/language/Error/IsFilterOperator",
"text": "Filter Error: Unknown operand for the 'is' filter operator"
},
"$:/language/Error/FormatFilterOperator": {
"title": "$:/language/Error/FormatFilterOperator",
"text": "Filter Error: Unknown suffix for the 'format' filter operator"
},
"$:/language/Error/LoadingPluginLibrary": {
"title": "$:/language/Error/LoadingPluginLibrary",
"text": "Error loading plugin library"
},
"$:/language/Error/NetworkErrorAlert": {
"title": "$:/language/Error/NetworkErrorAlert",
"text": "`<h2>''Network Error''</h2>It looks like the connection to the server has been lost. This may indicate a problem with your network connection. Please attempt to restore network connectivity before continuing.<br><br>''Any unsaved changes will be automatically synchronised when connectivity is restored''.`"
},
"$:/language/Error/RecursiveTransclusion": {
"title": "$:/language/Error/RecursiveTransclusion",
"text": "Recursive transclusion error in transclude widget"
},
"$:/language/Error/RetrievingSkinny": {
"title": "$:/language/Error/RetrievingSkinny",
"text": "Error retrieving skinny tiddler list"
},
"$:/language/Error/SavingToTWEdit": {
"title": "$:/language/Error/SavingToTWEdit",
"text": "Error saving to TWEdit"
},
"$:/language/Error/WhileSaving": {
"title": "$:/language/Error/WhileSaving",
"text": "Error while saving"
},
"$:/language/Error/XMLHttpRequest": {
"title": "$:/language/Error/XMLHttpRequest",
"text": "XMLHttpRequest error code"
},
"$:/language/InternalJavaScriptError/Title": {
"title": "$:/language/InternalJavaScriptError/Title",
"text": "Internal JavaScript Error"
},
"$:/language/InternalJavaScriptError/Hint": {
"title": "$:/language/InternalJavaScriptError/Hint",
"text": "Well, this is embarrassing. It is recommended that you restart TiddlyWiki by refreshing your browser"
},
"$:/language/InvalidFieldName": {
"title": "$:/language/InvalidFieldName",
"text": "Illegal characters in field name \"<$text text=<<fieldName>>/>\". Fields can only contain lowercase letters, digits and the characters underscore (`_`), hyphen (`-`) and period (`.`)"
},
"$:/language/LayoutSwitcher/Description": {
"title": "$:/language/LayoutSwitcher/Description",
"text": "Open the layout switcher"
},
"$:/language/LazyLoadingWarning": {
"title": "$:/language/LazyLoadingWarning",
"text": "<p>Trying to load external content from ''<$text text={{!!_canonical_uri}}/>''</p><p>If this message doesn't disappear, either the tiddler content type doesn't match the type of the external content, or you may be using a browser that doesn't support external content for wikis loaded as standalone files. See https://tiddlywiki.com/#ExternalText</p>"
},
"$:/language/LoginToTiddlySpace": {
"title": "$:/language/LoginToTiddlySpace",
"text": "Login to TiddlySpace"
},
"$:/language/Manager/Controls/FilterByTag/None": {
"title": "$:/language/Manager/Controls/FilterByTag/None",
"text": "(none)"
},
"$:/language/Manager/Controls/FilterByTag/Prompt": {
"title": "$:/language/Manager/Controls/FilterByTag/Prompt",
"text": "Filter by tag:"
},
"$:/language/Manager/Controls/Order/Prompt": {
"title": "$:/language/Manager/Controls/Order/Prompt",
"text": "Reverse order"
},
"$:/language/Manager/Controls/Search/Placeholder": {
"title": "$:/language/Manager/Controls/Search/Placeholder",
"text": "Search"
},
"$:/language/Manager/Controls/Search/Prompt": {
"title": "$:/language/Manager/Controls/Search/Prompt",
"text": "Search:"
},
"$:/language/Manager/Controls/Show/Option/Tags": {
"title": "$:/language/Manager/Controls/Show/Option/Tags",
"text": "tags"
},
"$:/language/Manager/Controls/Show/Option/Tiddlers": {
"title": "$:/language/Manager/Controls/Show/Option/Tiddlers",
"text": "tiddlers"
},
"$:/language/Manager/Controls/Show/Prompt": {
"title": "$:/language/Manager/Controls/Show/Prompt",
"text": "Show:"
},
"$:/language/Manager/Controls/Sort/Prompt": {
"title": "$:/language/Manager/Controls/Sort/Prompt",
"text": "Sort by:"
},
"$:/language/Manager/Item/Colour": {
"title": "$:/language/Manager/Item/Colour",
"text": "Colour"
},
"$:/language/Manager/Item/Fields": {
"title": "$:/language/Manager/Item/Fields",
"text": "Fields"
},
"$:/language/Manager/Item/Icon/None": {
"title": "$:/language/Manager/Item/Icon/None",
"text": "(none)"
},
"$:/language/Manager/Item/Icon": {
"title": "$:/language/Manager/Item/Icon",
"text": "Icon"
},
"$:/language/Manager/Item/RawText": {
"title": "$:/language/Manager/Item/RawText",
"text": "Raw text"
},
"$:/language/Manager/Item/Tags": {
"title": "$:/language/Manager/Item/Tags",
"text": "Tags"
},
"$:/language/Manager/Item/Tools": {
"title": "$:/language/Manager/Item/Tools",
"text": "Tools"
},
"$:/language/Manager/Item/WikifiedText": {
"title": "$:/language/Manager/Item/WikifiedText",
"text": "Wikified text"
},
"$:/language/MissingTiddler/Hint": {
"title": "$:/language/MissingTiddler/Hint",
"text": "Missing tiddler \"<$text text=<<currentTiddler>>/>\" -- click {{||$:/core/ui/Buttons/edit}} to create"
},
"$:/language/No": {
"title": "$:/language/No",
"text": "No"
},
"$:/language/OfficialPluginLibrary": {
"title": "$:/language/OfficialPluginLibrary",
"text": "Official ~TiddlyWiki Plugin Library"
},
"$:/language/OfficialPluginLibrary/Hint": {
"title": "$:/language/OfficialPluginLibrary/Hint",
"text": "The official ~TiddlyWiki plugin library at tiddlywiki.com. Plugins, themes and language packs are maintained by the core team."
},
"$:/language/PageTemplate/Description": {
"title": "$:/language/PageTemplate/Description",
"text": "the default ~TiddlyWiki layout"
},
"$:/language/PageTemplate/Name": {
"title": "$:/language/PageTemplate/Name",
"text": "Default ~PageTemplate"
},
"$:/language/PluginReloadWarning": {
"title": "$:/language/PluginReloadWarning",
"text": "Please save {{$:/core/ui/Buttons/save-wiki}} and reload {{$:/core/ui/Buttons/refresh}} to allow changes to ~JavaScript plugins to take effect"
},
"$:/language/RecentChanges/DateFormat": {
"title": "$:/language/RecentChanges/DateFormat",
"text": "DDth MMM YYYY"
},
"$:/language/Shortcuts/Input/AdvancedSearch/Hint": {
"title": "$:/language/Shortcuts/Input/AdvancedSearch/Hint",
"text": "Open the ~AdvancedSearch panel from within the sidebar search field"
},
"$:/language/Shortcuts/Input/Accept/Hint": {
"title": "$:/language/Shortcuts/Input/Accept/Hint",
"text": "Accept the selected item"
},
"$:/language/Shortcuts/Input/AcceptVariant/Hint": {
"title": "$:/language/Shortcuts/Input/AcceptVariant/Hint",
"text": "Accept the selected item (variant)"
},
"$:/language/Shortcuts/Input/Cancel/Hint": {
"title": "$:/language/Shortcuts/Input/Cancel/Hint",
"text": "Clear the input field"
},
"$:/language/Shortcuts/Input/Down/Hint": {
"title": "$:/language/Shortcuts/Input/Down/Hint",
"text": "Select the next item"
},
"$:/language/Shortcuts/Input/Tab-Left/Hint": {
"title": "$:/language/Shortcuts/Input/Tab-Left/Hint",
"text": "Select the previous Tab"
},
"$:/language/Shortcuts/Input/Tab-Right/Hint": {
"title": "$:/language/Shortcuts/Input/Tab-Right/Hint",
"text": "Select the next Tab"
},
"$:/language/Shortcuts/Input/Up/Hint": {
"title": "$:/language/Shortcuts/Input/Up/Hint",
"text": "Select the previous item"
},
"$:/language/Shortcuts/SidebarLayout/Hint": {
"title": "$:/language/Shortcuts/SidebarLayout/Hint",
"text": "Change the sidebar layout"
},
"$:/language/Switcher/Subtitle/theme": {
"title": "$:/language/Switcher/Subtitle/theme",
"text": "Switch Theme"
},
"$:/language/Switcher/Subtitle/layout": {
"title": "$:/language/Switcher/Subtitle/layout",
"text": "Switch Layout"
},
"$:/language/Switcher/Subtitle/language": {
"title": "$:/language/Switcher/Subtitle/language",
"text": "Switch Language"
},
"$:/language/Switcher/Subtitle/palette": {
"title": "$:/language/Switcher/Subtitle/palette",
"text": "Switch Palette"
},
"$:/language/SystemTiddler/Tooltip": {
"title": "$:/language/SystemTiddler/Tooltip",
"text": "This is a system tiddler"
},
"$:/language/SystemTiddlers/Include/Prompt": {
"title": "$:/language/SystemTiddlers/Include/Prompt",
"text": "Include system tiddlers"
},
"$:/language/TagManager/Colour/Heading": {
"title": "$:/language/TagManager/Colour/Heading",
"text": "Colour"
},
"$:/language/TagManager/Count/Heading": {
"title": "$:/language/TagManager/Count/Heading",
"text": "Count"
},
"$:/language/TagManager/Icon/Heading": {
"title": "$:/language/TagManager/Icon/Heading",
"text": "Icon"
},
"$:/language/TagManager/Icons/None": {
"title": "$:/language/TagManager/Icons/None",
"text": "None"
},
"$:/language/TagManager/Info/Heading": {
"title": "$:/language/TagManager/Info/Heading",
"text": "Info"
},
"$:/language/TagManager/Tag/Heading": {
"title": "$:/language/TagManager/Tag/Heading",
"text": "Tag"
},
"$:/language/Tiddler/DateFormat": {
"title": "$:/language/Tiddler/DateFormat",
"text": "DDth MMM YYYY at hh12:0mmam"
},
"$:/language/UnsavedChangesWarning": {
"title": "$:/language/UnsavedChangesWarning",
"text": "You have unsaved changes in TiddlyWiki"
},
"$:/language/Yes": {
"title": "$:/language/Yes",
"text": "Yes"
},
"$:/language/Modals/Download": {
"title": "$:/language/Modals/Download",
"subtitle": "Download changes",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "https://tiddlywiki.com/static/DownloadingChanges.html",
"text": "Your browser only supports manual saving.\n\nTo save your modified wiki, right click on the download link below and select \"Download file\" or \"Save file\", and then choose the folder and filename.\n\n//You can marginally speed things up by clicking the link with the control key (Windows) or the options/alt key (Mac OS X). You will not be prompted for the folder or filename, but your browser is likely to give it an unrecognisable name -- you may need to rename the file to include an `.html` extension before you can do anything useful with it.//\n\nOn smartphones that do not allow files to be downloaded you can instead bookmark the link, and then sync your bookmarks to a desktop computer from where the wiki can be saved normally.\n"
},
"$:/language/Modals/SaveInstructions": {
"title": "$:/language/Modals/SaveInstructions",
"subtitle": "Save your work",
"footer": "<$button message=\"tm-close-tiddler\">Close</$button>",
"help": "https://tiddlywiki.com/static/SavingChanges.html",
"text": "Your changes to this wiki need to be saved as a ~TiddlyWiki HTML file.\n\n!!! Desktop browsers\n\n# Select ''Save As'' from the ''File'' menu\n# Choose a filename and location\n#* Some browsers also require you to explicitly specify the file saving format as ''Webpage, HTML only'' or similar\n# Close this tab\n\n!!! Smartphone browsers\n\n# Create a bookmark to this page\n#* If you've got iCloud or Google Sync set up then the bookmark will automatically sync to your desktop where you can open it and save it as above\n# Close this tab\n\n//If you open the bookmark again in Mobile Safari you will see this message again. If you want to go ahead and use the file, just click the ''close'' button below//\n"
},
"$:/config/NewJournal/Title": {
"title": "$:/config/NewJournal/Title",
"text": "DDth MMM YYYY"
},
"$:/config/NewJournal/Text": {
"title": "$:/config/NewJournal/Text",
"text": ""
},
"$:/config/NewJournal/Tags": {
"title": "$:/config/NewJournal/Tags",
"text": "Journal\n"
},
"$:/language/Notifications/Save/Done": {
"title": "$:/language/Notifications/Save/Done",
"text": "Saved wiki"
},
"$:/language/Notifications/Save/Starting": {
"title": "$:/language/Notifications/Save/Starting",
"text": "Starting to save wiki"
},
"$:/language/Notifications/CopiedToClipboard/Succeeded": {
"title": "$:/language/Notifications/CopiedToClipboard/Succeeded",
"text": "Copied to clipboard!"
},
"$:/language/Notifications/CopiedToClipboard/Failed": {
"title": "$:/language/Notifications/CopiedToClipboard/Failed",
"text": "Failed to copy to clipboard!"
},
"$:/language/Search/DefaultResults/Caption": {
"title": "$:/language/Search/DefaultResults/Caption",
"text": "List"
},
"$:/language/Search/Filter/Caption": {
"title": "$:/language/Search/Filter/Caption",
"text": "Filter"
},
"$:/language/Search/Filter/Hint": {
"title": "$:/language/Search/Filter/Hint",
"text": "Search via a [[filter expression|https://tiddlywiki.com/static/Filters.html]]"
},
"$:/language/Search/Filter/Matches": {
"title": "$:/language/Search/Filter/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Matches": {
"title": "$:/language/Search/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Matches/All": {
"title": "$:/language/Search/Matches/All",
"text": "All matches:"
},
"$:/language/Search/Matches/Title": {
"title": "$:/language/Search/Matches/Title",
"text": "Title matches:"
},
"$:/language/Search/Search": {
"title": "$:/language/Search/Search",
"text": "Search"
},
"$:/language/Search/Search/TooShort": {
"title": "$:/language/Search/Search/TooShort",
"text": "Search text too short"
},
"$:/language/Search/Shadows/Caption": {
"title": "$:/language/Search/Shadows/Caption",
"text": "Shadows"
},
"$:/language/Search/Shadows/Hint": {
"title": "$:/language/Search/Shadows/Hint",
"text": "Search for shadow tiddlers"
},
"$:/language/Search/Shadows/Matches": {
"title": "$:/language/Search/Shadows/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/Standard/Caption": {
"title": "$:/language/Search/Standard/Caption",
"text": "Standard"
},
"$:/language/Search/Standard/Hint": {
"title": "$:/language/Search/Standard/Hint",
"text": "Search for standard tiddlers"
},
"$:/language/Search/Standard/Matches": {
"title": "$:/language/Search/Standard/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/Search/System/Caption": {
"title": "$:/language/Search/System/Caption",
"text": "System"
},
"$:/language/Search/System/Hint": {
"title": "$:/language/Search/System/Hint",
"text": "Search for system tiddlers"
},
"$:/language/Search/System/Matches": {
"title": "$:/language/Search/System/Matches",
"text": "//<small><<resultCount>> matches</small>//"
},
"$:/language/SideBar/All/Caption": {
"title": "$:/language/SideBar/All/Caption",
"text": "All"
},
"$:/language/SideBar/Contents/Caption": {
"title": "$:/language/SideBar/Contents/Caption",
"text": "Contents"
},
"$:/language/SideBar/Drafts/Caption": {
"title": "$:/language/SideBar/Drafts/Caption",
"text": "Drafts"
},
"$:/language/SideBar/Explorer/Caption": {
"title": "$:/language/SideBar/Explorer/Caption",
"text": "Explorer"
},
"$:/language/SideBar/Missing/Caption": {
"title": "$:/language/SideBar/Missing/Caption",
"text": "Missing"
},
"$:/language/SideBar/More/Caption": {
"title": "$:/language/SideBar/More/Caption",
"text": "More"
},
"$:/language/SideBar/Open/Caption": {
"title": "$:/language/SideBar/Open/Caption",
"text": "Open"
},
"$:/language/SideBar/Orphans/Caption": {
"title": "$:/language/SideBar/Orphans/Caption",
"text": "Orphans"
},
"$:/language/SideBar/Recent/Caption": {
"title": "$:/language/SideBar/Recent/Caption",
"text": "Recent"
},
"$:/language/SideBar/Shadows/Caption": {
"title": "$:/language/SideBar/Shadows/Caption",
"text": "Shadows"
},
"$:/language/SideBar/System/Caption": {
"title": "$:/language/SideBar/System/Caption",
"text": "System"
},
"$:/language/SideBar/Tags/Caption": {
"title": "$:/language/SideBar/Tags/Caption",
"text": "Tags"
},
"$:/language/SideBar/Tags/Untagged/Caption": {
"title": "$:/language/SideBar/Tags/Untagged/Caption",
"text": "untagged"
},
"$:/language/SideBar/Tools/Caption": {
"title": "$:/language/SideBar/Tools/Caption",
"text": "Tools"
},
"$:/language/SideBar/Types/Caption": {
"title": "$:/language/SideBar/Types/Caption",
"text": "Types"
},
"$:/SiteSubtitle": {
"title": "$:/SiteSubtitle",
"text": "a non-linear personal web notebook"
},
"$:/SiteTitle": {
"title": "$:/SiteTitle",
"text": "My ~TiddlyWiki"
},
"$:/language/Snippets/ListByTag": {
"title": "$:/language/Snippets/ListByTag",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "List of tiddlers by tag",
"text": "<<list-links \"[tag[task]sort[title]]\">>\n"
},
"$:/language/Snippets/MacroDefinition": {
"title": "$:/language/Snippets/MacroDefinition",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Macro definition",
"text": "\\define macroName(param1:\"default value\",param2)\nText of the macro\n\\end\n"
},
"$:/language/Snippets/Table4x3": {
"title": "$:/language/Snippets/Table4x3",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Table with 4 columns by 3 rows",
"text": "|! |!Alpha |!Beta |!Gamma |!Delta |\n|!One | | | | |\n|!Two | | | | |\n|!Three | | | | |\n"
},
"$:/language/Snippets/TableOfContents": {
"title": "$:/language/Snippets/TableOfContents",
"tags": "$:/tags/TextEditor/Snippet",
"caption": "Table of Contents",
"text": "<div class=\"tc-table-of-contents\">\n\n<<toc-selective-expandable 'TableOfContents'>>\n\n</div>"
},
"$:/language/ThemeTweaks/ThemeTweaks": {
"title": "$:/language/ThemeTweaks/ThemeTweaks",
"text": "Theme Tweaks"
},
"$:/language/ThemeTweaks/ThemeTweaks/Hint": {
"title": "$:/language/ThemeTweaks/ThemeTweaks/Hint",
"text": "You can tweak certain aspects of the ''Vanilla'' theme."
},
"$:/language/ThemeTweaks/Options": {
"title": "$:/language/ThemeTweaks/Options",
"text": "Options"
},
"$:/language/ThemeTweaks/Options/SidebarLayout": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout",
"text": "Sidebar layout"
},
"$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fixed-Fluid",
"text": "Fixed story, fluid sidebar"
},
"$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed": {
"title": "$:/language/ThemeTweaks/Options/SidebarLayout/Fluid-Fixed",
"text": "Fluid story, fixed sidebar"
},
"$:/language/ThemeTweaks/Options/StickyTitles": {
"title": "$:/language/ThemeTweaks/Options/StickyTitles",
"text": "Sticky titles"
},
"$:/language/ThemeTweaks/Options/StickyTitles/Hint": {
"title": "$:/language/ThemeTweaks/Options/StickyTitles/Hint",
"text": "Causes tiddler titles to \"stick\" to the top of the browser window"
},
"$:/language/ThemeTweaks/Options/CodeWrapping": {
"title": "$:/language/ThemeTweaks/Options/CodeWrapping",
"text": "Wrap long lines in code blocks"
},
"$:/language/ThemeTweaks/Settings": {
"title": "$:/language/ThemeTweaks/Settings",
"text": "Settings"
},
"$:/language/ThemeTweaks/Settings/FontFamily": {
"title": "$:/language/ThemeTweaks/Settings/FontFamily",
"text": "Font family"
},
"$:/language/ThemeTweaks/Settings/CodeFontFamily": {
"title": "$:/language/ThemeTweaks/Settings/CodeFontFamily",
"text": "Code font family"
},
"$:/language/ThemeTweaks/Settings/EditorFontFamily": {
"title": "$:/language/ThemeTweaks/Settings/EditorFontFamily",
"text": "Editor font family"
},
"$:/language/ThemeTweaks/Settings/BackgroundImage": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImage",
"text": "Page background image"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment",
"text": "Page background image attachment"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Scroll",
"text": "Scroll with tiddlers"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageAttachment/Fixed",
"text": "Fixed to window"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize",
"text": "Page background image size"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Auto",
"text": "Auto"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Cover",
"text": "Cover"
},
"$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain": {
"title": "$:/language/ThemeTweaks/Settings/BackgroundImageSize/Contain",
"text": "Contain"
},
"$:/language/ThemeTweaks/Metrics": {
"title": "$:/language/ThemeTweaks/Metrics",
"text": "Sizes"
},
"$:/language/ThemeTweaks/Metrics/FontSize": {
"title": "$:/language/ThemeTweaks/Metrics/FontSize",
"text": "Font size"
},
"$:/language/ThemeTweaks/Metrics/LineHeight": {
"title": "$:/language/ThemeTweaks/Metrics/LineHeight",
"text": "Line height"
},
"$:/language/ThemeTweaks/Metrics/BodyFontSize": {
"title": "$:/language/ThemeTweaks/Metrics/BodyFontSize",
"text": "Font size for tiddler body"
},
"$:/language/ThemeTweaks/Metrics/BodyLineHeight": {
"title": "$:/language/ThemeTweaks/Metrics/BodyLineHeight",
"text": "Line height for tiddler body"
},
"$:/language/ThemeTweaks/Metrics/StoryLeft": {
"title": "$:/language/ThemeTweaks/Metrics/StoryLeft",
"text": "Story left position"
},
"$:/language/ThemeTweaks/Metrics/StoryLeft/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryLeft/Hint",
"text": "how far the left margin of the story river<br>(tiddler area) is from the left of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryTop": {
"title": "$:/language/ThemeTweaks/Metrics/StoryTop",
"text": "Story top position"
},
"$:/language/ThemeTweaks/Metrics/StoryTop/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryTop/Hint",
"text": "how far the top margin of the story river<br>is from the top of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryRight": {
"title": "$:/language/ThemeTweaks/Metrics/StoryRight",
"text": "Story right"
},
"$:/language/ThemeTweaks/Metrics/StoryRight/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryRight/Hint",
"text": "how far the left margin of the sidebar <br>is from the left of the page"
},
"$:/language/ThemeTweaks/Metrics/StoryWidth": {
"title": "$:/language/ThemeTweaks/Metrics/StoryWidth",
"text": "Story width"
},
"$:/language/ThemeTweaks/Metrics/StoryWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/StoryWidth/Hint",
"text": "the overall width of the story river"
},
"$:/language/ThemeTweaks/Metrics/TiddlerWidth": {
"title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth",
"text": "Tiddler width"
},
"$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/TiddlerWidth/Hint",
"text": "within the story river"
},
"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint",
"text": "Sidebar breakpoint"
},
"$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarBreakpoint/Hint",
"text": "the minimum page width at which the story<br>river and sidebar will appear side by side"
},
"$:/language/ThemeTweaks/Metrics/SidebarWidth": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarWidth",
"text": "Sidebar width"
},
"$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint": {
"title": "$:/language/ThemeTweaks/Metrics/SidebarWidth/Hint",
"text": "the width of the sidebar in fluid-fixed layout"
},
"$:/language/TiddlerInfo/Advanced/Caption": {
"title": "$:/language/TiddlerInfo/Advanced/Caption",
"text": "Advanced"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Empty/Hint",
"text": "none"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Heading",
"text": "Plugin Details"
},
"$:/language/TiddlerInfo/Advanced/PluginInfo/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/PluginInfo/Hint",
"text": "This plugin contains the following shadow tiddlers:"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Heading",
"text": "Shadow Status"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/NotShadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is not a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Hint",
"text": "The tiddler <$link to=<<infoTiddler>>><$text text=<<infoTiddler>>/></$link> is a shadow tiddler"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/Shadow/Source",
"text": "It is defined in the plugin <$link to=<<pluginTiddler>>><$text text=<<pluginTiddler>>/></$link>"
},
"$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint": {
"title": "$:/language/TiddlerInfo/Advanced/ShadowInfo/OverriddenShadow/Hint",
"text": "It is overridden by an ordinary tiddler"
},
"$:/language/TiddlerInfo/Fields/Caption": {
"title": "$:/language/TiddlerInfo/Fields/Caption",
"text": "Fields"
},
"$:/language/TiddlerInfo/List/Caption": {
"title": "$:/language/TiddlerInfo/List/Caption",
"text": "List"
},
"$:/language/TiddlerInfo/List/Empty": {
"title": "$:/language/TiddlerInfo/List/Empty",
"text": "This tiddler does not have a list"
},
"$:/language/TiddlerInfo/Listed/Caption": {
"title": "$:/language/TiddlerInfo/Listed/Caption",
"text": "Listed"
},
"$:/language/TiddlerInfo/Listed/Empty": {
"title": "$:/language/TiddlerInfo/Listed/Empty",
"text": "This tiddler is not listed by any others"
},
"$:/language/TiddlerInfo/References/Caption": {
"title": "$:/language/TiddlerInfo/References/Caption",
"text": "Backlinks"
},
"$:/language/TiddlerInfo/References/Empty": {
"title": "$:/language/TiddlerInfo/References/Empty",
"text": "No tiddlers link to this one"
},
"$:/language/TiddlerInfo/Tagging/Caption": {
"title": "$:/language/TiddlerInfo/Tagging/Caption",
"text": "Tagging"
},
"$:/language/TiddlerInfo/Tagging/Empty": {
"title": "$:/language/TiddlerInfo/Tagging/Empty",
"text": "No tiddlers are tagged with this one"
},
"$:/language/TiddlerInfo/Tools/Caption": {
"title": "$:/language/TiddlerInfo/Tools/Caption",
"text": "Tools"
},
"$:/language/Docs/Types/application/javascript": {
"title": "$:/language/Docs/Types/application/javascript",
"description": "JavaScript code",
"name": "application/javascript",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/application/json": {
"title": "$:/language/Docs/Types/application/json",
"description": "JSON data",
"name": "application/json",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/application/x-tiddler-dictionary": {
"title": "$:/language/Docs/Types/application/x-tiddler-dictionary",
"description": "Data dictionary",
"name": "application/x-tiddler-dictionary",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/image/gif": {
"title": "$:/language/Docs/Types/image/gif",
"description": "GIF image",
"name": "image/gif",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/jpeg": {
"title": "$:/language/Docs/Types/image/jpeg",
"description": "JPEG image",
"name": "image/jpeg",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/png": {
"title": "$:/language/Docs/Types/image/png",
"description": "PNG image",
"name": "image/png",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/svg+xml": {
"title": "$:/language/Docs/Types/image/svg+xml",
"description": "Structured Vector Graphics image",
"name": "image/svg+xml",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/image/x-icon": {
"title": "$:/language/Docs/Types/image/x-icon",
"description": "ICO format icon file",
"name": "image/x-icon",
"group": "Image",
"group-sort": "1"
},
"$:/language/Docs/Types/text/css": {
"title": "$:/language/Docs/Types/text/css",
"description": "Static stylesheet",
"name": "text/css",
"group": "Developer",
"group-sort": "2"
},
"$:/language/Docs/Types/text/html": {
"title": "$:/language/Docs/Types/text/html",
"description": "HTML markup",
"name": "text/html",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/plain": {
"title": "$:/language/Docs/Types/text/plain",
"description": "Plain text",
"name": "text/plain",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/vnd.tiddlywiki": {
"title": "$:/language/Docs/Types/text/vnd.tiddlywiki",
"description": "TiddlyWiki 5",
"name": "text/vnd.tiddlywiki",
"group": "Text",
"group-sort": "0"
},
"$:/language/Docs/Types/text/x-tiddlywiki": {
"title": "$:/language/Docs/Types/text/x-tiddlywiki",
"description": "TiddlyWiki Classic",
"name": "text/x-tiddlywiki",
"group": "Text",
"group-sort": "0"
},
"$:/languages/en-GB": {
"title": "$:/languages/en-GB",
"name": "en-GB",
"description": "English (British)",
"author": "JeremyRuston",
"core-version": ">=5.0.0\"",
"text": "Stub pseudo-plugin for the default language"
},
"$:/core/modules/commander.js": {
"title": "$:/core/modules/commander.js",
"text": "/*\\\ntitle: $:/core/modules/commander.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Commander class is a command interpreter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a sequence of commands\n\tcommandTokens: an array of command string tokens\n\twiki: reference to the wiki store object\n\tstreams: {output:, error:}, each of which has a write(string) method\n\tcallback: a callback invoked as callback(err) where err is null if there was no error\n*/\nvar Commander = function(commandTokens,callback,wiki,streams) {\n\tvar path = require(\"path\");\n\tthis.commandTokens = commandTokens;\n\tthis.nextToken = 0;\n\tthis.callback = callback;\n\tthis.wiki = wiki;\n\tthis.streams = streams;\n\tthis.outputPath = path.resolve($tw.boot.wikiPath,$tw.config.wikiOutputSubDir);\n};\n\n/*\nLog a string if verbose flag is set\n*/\nCommander.prototype.log = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str + \"\\n\");\n\t}\n};\n\n/*\nWrite a string if verbose flag is set\n*/\nCommander.prototype.write = function(str) {\n\tif(this.verbose) {\n\t\tthis.streams.output.write(str);\n\t}\n};\n\n/*\nAdd a string of tokens to the command queue\n*/\nCommander.prototype.addCommandTokens = function(commandTokens) {\n\tvar params = commandTokens.slice(0);\n\tparams.unshift(0);\n\tparams.unshift(this.nextToken);\n\tArray.prototype.splice.apply(this.commandTokens,params);\n};\n\n/*\nExecute the sequence of commands and invoke a callback on completion\n*/\nCommander.prototype.execute = function() {\n\tthis.executeNextCommand();\n};\n\n/*\nExecute the next command in the sequence\n*/\nCommander.prototype.executeNextCommand = function() {\n\tvar self = this;\n\t// Invoke the callback if there are no more commands\n\tif(this.nextToken >= this.commandTokens.length) {\n\t\tthis.callback(null);\n\t} else {\n\t\t// Get and check the command token\n\t\tvar commandName = this.commandTokens[this.nextToken++];\n\t\tif(commandName.substr(0,2) !== \"--\") {\n\t\t\tthis.callback(\"Missing command: \" + commandName);\n\t\t} else {\n\t\t\tcommandName = commandName.substr(2); // Trim off the --\n\t\t\t// Accumulate the parameters to the command\n\t\t\tvar params = [];\n\t\t\twhile(this.nextToken < this.commandTokens.length && \n\t\t\t\tthis.commandTokens[this.nextToken].substr(0,2) !== \"--\") {\n\t\t\t\tparams.push(this.commandTokens[this.nextToken++]);\n\t\t\t}\n\t\t\t// Get the command info\n\t\t\tvar command = $tw.commands[commandName],\n\t\t\t\tc,err;\n\t\t\tif(!command) {\n\t\t\t\tthis.callback(\"Unknown command: \" + commandName);\n\t\t\t} else {\n\t\t\t\tif(this.verbose) {\n\t\t\t\t\tthis.streams.output.write(\"Executing command: \" + commandName + \" \" + params.join(\" \") + \"\\n\");\n\t\t\t\t}\n\t\t\t\t// Parse named parameters if required\n\t\t\t\tif(command.info.namedParameterMode) {\n\t\t\t\t\tparams = this.extractNamedParameters(params,command.info.mandatoryParameters);\n\t\t\t\t\tif(typeof params === \"string\") {\n\t\t\t\t\t\treturn this.callback(params);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(command.info.synchronous) {\n\t\t\t\t\t// Synchronous command\n\t\t\t\t\tc = new command.Command(params,this);\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.executeNextCommand();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Asynchronous command\n\t\t\t\t\tc = new command.Command(params,this,function(err) {\n\t\t\t\t\t\tif(err) {\n\t\t\t\t\t\t\tself.callback(err);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tself.executeNextCommand();\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\terr = c.execute();\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\tthis.callback(err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nGiven an array of parameter strings `params` in name:value format, and an array of mandatory parameter names in `mandatoryParameters`, returns a hashmap of values or a string if error\n*/\nCommander.prototype.extractNamedParameters = function(params,mandatoryParameters) {\n\tmandatoryParameters = mandatoryParameters || [];\n\tvar errors = [],\n\t\tparamsByName = Object.create(null);\n\t// Extract the parameters\n\t$tw.utils.each(params,function(param) {\n\t\tvar index = param.indexOf(\"=\");\n\t\tif(index < 1) {\n\t\t\terrors.push(\"malformed named parameter: '\" + param + \"'\");\n\t\t}\n\t\tparamsByName[param.slice(0,index)] = $tw.utils.trim(param.slice(index+1));\n\t});\n\t// Check the mandatory parameters are present\n\t$tw.utils.each(mandatoryParameters,function(mandatoryParameter) {\n\t\tif(!$tw.utils.hop(paramsByName,mandatoryParameter)) {\n\t\t\terrors.push(\"missing mandatory parameter: '\" + mandatoryParameter + \"'\");\n\t\t}\n\t});\n\t// Return any errors\n\tif(errors.length > 0) {\n\t\treturn errors.join(\" and\\n\");\n\t} else {\n\t\treturn paramsByName;\t\t\n\t}\n};\n\nCommander.initCommands = function(moduleType) {\n\tmoduleType = moduleType || \"command\";\n\t$tw.commands = {};\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tvar c = $tw.commands[module.info.name] = {};\n\t\t// Add the methods defined by the module\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\tc[f] = module[f];\n\t\t\t}\n\t\t}\n\t});\n};\n\nexports.Commander = Commander;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/commands/build.js": {
"title": "$:/core/modules/commands/build.js",
"text": "/*\\\ntitle: $:/core/modules/commands/build.js\ntype: application/javascript\nmodule-type: command\n\nCommand to build a build target\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"build\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\t// Get the build targets defined in the wiki\n\tvar buildTargets = $tw.boot.wikiInfo.build;\n\tif(!buildTargets) {\n\t\treturn \"No build targets defined\";\n\t}\n\t// Loop through each of the specified targets\n\tvar targets;\n\tif(this.params.length > 0) {\n\t\ttargets = this.params;\n\t} else {\n\t\ttargets = Object.keys(buildTargets);\n\t}\n\tfor(var targetIndex=0; targetIndex<targets.length; targetIndex++) {\n\t\tvar target = targets[targetIndex],\n\t\t\tcommands = buildTargets[target];\n\t\tif(!commands) {\n\t\t\treturn \"Build target '\" + target + \"' not found\";\n\t\t}\n\t\t// Add the commands to the queue\n\t\tthis.commander.addCommandTokens(commands);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/clearpassword.js": {
"title": "$:/core/modules/commands/clearpassword.js",
"text": "/*\\\ntitle: $:/core/modules/commands/clearpassword.js\ntype: application/javascript\nmodule-type: command\n\nClear password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"clearpassword\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\t$tw.crypto.setPassword(null);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/deletetiddlers.js": {
"title": "$:/core/modules/commands/deletetiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/deletetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to delete tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"deletetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filter\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\twiki.deleteTiddler(title);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/editions.js": {
"title": "$:/core/modules/commands/editions.js",
"text": "/*\\\ntitle: $:/core/modules/commands/editions.js\ntype: application/javascript\nmodule-type: command\n\nCommand to list the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"editions\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\t// Output the list\n\tthis.commander.streams.output.write(\"Available editions:\\n\\n\");\n\tvar editionInfo = $tw.utils.getEditionInfo();\n\t$tw.utils.each(editionInfo,function(info,name) {\n\t\tself.commander.streams.output.write(\" \" + name + \": \" + info.description + \"\\n\");\n\t});\n\tthis.commander.streams.output.write(\"\\n\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/fetch.js": {
"title": "$:/core/modules/commands/fetch.js",
"text": "/*\\\ntitle: $:/core/modules/commands/fetch.js\ntype: application/javascript\nmodule-type: command\n\nCommands to fetch external tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"fetch\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing subcommand and url\";\n\t}\n\tswitch(this.params[0]) {\n\t\tcase \"raw-file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turl: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"file\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turl: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"raw-files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\traw: true,\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\ttransformFilter: this.params[2] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t\tcase \"files\":\n\t\t\treturn this.fetchFiles({\n\t\t\t\turlFilter: this.params[1],\n\t\t\t\timportFilter: this.params[2],\n\t\t\t\ttransformFilter: this.params[3] || \"\",\n\t\t\t\tcallback: this.callback\n\t\t\t});\n\t\t\tbreak;\n\t}\n\treturn null;\n};\n\nCommand.prototype.fetchFiles = function(options) {\n\tvar self = this;\n\t// Get the list of URLs\n\tvar urls;\n\tif(options.url) {\n\t\turls = [options.url]\n\t} else if(options.urlFilter) {\n\t\turls = this.commander.wiki.filterTiddlers(options.urlFilter);\n\t} else {\n\t\treturn \"Missing URL\";\n\t}\n\t// Process each URL in turn\n\tvar next = 0;\n\tvar getNextFile = function(err) {\n\t\tif(err) {\n\t\t\treturn options.callback(err);\n\t\t}\n\t\tif(next < urls.length) {\n\t\t\tself.fetchFile(urls[next++],options,getNextFile);\n\t\t} else {\n\t\t\toptions.callback(null);\n\t\t}\n\t};\n\tgetNextFile(null);\n\t// Success\n\treturn null;\n};\n\nCommand.prototype.fetchFile = function(url,options,callback,redirectCount) {\n\tif(redirectCount > 10) {\n\t\treturn callback(\"Error too many redirects retrieving \" + url);\n\t}\n\tvar self = this,\n\t\tlib = url.substr(0,8) === \"https://\" ? require(\"https\") : require(\"http\");\n\tlib.get(url).on(\"response\",function(response) {\n\t var type = (response.headers[\"content-type\"] || \"\").split(\";\")[0],\n\t \tdata = [];\n\t self.commander.write(\"Reading \" + url + \": \");\n\t response.on(\"data\",function(chunk) {\n\t data.push(chunk);\n\t self.commander.write(\".\");\n\t });\n\t response.on(\"end\",function() {\n\t self.commander.write(\"\\n\");\n\t if(response.statusCode === 200) {\n\t\t self.processBody(Buffer.concat(data),type,options,url);\n\t\t callback(null);\n\t } else {\n\t \tif(response.statusCode === 302 || response.statusCode === 303 || response.statusCode === 307) {\n\t \t\treturn self.fetchFile(response.headers.location,options,callback,redirectCount + 1);\n\t \t} else {\n\t\t \treturn callback(\"Error \" + response.statusCode + \" retrieving \" + url)\t \t\t\n\t \t}\n\t }\n\t \t});\n\t \tresponse.on(\"error\",function(e) {\n\t\t\tconsole.log(\"Error on GET request: \" + e);\n\t\t\tcallback(e);\n\t \t});\n\t});\n\treturn null;\n};\n\nCommand.prototype.processBody = function(body,type,options,url) {\n\tvar self = this;\n\t// Collect the tiddlers in a wiki\n\tvar incomingWiki = new $tw.Wiki();\n\tif(options.raw) {\n\t\tvar typeInfo = type ? $tw.config.contentTypeInfo[type] : null,\n\t\t\tencoding = typeInfo ? typeInfo.encoding : \"utf8\";\n\t\tincomingWiki.addTiddler(new $tw.Tiddler({\n\t\t\ttitle: url,\n\t\t\ttype: type,\n\t\t\ttext: body.toString(encoding)\n\t\t}));\n\t} else {\n\t\t// Deserialise the file to extract the tiddlers\n\t\tvar tiddlers = this.commander.wiki.deserializeTiddlers(type || \"text/html\",body.toString(\"utf8\"),{});\n\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\tincomingWiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t});\n\t}\n\t// Filter the tiddlers to select the ones we want\n\tvar filteredTitles = incomingWiki.filterTiddlers(options.importFilter || \"[all[tiddlers]]\");\n\t// Import the selected tiddlers\n\tvar count = 0;\n\tincomingWiki.each(function(tiddler,title) {\n\t\tif(filteredTitles.indexOf(title) !== -1) {\n\t\t\tvar newTiddler;\n\t\t\tif(options.transformFilter) {\n\t\t\t\tvar transformedTitle = (incomingWiki.filterTiddlers(options.transformFilter,null,self.commander.wiki.makeTiddlerIterator([title])) || [\"\"])[0];\n\t\t\t\tif(transformedTitle) {\n\t\t\t\t\tself.commander.log(\"Importing \" + title + \" as \" + transformedTitle)\n\t\t\t\t\tnewTiddler = new $tw.Tiddler(tiddler,{title: transformedTitle});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.commander.log(\"Importing \" + title)\n\t\t\t\tnewTiddler = tiddler;\n\t\t\t}\n\t\t\tself.commander.wiki.importTiddler(newTiddler);\n\t\t\tcount++;\n\t\t}\n\t});\n\tself.commander.log(\"Imported \" + count + \" tiddlers\")\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/help.js": {
"title": "$:/core/modules/commands/help.js",
"text": "/*\\\ntitle: $:/core/modules/commands/help.js\ntype: application/javascript\nmodule-type: command\n\nHelp command\n\n\\*/\n(function(){\n\n/*jshint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"help\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar subhelp = this.params[0] || \"default\",\n\t\thelpBase = \"$:/language/Help/\",\n\t\ttext;\n\tif(!this.commander.wiki.getTiddler(helpBase + subhelp)) {\n\t\tsubhelp = \"notfound\";\n\t}\n\t// Wikify the help as formatted text (ie block elements generate newlines)\n\ttext = this.commander.wiki.renderTiddler(\"text/plain-formatted\",helpBase + subhelp);\n\t// Remove any leading linebreaks\n\ttext = text.replace(/^(\\r?\\n)*/g,\"\");\n\tthis.commander.streams.output.write(text);\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/import.js": {
"title": "$:/core/modules/commands/import.js",
"text": "/*\\\ntitle: $:/core/modules/commands/import.js\ntype: application/javascript\nmodule-type: command\n\nCommand to import tiddlers from a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"import\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 2) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar filename = self.params[0],\n\t\tdeserializer = self.params[1],\n\t\ttitle = self.params[2] || filename,\n\t\tencoding = self.params[3] || \"utf8\",\n\t\ttext = fs.readFileSync(filename,encoding),\n\t\ttiddlers = this.commander.wiki.deserializeTiddlers(null,text,{title: title},{deserializer: deserializer});\n\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t});\n\tthis.commander.log(tiddlers.length + \" tiddler(s) imported\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/init.js": {
"title": "$:/core/modules/commands/init.js",
"text": "/*\\\ntitle: $:/core/modules/commands/init.js\ntype: application/javascript\nmodule-type: command\n\nCommand to initialise an empty wiki folder\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"init\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\t// Check that we don't already have a valid wiki folder\n\tif($tw.boot.wikiTiddlersPath || ($tw.utils.isDirectory($tw.boot.wikiPath) && !$tw.utils.isDirectoryEmpty($tw.boot.wikiPath))) {\n\t\treturn \"Wiki folder is not empty\";\n\t}\n\t// Loop through each of the specified editions\n\tvar editions = this.params.length > 0 ? this.params : [\"empty\"];\n\tfor(var editionIndex=0; editionIndex<editions.length; editionIndex++) {\n\t\tvar editionName = editions[editionIndex];\n\t\t// Check the edition exists\n\t\tvar editionPath = $tw.findLibraryItem(editionName,$tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar));\n\t\tif(!$tw.utils.isDirectory(editionPath)) {\n\t\t\treturn \"Edition '\" + editionName + \"' not found\";\n\t\t}\n\t\t// Copy the edition content\n\t\tvar err = $tw.utils.copyDirectory(editionPath,$tw.boot.wikiPath);\n\t\tif(!err) {\n\t\t\tthis.commander.streams.output.write(\"Copied edition '\" + editionName + \"' to \" + $tw.boot.wikiPath + \"\\n\");\n\t\t} else {\n\t\t\treturn err;\n\t\t}\n\t}\n\t// Tweak the tiddlywiki.info to remove any included wikis\n\tvar packagePath = $tw.boot.wikiPath + \"/tiddlywiki.info\",\n\t\tpackageJson = JSON.parse(fs.readFileSync(packagePath));\n\tdelete packageJson.includeWikis;\n\tfs.writeFileSync(packagePath,JSON.stringify(packageJson,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/listen.js": {
"title": "$:/core/modules/commands/listen.js",
"text": "/*\\\ntitle: $:/core/modules/commands/listen.js\ntype: application/javascript\nmodule-type: command\n\nListen for HTTP requests and serve tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"listen\",\n\tsynchronous: true,\n\tnamedParameterMode: true,\n\tmandatoryParameters: [],\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this;\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: self.params\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/load.js": {
"title": "$:/core/modules/commands/load.js",
"text": "/*\\\ntitle: $:/core/modules/commands/load.js\ntype: application/javascript\nmodule-type: command\n\nCommand to load tiddlers from a file or directory\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"load\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar tiddlers = $tw.loadTiddlersFromPath(self.params[0]),\n\t\tcount = 0;\n\t$tw.utils.each(tiddlers,function(tiddlerInfo) {\n\t\t$tw.utils.each(tiddlerInfo.tiddlers,function(tiddler) {\n\t\t\tself.commander.wiki.importTiddler(new $tw.Tiddler(tiddler));\n\t\t\tcount++;\n\t\t});\n\t});\n\tif(!count && self.params[1] !== \"noerror\") {\n\t\tself.callback(\"No tiddlers found in file \\\"\" + self.params[0] + \"\\\"\");\n\t} else {\n\t\tself.callback(null);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/makelibrary.js": {
"title": "$:/core/modules/commands/makelibrary.js",
"text": "/*\\\ntitle: $:/core/modules/commands/makelibrary.js\ntype: application/javascript\nmodule-type: command\n\nCommand to pack all of the plugins in the library into a plugin tiddler of type \"library\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"makelibrary\",\n\tsynchronous: true\n};\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar wiki = this.commander.wiki,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tupgradeLibraryTitle = this.params[0] || UPGRADE_LIBRARY_TITLE,\n\t\ttiddlers = {};\n\t// Collect up the library plugins\n\tvar collectPlugins = function(folder) {\n\t\t\tvar pluginFolders = $tw.utils.getSubdirectories(folder) || [];\n\t\t\tfor(var p=0; p<pluginFolders.length; p++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(pluginFolders[p])) {\n\t\t\t\t\tpluginFields = $tw.loadPluginFolder(path.resolve(folder,\"./\" + pluginFolders[p]));\n\t\t\t\t\tif(pluginFields && pluginFields.title) {\n\t\t\t\t\t\ttiddlers[pluginFields.title] = pluginFields;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tcollectPublisherPlugins = function(folder) {\n\t\t\tvar publisherFolders = $tw.utils.getSubdirectories(folder) || [];\n\t\t\tfor(var t=0; t<publisherFolders.length; t++) {\n\t\t\t\tif(!$tw.boot.excludeRegExp.test(publisherFolders[t])) {\n\t\t\t\t\tcollectPlugins(path.resolve(folder,\"./\" + publisherFolders[t]));\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.pluginsPath,$tw.config.pluginsEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.themesPath,$tw.config.themesEnvVar),collectPublisherPlugins);\n\t$tw.utils.each($tw.getLibraryItemSearchPaths($tw.config.languagesPath,$tw.config.languagesEnvVar),collectPlugins);\n\t// Save the upgrade library tiddler\n\tvar pluginFields = {\n\t\ttitle: upgradeLibraryTitle,\n\t\ttype: \"application/json\",\n\t\t\"plugin-type\": \"library\",\n\t\t\"text\": JSON.stringify({tiddlers: tiddlers})\n\t};\n\twiki.addTiddler(new $tw.Tiddler(pluginFields));\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/output.js": {
"title": "$:/core/modules/commands/output.js",
"text": "/*\\\ntitle: $:/core/modules/commands/output.js\ntype: application/javascript\nmodule-type: command\n\nCommand to set the default output location (defaults to current working directory)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"output\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tvar fs = require(\"fs\"),\n\t\tpath = require(\"path\");\n\tif(this.params.length < 1) {\n\t\treturn \"Missing output path\";\n\t}\n\tthis.commander.outputPath = path.resolve(process.cwd(),this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/password.js": {
"title": "$:/core/modules/commands/password.js",
"text": "/*\\\ntitle: $:/core/modules/commands/password.js\ntype: application/javascript\nmodule-type: command\n\nSave password for crypto operations\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"password\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing password\";\n\t}\n\t$tw.crypto.setPassword(this.params[0]);\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/render.js": {
"title": "$:/core/modules/commands/render.js",
"text": "/*\\\ntitle: $:/core/modules/commands/render.js\ntype: application/javascript\nmodule-type: command\n\nRender individual tiddlers and save the results to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"render\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing tiddler filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]addsuffix[.html]]\",\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tvarName = this.params[4],\n\t\tvarValue = this.params[5],\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template || title),\n\t\t\tvariables = {currentTiddler: title};\n\t\tif(varName) {\n\t\t\tvariables[varName] = varValue || \"\";\n\t\t}\n\t\tvar widgetNode = wiki.makeWidget(parser,{variables: variables}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Rendering \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddler.js": {
"title": "$:/core/modules/commands/rendertiddler.js",
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render a tiddler and save it to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"rendertiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttype = this.params[2] || \"text/html\",\n\t\ttemplate = this.params[3],\n\t\tname = this.params[4],\n\t\tvalue = this.params[5],\n\t\tvariables = {};\n\t$tw.utils.createFileDirectories(filename);\n\tif(template) {\n\t\tvariables.currentTiddler = title;\n\t\ttitle = template;\n\t}\n\tif(name && value) {\n\t\tvariables[name] = value;\n\t}\n\tfs.writeFile(filename,this.commander.wiki.renderTiddler(type,title,{variables: variables}),\"utf8\",function(err) {\n\t\tself.callback(err);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/rendertiddlers.js": {
"title": "$:/core/modules/commands/rendertiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/rendertiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to render several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"rendertiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\ttemplate = this.params[1],\n\t\toutputPath = this.commander.outputPath,\n\t\tpathname = path.resolve(outputPath,this.params[2]),\t\t\n\t\ttype = this.params[3] || \"text/html\",\n\t\textension = this.params[4] || \".html\",\n\t\tdeleteDirectory = (this.params[5] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(template),\n\t\t\twidgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}}),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\tvar text = type === \"text/html\" ? container.innerHTML : container.textContent,\n\t\t\texportPath = null;\n\t\tif($tw.utils.hop($tw.macros,\"tv-get-export-path\")) {\n\t\t\tvar macroPath = $tw.macros[\"tv-get-export-path\"].run.apply(self,[title]);\n\t\t\tif(macroPath) {\n\t\t\t\texportPath = path.resolve(outputPath,macroPath + extension);\n\t\t\t}\n\t\t}\n\t\tvar finalPath = exportPath || path.resolve(pathname,encodeURIComponent(title) + extension);\n\t\t$tw.utils.createFileDirectories(finalPath);\n\t\tfs.writeFileSync(finalPath,text,\"utf8\");\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/save.js": {
"title": "$:/core/modules/commands/save.js",
"text": "/*\\\ntitle: $:/core/modules/commands/save.js\ntype: application/javascript\nmodule-type: command\n\nSaves individual tiddlers in their raw text or binary format to the specified files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"save\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename filter\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\ttiddlerFilter = this.params[0],\n\t\tfilenameFilter = this.params[1] || \"[is[tiddler]]\",\n\t\ttiddlers = wiki.filterTiddlers(tiddlerFilter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilepath = path.resolve(self.commander.outputPath,wiki.filterTiddlers(filenameFilter,$tw.rootWidget,wiki.makeTiddlerIterator([title]))[0]);\n\t\tif(self.commander.verbose) {\n\t\t\tconsole.log(\"Saving \\\"\" + title + \"\\\" to \\\"\" + filepath + \"\\\"\");\n\t\t}\n\t\t$tw.utils.createFileDirectories(filepath);\n\t\tfs.writeFileSync(filepath,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savelibrarytiddlers.js": {
"title": "$:/core/modules/commands/savelibrarytiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savelibrarytiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the subtiddlers of a bundle tiddler as a series of JSON files\n\n--savelibrarytiddlers <tiddler> <tiddler-filter> <pathname> <skinnylisting>\n\nThe tiddler identifies the bundle tiddler that contains the subtiddlers.\n\nThe tiddler filter specifies the plugins to be included.\n\nThe pathname specifies the pathname to the folder in which the JSON files should be saved. The filename is the URL encoded title of the subtiddler.\n\nThe skinnylisting specifies the title of the tiddler to which a JSON catalogue of the subtiddlers will be saved. The JSON file contains the same data as the bundle tiddler but with the `text` field removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savelibrarytiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\tcontainerTitle = this.params[0],\n\t\tfilter = this.params[1],\n\t\tbasepath = this.params[2],\n\t\tskinnyListTitle = this.params[3];\n\t// Get the container tiddler as data\n\tvar containerData = self.commander.wiki.getTiddlerDataCached(containerTitle,undefined);\n\tif(!containerData) {\n\t\treturn \"'\" + containerTitle + \"' is not a tiddler bundle\";\n\t}\n\t// Filter the list of plugins\n\tvar pluginList = [];\n\t$tw.utils.each(containerData.tiddlers,function(tiddler,title) {\n\t\tpluginList.push(title);\n\t});\n\tvar filteredPluginList;\n\tif(filter) {\n\t\tfilteredPluginList = self.commander.wiki.filterTiddlers(filter,null,self.commander.wiki.makeTiddlerIterator(pluginList));\n\t} else {\n\t\tfilteredPluginList = pluginList;\n\t}\n\t// Iterate through the plugins\n\tvar skinnyList = [];\n\t$tw.utils.each(filteredPluginList,function(title) {\n\t\tvar tiddler = containerData.tiddlers[title];\n\t\t// Save each JSON file and collect the skinny data\n\t\tvar pathname = path.resolve(self.commander.outputPath,basepath + encodeURIComponent(title) + \".json\");\n\t\t$tw.utils.createFileDirectories(pathname);\n\t\tfs.writeFileSync(pathname,JSON.stringify(tiddler),\"utf8\");\n\t\t// Collect the skinny list data\n\t\tvar pluginTiddlers = JSON.parse(tiddler.text),\n\t\t\treadmeContent = (pluginTiddlers.tiddlers[title + \"/readme\"] || {}).text,\n\t\t\tdoesRequireReload = !!self.commander.wiki.doesPluginInfoRequireReload(pluginTiddlers),\n\t\t\ticonTiddler = pluginTiddlers.tiddlers[title + \"/icon\"] || {},\n\t\t\ticonType = iconTiddler.type,\n\t\t\ticonText = iconTiddler.text,\n\t\t\ticonContent;\n\t\tif(iconType && iconText) {\n\t\t\ticonContent = $tw.utils.makeDataUri(iconText,iconType);\n\t\t}\n\t\tskinnyList.push($tw.utils.extend({},tiddler,{\n\t\t\ttext: undefined,\n\t\t\treadme: readmeContent,\n\t\t\t\"requires-reload\": doesRequireReload ? \"yes\" : \"no\",\n\t\t\ticon: iconContent\n\t\t}));\n\t});\n\t// Save the catalogue tiddler\n\tif(skinnyListTitle) {\n\t\tself.commander.wiki.setTiddlerData(skinnyListTitle,skinnyList);\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddler.js": {
"title": "$:/core/modules/commands/savetiddler.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddler.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the content of a tiddler to a file\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savetiddler\",\n\tsynchronous: false\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 2) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\ttitle = this.params[0],\n\t\tfilename = path.resolve(this.commander.outputPath,this.params[1]),\n\t\ttiddler = this.commander.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar type = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"};\n\t\t$tw.utils.createFileDirectories(filename);\n\t\tfs.writeFile(filename,tiddler.fields.text,contentTypeInfo.encoding,function(err) {\n\t\t\tself.callback(err);\n\t\t});\n\t} else {\n\t\treturn \"Missing tiddler: \" + title;\n\t}\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savetiddlers.js": {
"title": "$:/core/modules/commands/savetiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savetiddlers.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save several tiddlers to a folder of files\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"savetiddlers\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing filename\";\n\t}\n\tvar self = this,\n\t\tfs = require(\"fs\"),\n\t\tpath = require(\"path\"),\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tpathname = path.resolve(this.commander.outputPath,this.params[1]),\n\t\tdeleteDirectory = (this.params[2] || \"\").toLowerCase() !== \"noclean\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\tif(deleteDirectory) {\n\t\t$tw.utils.deleteDirectory(pathname);\n\t}\n\t$tw.utils.createDirectory(pathname);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.commander.wiki.getTiddler(title),\n\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\",\n\t\t\tcontentTypeInfo = $tw.config.contentTypeInfo[type] || {encoding: \"utf8\"},\n\t\t\tfilename = path.resolve(pathname,encodeURIComponent(title));\n\t\tfs.writeFileSync(filename,tiddler.fields.text,contentTypeInfo.encoding);\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/savewikifolder.js": {
"title": "$:/core/modules/commands/savewikifolder.js",
"text": "/*\\\ntitle: $:/core/modules/commands/savewikifolder.js\ntype: application/javascript\nmodule-type: command\n\nCommand to save the current wiki as a wiki folder\n\n--savewikifolder <wikifolderpath> [<filter>]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"savewikifolder\",\n\tsynchronous: true\n};\n\nvar fs,path;\nif($tw.node) {\n\tfs = require(\"fs\");\n\tpath = require(\"path\");\n}\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing wiki folder path\";\n\t}\n\tvar wikifoldermaker = new WikiFolderMaker(this.params[0],this.params[1],this.commander);\n\treturn wikifoldermaker.save();\n};\n\nfunction WikiFolderMaker(wikiFolderPath,wikiFilter,commander) {\n\tthis.wikiFolderPath = wikiFolderPath;\n\tthis.wikiFilter = wikiFilter || \"[all[tiddlers]]\";\n\tthis.commander = commander;\n\tthis.wiki = commander.wiki;\n\tthis.savedPaths = []; // So that we can detect filename clashes\n}\n\nWikiFolderMaker.prototype.log = function(str) {\n\tif(this.commander.verbose) {\n\t\tconsole.log(str);\n\t}\n};\n\nWikiFolderMaker.prototype.tiddlersToIgnore = [\n\t\"$:/boot/boot.css\",\n\t\"$:/boot/boot.js\",\n\t\"$:/boot/bootprefix.js\",\n\t\"$:/core\",\n\t\"$:/library/sjcl.js\",\n\t\"$:/temp/info-plugin\"\n];\n\n/*\nReturns null if successful, or an error string if there was an error\n*/\nWikiFolderMaker.prototype.save = function() {\n\tvar self = this;\n\t// Check that the output directory doesn't exist\n\tif(fs.existsSync(this.wikiFolderPath) && !$tw.utils.isDirectoryEmpty(this.wikiFolderPath)) {\n\t\treturn \"The unpackwiki command requires that the output wiki folder be empty\";\n\t}\n\t// Get the tiddlers from the source wiki\n\tvar tiddlerTitles = this.wiki.filterTiddlers(this.wikiFilter);\n\t// Initialise a new tiddlwiki.info file\n\tvar newWikiInfo = {};\n\t// Process each incoming tiddler in turn\n\t$tw.utils.each(tiddlerTitles,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tif(self.tiddlersToIgnore.indexOf(title) !== -1) {\n\t\t\t\t// Ignore the core plugin and the ephemeral info plugin\n\t\t\t\tself.log(\"Ignoring tiddler: \" + title);\n\t\t\t} else {\n\t\t\t\tvar type = tiddler.fields.type,\n\t\t\t\t\tpluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif(type === \"application/json\" && pluginType) {\n\t\t\t\t\t// Plugin tiddler\n\t\t\t\t\tvar libraryDetails = self.findPluginInLibrary(title);\n\t\t\t\t\tif(libraryDetails) {\n\t\t\t\t\t\t// A plugin from the core library\n\t\t\t\t\t\tself.log(\"Adding built-in plugin: \" + libraryDetails.name);\n\t\t\t\t\t\tnewWikiInfo[libraryDetails.type] = newWikiInfo[libraryDetails.type] || [];\n\t\t\t\t\t\t$tw.utils.pushTop(newWikiInfo[libraryDetails.type],libraryDetails.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// A custom plugin\n\t\t\t\t\t\tself.log(\"Processing custom plugin: \" + title);\n\t\t\t\t\t\tself.saveCustomPlugin(tiddler);\n\t\t\t\t\t}\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\t// Ordinary tiddler\n\t\t\t\t\tself.saveTiddler(\"tiddlers\",tiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Save the tiddlywiki.info file\n\tthis.saveJSONFile(\"tiddlywiki.info\",newWikiInfo);\n\tself.log(\"Writing tiddlywiki.info: \" + JSON.stringify(newWikiInfo,null,$tw.config.preferences.jsonSpaces));\n\treturn null;\n};\n\n/*\nTest whether the specified tiddler is a plugin in the plugin library\n*/\nWikiFolderMaker.prototype.findPluginInLibrary = function(title) {\n\tvar parts = title.split(\"/\"),\n\t\tpluginPath, type, name;\n\tif(parts[0] === \"$:\") {\n\t\tif(parts[1] === \"languages\" && parts.length === 3) {\n\t\t\tpluginPath = \"languages\" + path.sep + parts[2];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2];\n\t\t} else if(parts[1] === \"plugins\" || parts[1] === \"themes\" && parts.length === 4) {\n\t\t\tpluginPath = parts[1] + path.sep + parts[2] + path.sep + parts[3];\n\t\t\ttype = parts[1];\n\t\t\tname = parts[2] + \"/\" + parts[3];\n\t\t}\n\t}\n\tif(pluginPath && type && name) {\n\t\tpluginPath = path.resolve($tw.boot.bootPath,\"..\",pluginPath);\n\t\tif(fs.existsSync(pluginPath)) {\n\t\t\treturn {\n\t\t\t\tpluginPath: pluginPath,\n\t\t\t\ttype: type,\n\t\t\t\tname: name\n\t\t\t};\n\t\t}\n\t}\n\treturn false;\n};\n\nWikiFolderMaker.prototype.saveCustomPlugin = function(pluginTiddler) {\n\tvar self = this,\n\t\tpluginTitle = pluginTiddler.fields.title,\n\t\ttitleParts = pluginTitle.split(\"/\"),\n\t\tdirectory = $tw.utils.generateTiddlerFilepath(titleParts[titleParts.length - 1],{\n\t\t\tdirectory: path.resolve(this.wikiFolderPath,pluginTiddler.fields[\"plugin-type\"] + \"s\")\n\t\t}),\n\t\tpluginInfo = pluginTiddler.getFieldStrings({exclude: [\"text\",\"type\"]});\n\tthis.saveJSONFile(directory + path.sep + \"plugin.info\",pluginInfo);\n\tself.log(\"Writing \" + directory + path.sep + \"plugin.info: \" + JSON.stringify(pluginInfo,null,$tw.config.preferences.jsonSpaces));\n\tvar pluginTiddlers = JSON.parse(pluginTiddler.fields.text).tiddlers; // A hashmap of tiddlers in the plugin\n\t$tw.utils.each(pluginTiddlers,function(tiddler) {\n\t\tself.saveTiddler(directory,new $tw.Tiddler(tiddler));\n\t});\n};\n\nWikiFolderMaker.prototype.saveTiddler = function(directory,tiddler) {\n\tvar fileInfo = $tw.utils.generateTiddlerFileInfo(tiddler,{\n\t\tdirectory: path.resolve(this.wikiFolderPath,directory),\n\t\twiki: this.wiki\n\t});\n\t$tw.utils.saveTiddlerToFileSync(tiddler,fileInfo);\n};\n\nWikiFolderMaker.prototype.saveJSONFile = function(filename,json) {\n\tthis.saveTextFile(filename,JSON.stringify(json,null,$tw.config.preferences.jsonSpaces));\n};\n\nWikiFolderMaker.prototype.saveTextFile = function(filename,data) {\n\tthis.saveFile(filename,\"utf8\",data);\n};\n\nWikiFolderMaker.prototype.saveFile = function(filename,encoding,data) {\n\tvar filepath = path.resolve(this.wikiFolderPath,filename);\n\t$tw.utils.createFileDirectories(filepath);\n\tfs.writeFileSync(filepath,data,encoding);\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/server.js": {
"title": "$:/core/modules/commands/server.js",
"text": "/*\\\ntitle: $:/core/modules/commands/server.js\ntype: application/javascript\nmodule-type: command\n\nDeprecated legacy command for serving tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Server = require(\"$:/core/modules/server/server.js\").Server;\n\nexports.info = {\n\tname: \"server\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tvar self = this;\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(!$tw.boot.wikiTiddlersPath) {\n\t\t$tw.utils.warning(\"Warning: Wiki folder '\" + $tw.boot.wikiPath + \"' does not exist or is missing a tiddlywiki.info file\");\n\t}\n\t// Set up server\n\tthis.server = new Server({\n\t\twiki: this.commander.wiki,\n\t\tvariables: {\n\t\t\tport: this.params[0],\n\t\t\thost: this.params[6],\n\t\t\t\"root-tiddler\": this.params[1],\n\t\t\t\"root-render-type\": this.params[2],\n\t\t\t\"root-serve-type\": this.params[3],\n\t\t\tusername: this.params[4],\n\t\t\tpassword: this.params[5],\n\t\t\t\"path-prefix\": this.params[7],\n\t\t\t\"debug-level\": this.params[8]\n\t\t}\n\t});\n\tvar nodeServer = this.server.listen();\n\t$tw.hooks.invokeHook(\"th-server-command-post-start\",this.server,nodeServer,\"tiddlywiki\");\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/setfield.js": {
"title": "$:/core/modules/commands/setfield.js",
"text": "/*\\\ntitle: $:/core/modules/commands/setfield.js\ntype: application/javascript\nmodule-type: command\n\nCommand to modify selected tiddlers to set a field to the text of a template tiddler that has been wikified with the selected tiddler as the current tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.info = {\n\tname: \"setfield\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 4) {\n\t\treturn \"Missing parameters\";\n\t}\n\tvar self = this,\n\t\twiki = this.commander.wiki,\n\t\tfilter = this.params[0],\n\t\tfieldname = this.params[1] || \"text\",\n\t\ttemplatetitle = this.params[2],\n\t\trendertype = this.params[3] || \"text/plain\",\n\t\ttiddlers = wiki.filterTiddlers(filter);\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar parser = wiki.parseTiddler(templatetitle),\n\t\t\tnewFields = {},\n\t\t\ttiddler = wiki.getTiddler(title);\n\t\tif(parser) {\n\t\t\tvar widgetNode = wiki.makeWidget(parser,{variables: {currentTiddler: title}});\n\t\t\tvar container = $tw.fakeDocument.createElement(\"div\");\n\t\t\twidgetNode.render(container,null);\n\t\t\tnewFields[fieldname] = rendertype === \"text/html\" ? container.innerHTML : container.textContent;\n\t\t} else {\n\t\t\tnewFields[fieldname] = undefined;\n\t\t}\n\t\twiki.addTiddler(new $tw.Tiddler(tiddler,newFields));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/unpackplugin.js": {
"title": "$:/core/modules/commands/unpackplugin.js",
"text": "/*\\\ntitle: $:/core/modules/commands/unpackplugin.js\ntype: application/javascript\nmodule-type: command\n\nCommand to extract the shadow tiddlers from within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"unpackplugin\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander,callback) {\n\tthis.params = params;\n\tthis.commander = commander;\n\tthis.callback = callback;\n};\n\nCommand.prototype.execute = function() {\n\tif(this.params.length < 1) {\n\t\treturn \"Missing plugin name\";\n\t}\n\tvar self = this,\n\t\ttitle = this.params[0],\n\t\tpluginData = this.commander.wiki.getTiddlerDataCached(title);\n\tif(!pluginData) {\n\t\treturn \"Plugin '\" + title + \"' not found\";\n\t}\n\t$tw.utils.each(pluginData.tiddlers,function(tiddler) {\n\t\tself.commander.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t});\n\treturn null;\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/verbose.js": {
"title": "$:/core/modules/commands/verbose.js",
"text": "/*\\\ntitle: $:/core/modules/commands/verbose.js\ntype: application/javascript\nmodule-type: command\n\nVerbose command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"verbose\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.verbose = true;\n\t// Output the boot message log\n\tthis.commander.streams.output.write(\"Boot log:\\n \" + $tw.boot.logMessages.join(\"\\n \") + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/commands/version.js": {
"title": "$:/core/modules/commands/version.js",
"text": "/*\\\ntitle: $:/core/modules/commands/version.js\ntype: application/javascript\nmodule-type: command\n\nVersion command\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.info = {\n\tname: \"version\",\n\tsynchronous: true\n};\n\nvar Command = function(params,commander) {\n\tthis.params = params;\n\tthis.commander = commander;\n};\n\nCommand.prototype.execute = function() {\n\tthis.commander.streams.output.write($tw.version + \"\\n\");\n\treturn null; // No error\n};\n\nexports.Command = Command;\n\n})();\n",
"type": "application/javascript",
"module-type": "command"
},
"$:/core/modules/config.js": {
"title": "$:/core/modules/config.js",
"text": "/*\\\ntitle: $:/core/modules/config.js\ntype: application/javascript\nmodule-type: config\n\nCore configuration constants\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.preferences = {};\n\nexports.preferences.notificationDuration = 3 * 1000;\nexports.preferences.jsonSpaces = 4;\n\nexports.textPrimitives = {\n\tupperLetter: \"[A-Z\\u00c0-\\u00d6\\u00d8-\\u00de\\u0150\\u0170]\",\n\tlowerLetter: \"[a-z\\u00df-\\u00f6\\u00f8-\\u00ff\\u0151\\u0171]\",\n\tanyLetter: \"[A-Za-z0-9\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\",\n\tblockPrefixLetters:\t\"[A-Za-z0-9-_\\u00c0-\\u00d6\\u00d8-\\u00de\\u00df-\\u00f6\\u00f8-\\u00ff\\u0150\\u0170\\u0151\\u0171]\"\n};\n\nexports.textPrimitives.unWikiLink = \"~\";\nexports.textPrimitives.wikiLink = exports.textPrimitives.upperLetter + \"+\" +\n\texports.textPrimitives.lowerLetter + \"+\" +\n\texports.textPrimitives.upperLetter +\n\texports.textPrimitives.anyLetter + \"*\";\n\nexports.htmlEntities = {quot:34, amp:38, apos:39, lt:60, gt:62, nbsp:160, iexcl:161, cent:162, pound:163, curren:164, yen:165, brvbar:166, sect:167, uml:168, copy:169, ordf:170, laquo:171, not:172, shy:173, reg:174, macr:175, deg:176, plusmn:177, sup2:178, sup3:179, acute:180, micro:181, para:182, middot:183, cedil:184, sup1:185, ordm:186, raquo:187, frac14:188, frac12:189, frac34:190, iquest:191, Agrave:192, Aacute:193, Acirc:194, Atilde:195, Auml:196, Aring:197, AElig:198, Ccedil:199, Egrave:200, Eacute:201, Ecirc:202, Euml:203, Igrave:204, Iacute:205, Icirc:206, Iuml:207, ETH:208, Ntilde:209, Ograve:210, Oacute:211, Ocirc:212, Otilde:213, Ouml:214, times:215, Oslash:216, Ugrave:217, Uacute:218, Ucirc:219, Uuml:220, Yacute:221, THORN:222, szlig:223, agrave:224, aacute:225, acirc:226, atilde:227, auml:228, aring:229, aelig:230, ccedil:231, egrave:232, eacute:233, ecirc:234, euml:235, igrave:236, iacute:237, icirc:238, iuml:239, eth:240, ntilde:241, ograve:242, oacute:243, ocirc:244, otilde:245, ouml:246, divide:247, oslash:248, ugrave:249, uacute:250, ucirc:251, uuml:252, yacute:253, thorn:254, yuml:255, OElig:338, oelig:339, Scaron:352, scaron:353, Yuml:376, fnof:402, circ:710, tilde:732, Alpha:913, Beta:914, Gamma:915, Delta:916, Epsilon:917, Zeta:918, Eta:919, Theta:920, Iota:921, Kappa:922, Lambda:923, Mu:924, Nu:925, Xi:926, Omicron:927, Pi:928, Rho:929, Sigma:931, Tau:932, Upsilon:933, Phi:934, Chi:935, Psi:936, Omega:937, alpha:945, beta:946, gamma:947, delta:948, epsilon:949, zeta:950, eta:951, theta:952, iota:953, kappa:954, lambda:955, mu:956, nu:957, xi:958, omicron:959, pi:960, rho:961, sigmaf:962, sigma:963, tau:964, upsilon:965, phi:966, chi:967, psi:968, omega:969, thetasym:977, upsih:978, piv:982, ensp:8194, emsp:8195, thinsp:8201, zwnj:8204, zwj:8205, lrm:8206, rlm:8207, ndash:8211, mdash:8212, lsquo:8216, rsquo:8217, sbquo:8218, ldquo:8220, rdquo:8221, bdquo:8222, dagger:8224, Dagger:8225, bull:8226, hellip:8230, permil:8240, prime:8242, Prime:8243, lsaquo:8249, rsaquo:8250, oline:8254, frasl:8260, euro:8364, image:8465, weierp:8472, real:8476, trade:8482, alefsym:8501, larr:8592, uarr:8593, rarr:8594, darr:8595, harr:8596, crarr:8629, lArr:8656, uArr:8657, rArr:8658, dArr:8659, hArr:8660, forall:8704, part:8706, exist:8707, empty:8709, nabla:8711, isin:8712, notin:8713, ni:8715, prod:8719, sum:8721, minus:8722, lowast:8727, radic:8730, prop:8733, infin:8734, ang:8736, and:8743, or:8744, cap:8745, cup:8746, int:8747, there4:8756, sim:8764, cong:8773, asymp:8776, ne:8800, equiv:8801, le:8804, ge:8805, sub:8834, sup:8835, nsub:8836, sube:8838, supe:8839, oplus:8853, otimes:8855, perp:8869, sdot:8901, lceil:8968, rceil:8969, lfloor:8970, rfloor:8971, lang:9001, rang:9002, loz:9674, spades:9824, clubs:9827, hearts:9829, diams:9830 };\n\nexports.htmlVoidElements = \"area,base,br,col,command,embed,hr,img,input,keygen,link,meta,param,source,track,wbr\".split(\",\");\n\nexports.htmlBlockElements = \"address,article,aside,audio,blockquote,canvas,dd,div,dl,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,li,noscript,ol,output,p,pre,section,table,tfoot,ul,video\".split(\",\");\n\nexports.htmlUnsafeElements = \"script\".split(\",\");\n\n})();\n",
"type": "application/javascript",
"module-type": "config"
},
"$:/core/modules/deserializers.js": {
"title": "$:/core/modules/deserializers.js",
"text": "/*\\\ntitle: $:/core/modules/deserializers.js\ntype: application/javascript\nmodule-type: tiddlerdeserializer\n\nFunctions to deserialise tiddlers from a block of text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nUtility function to parse an old-style tiddler DIV in a *.tid file. It looks like this:\n\n<div title=\"Title\" creator=\"JoeBloggs\" modifier=\"JoeBloggs\" created=\"201102111106\" modified=\"201102111310\" tags=\"myTag [[my long tag]]\">\n<pre>The text of the tiddler (without the expected HTML encoding).\n</pre>\n</div>\n\nNote that the field attributes are HTML encoded, but that the body of the <PRE> tag is not encoded.\n\nWhen these tiddler DIVs are encountered within a TiddlyWiki HTML file then the body is encoded in the usual way.\n*/\nvar parseTiddlerDiv = function(text /* [,fields] */) {\n\t// Slot together the default results\n\tvar result = {};\n\tif(arguments.length > 1) {\n\t\tfor(var f=1; f<arguments.length; f++) {\n\t\t\tvar fields = arguments[f];\n\t\t\tfor(var t in fields) {\n\t\t\t\tresult[t] = fields[t];\t\t\n\t\t\t}\n\t\t}\n\t}\n\t// Parse the DIV body\n\tvar startRegExp = /^\\s*<div\\s+([^>]*)>(\\s*<pre>)?/gi,\n\t\tendRegExp,\n\t\tmatch = startRegExp.exec(text);\n\tif(match) {\n\t\t// Old-style DIVs don't have the <pre> tag\n\t\tif(match[2]) {\n\t\t\tendRegExp = /<\\/pre>\\s*<\\/div>\\s*$/gi;\n\t\t} else {\n\t\t\tendRegExp = /<\\/div>\\s*$/gi;\n\t\t}\n\t\tvar endMatch = endRegExp.exec(text);\n\t\tif(endMatch) {\n\t\t\t// Extract the text\n\t\t\tresult.text = text.substring(match.index + match[0].length,endMatch.index);\n\t\t\t// Process the attributes\n\t\t\tvar attrRegExp = /\\s*([^=\\s]+)\\s*=\\s*(?:\"([^\"]*)\"|'([^']*)')/gi,\n\t\t\t\tattrMatch;\n\t\t\tdo {\n\t\t\t\tattrMatch = attrRegExp.exec(match[1]);\n\t\t\t\tif(attrMatch) {\n\t\t\t\t\tvar name = attrMatch[1];\n\t\t\t\t\tvar value = attrMatch[2] !== undefined ? attrMatch[2] : attrMatch[3];\n\t\t\t\t\tresult[name] = value;\n\t\t\t\t}\n\t\t\t} while(attrMatch);\n\t\t\treturn result;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports[\"application/x-tiddler-html-div\"] = function(text,fields) {\n\treturn [parseTiddlerDiv(text,fields)];\n};\n\nexports[\"application/json\"] = function(text,fields) {\n\tvar incoming,\n\t\tresults = [];\n\ttry {\n\t\tincoming = JSON.parse(text);\n\t} catch(e) {\n\t\tincoming = [{\n\t\t\ttitle: \"JSON error: \" + e,\n\t\t\ttext: \"\"\n\t\t}]\n\t}\n\tif(!$tw.utils.isArray(incoming)) {\n\t\tincoming = [incoming];\n\t}\n\tfor(var t=0; t<incoming.length; t++) {\n\t\tvar incomingFields = incoming[t],\n\t\t\tfields = {};\n\t\tfor(var f in incomingFields) {\n\t\t\tif(typeof incomingFields[f] === \"string\") {\n\t\t\t\tfields[f] = incomingFields[f];\n\t\t\t}\n\t\t}\n\t\tresults.push(fields);\n\t}\n\treturn results;\n};\n\n/*\nParse an HTML file into tiddlers. There are three possibilities:\n# A TiddlyWiki classic HTML file containing `text/x-tiddlywiki` tiddlers\n# A TiddlyWiki5 HTML file containing `text/vnd.tiddlywiki` tiddlers\n# An ordinary HTML file\n*/\nexports[\"text/html\"] = function(text,fields) {\n\t// Check if we've got a store area\n\tvar storeAreaMarkerRegExp = /<div id=[\"']?storeArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\tmatch = storeAreaMarkerRegExp.exec(text);\n\tif(match) {\n\t\t// If so, it's either a classic TiddlyWiki file or an unencrypted TW5 file\n\t\t// First read the normal tiddlers\n\t\tvar results = deserializeTiddlyWikiFile(text,storeAreaMarkerRegExp.lastIndex,!!match[1],fields);\n\t\t// Then any system tiddlers\n\t\tvar systemAreaMarkerRegExp = /<div id=[\"']?systemArea['\"]?( style=[\"']?display:none;[\"']?)?>/gi,\n\t\t\tsysMatch = systemAreaMarkerRegExp.exec(text);\n\t\tif(sysMatch) {\n\t\t\tresults.push.apply(results,deserializeTiddlyWikiFile(text,systemAreaMarkerRegExp.lastIndex,!!sysMatch[1],fields));\n\t\t}\n\t\treturn results;\n\t} else {\n\t\t// Check whether we've got an encrypted file\n\t\tvar encryptedStoreArea = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedStoreArea) {\n\t\t\t// If so, attempt to decrypt it using the current password\n\t\t\treturn $tw.utils.decryptStoreArea(encryptedStoreArea);\n\t\t} else {\n\t\t\t// It's not a TiddlyWiki so we'll return the entire HTML file as a tiddler\n\t\t\treturn deserializeHtmlFile(text,fields);\n\t\t}\n\t}\n};\n\nfunction deserializeHtmlFile(text,fields) {\n\tvar result = {};\n\t$tw.utils.each(fields,function(value,name) {\n\t\tresult[name] = value;\n\t});\n\tresult.text = text;\n\tresult.type = \"text/html\";\n\treturn [result];\n}\n\nfunction deserializeTiddlyWikiFile(text,storeAreaEnd,isTiddlyWiki5,fields) {\n\tvar results = [],\n\t\tendOfDivRegExp = /(<\\/div>\\s*)/gi,\n\t\tstartPos = storeAreaEnd,\n\t\tdefaultType = isTiddlyWiki5 ? undefined : \"text/x-tiddlywiki\";\n\tendOfDivRegExp.lastIndex = startPos;\n\tvar match = endOfDivRegExp.exec(text);\n\twhile(match) {\n\t\tvar endPos = endOfDivRegExp.lastIndex,\n\t\t\ttiddlerFields = parseTiddlerDiv(text.substring(startPos,endPos),fields,{type: defaultType});\n\t\tif(!tiddlerFields) {\n\t\t\tbreak;\n\t\t}\n\t\t$tw.utils.each(tiddlerFields,function(value,name) {\n\t\t\tif(typeof value === \"string\") {\n\t\t\t\ttiddlerFields[name] = $tw.utils.htmlDecode(value);\n\t\t\t}\n\t\t});\n\t\tif(tiddlerFields.text !== null) {\n\t\t\tresults.push(tiddlerFields);\n\t\t}\n\t\tstartPos = endPos;\n\t\tmatch = endOfDivRegExp.exec(text);\n\t}\n\treturn results;\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "tiddlerdeserializer"
},
"$:/core/modules/editor/engines/framed.js": {
"title": "$:/core/modules/editor/engines/framed.js",
"text": "/*\\\ntitle: $:/core/modules/editor/engines/framed.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea within an iframe. This is done so that the selection is preserved even when clicking away from the textarea\n\n\\*/\n(function(){\n\n/*jslint node: true,browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction FramedEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Create our hidden dummy text area for reading styles\n\tthis.dummyTextArea = this.widget.document.createElement(\"textarea\");\n\tif(this.widget.editClass) {\n\t\tthis.dummyTextArea.className = this.widget.editClass;\n\t}\n\tthis.dummyTextArea.setAttribute(\"hidden\",\"true\");\n\tthis.parentNode.insertBefore(this.dummyTextArea,this.nextSibling);\n\tthis.widget.domNodes.push(this.dummyTextArea);\n\t// Create the iframe\n\tthis.iframeNode = this.widget.document.createElement(\"iframe\");\n\tthis.parentNode.insertBefore(this.iframeNode,this.nextSibling);\n\tthis.iframeDoc = this.iframeNode.contentWindow.document;\n\t// (Firefox requires us to put some empty content in the iframe)\n\tthis.iframeDoc.open();\n\tthis.iframeDoc.write(\"\");\n\tthis.iframeDoc.close();\n\t// Style the iframe\n\tthis.iframeNode.className = this.dummyTextArea.className;\n\tthis.iframeNode.style.border = \"none\";\n\tthis.iframeNode.style.padding = \"0\";\n\tthis.iframeNode.style.resize = \"none\";\n\tthis.iframeDoc.body.style.margin = \"0\";\n\tthis.iframeDoc.body.style.padding = \"0\";\n\tthis.widget.domNodes.push(this.iframeNode);\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.iframeDoc.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.iframeDoc.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.iframeNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\n\t}\t\n\t// Copy the styles from the dummy textarea\n\tthis.copyStyles();\n\t// Add event listeners\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"click\",handlerObject: this,handlerMethod: \"handleClickEvent\"},\n\t\t{name: \"input\",handlerObject: this,handlerMethod: \"handleInputEvent\"},\n\t\t{name: \"keydown\",handlerObject: this.widget,handlerMethod: \"handleKeydownEvent\"},\n\t\t{name: \"focus\",handlerObject: this,handlerMethod: \"handleFocusEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.iframeDoc.body.appendChild(this.domNode);\n}\n\n/*\nCopy styles from the dummy text area to the textarea in the iframe\n*/\nFramedEngine.prototype.copyStyles = function() {\n\t// Copy all styles\n\t$tw.utils.copyStyles(this.dummyTextArea,this.domNode);\n\t// Override the ones that should not be set the same as the dummy textarea\n\tthis.domNode.style.display = \"block\";\n\tthis.domNode.style.width = \"100%\";\n\tthis.domNode.style.margin = \"0\";\n\t// In Chrome setting -webkit-text-fill-color overrides the placeholder text colour\n\tthis.domNode.style[\"-webkit-text-fill-color\"] = \"currentcolor\";\n};\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nFramedEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode) {\n\t\t\tthis.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nFramedEngine.prototype.updateDomNodeText = function(text) {\n\tthis.domNode.value = text;\n};\n\n/*\nGet the text of the engine\n*/\nFramedEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nFramedEngine.prototype.fixHeight = function() {\n\t// Make sure styles are updated\n\tthis.copyStyles();\n\t// Adjust height\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tvar newHeight = $tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t\tthis.iframeNode.style.height = (newHeight + 14) + \"px\"; // +14 for the border on the textarea\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t\tthis.iframeNode.style.height = (fixedHeight + 14) + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nFramedEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a focus event\n*/\nFramedEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\t\n\t}\n};\n\n/*\nHandle a click\n*/\nFramedEngine.prototype.handleClickEvent = function(event) {\n\tthis.fixHeight();\n\treturn true;\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nFramedEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions);\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nFramedEngine.prototype.createTextOperation = function() {\n\tvar operation = {\n\t\ttext: this.domNode.value,\n\t\tselStart: this.domNode.selectionStart,\n\t\tselEnd: this.domNode.selectionEnd,\n\t\tcutStart: null,\n\t\tcutEnd: null,\n\t\treplacement: null,\n\t\tnewSelStart: null,\n\t\tnewSelEnd: null\n\t};\n\toperation.selection = operation.text.substring(operation.selStart,operation.selEnd);\n\treturn operation;\n};\n\n/*\nExecute a text operation\n*/\nFramedEngine.prototype.executeTextOperation = function(operation) {\n\t// Perform the required changes to the text area and the underlying tiddler\n\tvar newText = operation.text;\n\tif(operation.replacement !== null) {\n\t\tnewText = operation.text.substring(0,operation.cutStart) + operation.replacement + operation.text.substring(operation.cutEnd);\n\t\t// Attempt to use a execCommand to modify the value of the control\n\t\tif(this.iframeDoc.queryCommandSupported(\"insertText\") && this.iframeDoc.queryCommandSupported(\"delete\") && !$tw.browser.isFirefox) {\n\t\t\tthis.domNode.focus();\n\t\t\tthis.domNode.setSelectionRange(operation.cutStart,operation.cutEnd);\n\t\t\tif(operation.replacement === \"\") {\n\t\t\t\tthis.iframeDoc.execCommand(\"delete\",false,\"\");\n\t\t\t} else {\n\t\t\t\tthis.iframeDoc.execCommand(\"insertText\",false,operation.replacement);\n\t\t\t}\n\t\t} else {\n\t\t\tthis.domNode.value = newText;\n\t\t}\n\t\tthis.domNode.focus();\n\t\tthis.domNode.setSelectionRange(operation.newSelStart,operation.newSelEnd);\n\t}\n\tthis.domNode.focus();\n\treturn newText;\n};\n\nexports.FramedEngine = FramedEngine;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/engines/simple.js": {
"title": "$:/core/modules/editor/engines/simple.js",
"text": "/*\\\ntitle: $:/core/modules/editor/engines/simple.js\ntype: application/javascript\nmodule-type: library\n\nText editor engine based on a simple input or textarea tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HEIGHT_VALUE_TITLE = \"$:/config/TextEditor/EditorHeight/Height\";\n\nfunction SimpleEngine(options) {\n\t// Save our options\n\toptions = options || {};\n\tthis.widget = options.widget;\n\tthis.value = options.value;\n\tthis.parentNode = options.parentNode;\n\tthis.nextSibling = options.nextSibling;\n\t// Construct the textarea or input node\n\tvar tag = this.widget.editTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"input\";\n\t}\n\tthis.domNode = this.widget.document.createElement(tag);\n\t// Set the text\n\tif(this.widget.editTag === \"textarea\") {\n\t\tthis.domNode.appendChild(this.widget.document.createTextNode(this.value));\n\t} else {\n\t\tthis.domNode.value = this.value;\n\t}\n\t// Set the attributes\n\tif(this.widget.editType) {\n\t\tthis.domNode.setAttribute(\"type\",this.widget.editType);\n\t}\n\tif(this.widget.editPlaceholder) {\n\t\tthis.domNode.setAttribute(\"placeholder\",this.widget.editPlaceholder);\n\t}\n\tif(this.widget.editSize) {\n\t\tthis.domNode.setAttribute(\"size\",this.widget.editSize);\n\t}\n\tif(this.widget.editRows) {\n\t\tthis.domNode.setAttribute(\"rows\",this.widget.editRows);\n\t}\n\tif(this.widget.editClass) {\n\t\tthis.domNode.className = this.widget.editClass;\n\t}\n\tif(this.widget.editTabIndex) {\n\t\tthis.domNode.setAttribute(\"tabindex\",this.widget.editTabIndex);\n\t}\n\tif(this.widget.editAutoComplete) {\n\t\tthis.domNode.setAttribute(\"autocomplete\",this.widget.editAutoComplete);\n\t}\n\tif(this.widget.isDisabled === \"yes\") {\n\t\tthis.domNode.setAttribute(\"disabled\",true);\n\t}\n\t// Add an input event handler\n\t$tw.utils.addEventListeners(this.domNode,[\n\t\t{name: \"focus\", handlerObject: this, handlerMethod: \"handleFocusEvent\"},\n\t\t{name: \"input\", handlerObject: this, handlerMethod: \"handleInputEvent\"}\n\t]);\n\t// Insert the element into the DOM\n\tthis.parentNode.insertBefore(this.domNode,this.nextSibling);\n\tthis.widget.domNodes.push(this.domNode);\n}\n\n/*\nSet the text of the engine if it doesn't currently have focus\n*/\nSimpleEngine.prototype.setText = function(text,type) {\n\tif(!this.domNode.isTiddlyWikiFakeDom) {\n\t\tif(this.domNode.ownerDocument.activeElement !== this.domNode || text === \"\") {\n\t\t\tthis.updateDomNodeText(text);\n\t\t}\n\t\t// Fix the height if needed\n\t\tthis.fixHeight();\n\t}\n};\n\n/*\nUpdate the DomNode with the new text\n*/\nSimpleEngine.prototype.updateDomNodeText = function(text) {\n\tthis.domNode.value = text;\n};\n\n/*\nGet the text of the engine\n*/\nSimpleEngine.prototype.getText = function() {\n\treturn this.domNode.value;\n};\n\n/*\nFix the height of textarea to fit content\n*/\nSimpleEngine.prototype.fixHeight = function() {\n\tif(this.widget.editTag === \"textarea\") {\n\t\tif(this.widget.editAutoHeight) {\n\t\t\tif(this.domNode && !this.domNode.isTiddlyWikiFakeDom) {\n\t\t\t\t$tw.utils.resizeTextAreaToFit(this.domNode,this.widget.editMinHeight);\n\t\t\t}\n\t\t} else {\n\t\t\tvar fixedHeight = parseInt(this.widget.wiki.getTiddlerText(HEIGHT_VALUE_TITLE,\"400px\"),10);\n\t\t\tfixedHeight = Math.max(fixedHeight,20);\n\t\t\tthis.domNode.style.height = fixedHeight + \"px\";\n\t\t}\n\t}\n};\n\n/*\nFocus the engine node\n*/\nSimpleEngine.prototype.focus = function() {\n\tif(this.domNode.focus && this.domNode.select) {\n\t\tthis.domNode.focus();\n\t\tthis.domNode.select();\n\t}\n};\n\n/*\nHandle a dom \"input\" event which occurs when the text has changed\n*/\nSimpleEngine.prototype.handleInputEvent = function(event) {\n\tthis.widget.saveChanges(this.getText());\n\tthis.fixHeight();\n\tif(this.widget.editInputActions) {\n\t\tthis.widget.invokeActionString(this.widget.editInputActions);\n\t}\n\treturn true;\n};\n\n/*\nHandle a dom \"focus\" event\n*/\nSimpleEngine.prototype.handleFocusEvent = function(event) {\n\tif(this.widget.editCancelPopups) {\n\t\t$tw.popup.cancel(0);\n\t}\n\tif(this.widget.editFocusPopup) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNode,\n\t\t\ttitle: this.widget.editFocusPopup,\n\t\t\twiki: this.widget.wiki,\n\t\t\tforce: true\n\t\t});\n\t}\n\treturn true;\n};\n\n/*\nCreate a blank structure representing a text operation\n*/\nSimpleEngine.prototype.createTextOperation = function() {\n\treturn null;\n};\n\n/*\nExecute a text operation\n*/\nSimpleEngine.prototype.executeTextOperation = function(operation) {\n};\n\nexports.SimpleEngine = SimpleEngine;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/factory.js": {
"title": "$:/core/modules/editor/factory.js",
"text": "/*\\\ntitle: $:/core/modules/editor/factory.js\ntype: application/javascript\nmodule-type: library\n\nFactory for constructing text editor widgets with specified engines for the toolbar and non-toolbar cases\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_MIN_TEXT_AREA_HEIGHT = \"100px\"; // Minimum height of textareas in pixels\n\n// Configuration tiddlers\nvar HEIGHT_MODE_TITLE = \"$:/config/TextEditor/EditorHeight/Mode\";\nvar ENABLE_TOOLBAR_TITLE = \"$:/config/TextEditor/EnableToolbar\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nfunction editTextWidgetFactory(toolbarEngine,nonToolbarEngine) {\n\n\tvar EditTextWidget = function(parseTreeNode,options) {\n\t\t// Initialise the editor operations if they've not been done already\n\t\tif(!this.editorOperations) {\n\t\t\tEditTextWidget.prototype.editorOperations = {};\n\t\t\t$tw.modules.applyMethods(\"texteditoroperation\",this.editorOperations);\n\t\t}\n\t\tthis.initialise(parseTreeNode,options);\n\t};\n\n\t/*\n\tInherit from the base widget class\n\t*/\n\tEditTextWidget.prototype = new Widget();\n\n\t/*\n\tRender this widget into the DOM\n\t*/\n\tEditTextWidget.prototype.render = function(parent,nextSibling) {\n\t\t// Save the parent dom node\n\t\tthis.parentDomNode = parent;\n\t\t// Compute our attributes\n\t\tthis.computeAttributes();\n\t\t// Execute our logic\n\t\tthis.execute();\n\t\t// Create the wrapper for the toolbar and render its content\n\t\tif(this.editShowToolbar) {\n\t\t\tthis.toolbarNode = this.document.createElement(\"div\");\n\t\t\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\t\t\tparent.insertBefore(this.toolbarNode,nextSibling);\n\t\t\tthis.renderChildren(this.toolbarNode,null);\n\t\t\tthis.domNodes.push(this.toolbarNode);\n\t\t}\n\t\t// Create our element\n\t\tvar editInfo = this.getEditInfo(),\n\t\t\tEngine = this.editShowToolbar ? toolbarEngine : nonToolbarEngine;\n\t\tthis.engine = new Engine({\n\t\t\t\twidget: this,\n\t\t\t\tvalue: editInfo.value,\n\t\t\t\ttype: editInfo.type,\n\t\t\t\tparentNode: parent,\n\t\t\t\tnextSibling: nextSibling\n\t\t\t});\n\t\t// Call the postRender hook\n\t\tif(this.postRender) {\n\t\t\tthis.postRender();\n\t\t}\n\t\t// Fix height\n\t\tthis.engine.fixHeight();\n\t\t// Focus if required\n\t\tif(this.editFocus === \"true\" || this.editFocus === \"yes\") {\n\t\t\tthis.engine.focus();\n\t\t}\n\t\t// Add widget message listeners\n\t\tthis.addEventListeners([\n\t\t\t{type: \"tm-edit-text-operation\", handler: \"handleEditTextOperationMessage\"}\n\t\t]);\n\t};\n\n\t/*\n\tGet the tiddler being edited and current value\n\t*/\n\tEditTextWidget.prototype.getEditInfo = function() {\n\t\t// Get the edit value\n\t\tvar self = this,\n\t\t\tvalue,\n\t\t\ttype = \"text/plain\",\n\t\t\tupdate;\n\t\tif(this.editIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.editTitle,this.editIndex,this.editDefault);\n\t\t\tupdate = function(value) {\n\t\t\t\tvar data = self.wiki.getTiddlerData(self.editTitle,{});\n\t\t\t\tif(data[self.editIndex] !== value) {\n\t\t\t\t\tdata[self.editIndex] = value;\n\t\t\t\t\tself.wiki.setTiddlerData(self.editTitle,data);\n\t\t\t\t}\n\t\t\t};\n\t\t} else {\n\t\t\t// Get the current tiddler and the field name\n\t\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\t\tif(tiddler) {\n\t\t\t\t// If we've got a tiddler, the value to display is the field string value\n\t\t\t\tvalue = tiddler.getFieldString(this.editField);\n\t\t\t\tif(this.editField === \"text\") {\n\t\t\t\t\ttype = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise, we need to construct a default value for the editor\n\t\t\t\tswitch(this.editField) {\n\t\t\t\t\tcase \"text\":\n\t\t\t\t\t\tvalue = \"Type the text for the tiddler '\" + this.editTitle + \"'\";\n\t\t\t\t\t\ttype = \"text/vnd.tiddlywiki\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"title\":\n\t\t\t\t\t\tvalue = this.editTitle;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tvalue = \"\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(this.editDefault !== undefined) {\n\t\t\t\t\tvalue = this.editDefault;\n\t\t\t\t}\n\t\t\t}\n\t\t\tupdate = function(value) {\n\t\t\t\tvar tiddler = self.wiki.getTiddler(self.editTitle),\n\t\t\t\t\tupdateFields = {\n\t\t\t\t\t\ttitle: self.editTitle\n\t\t\t\t\t};\n\t\t\t\tupdateFields[self.editField] = value;\n\t\t\t\tself.wiki.addTiddler(new $tw.Tiddler(self.wiki.getCreationFields(),tiddler,updateFields,self.wiki.getModificationFields()));\n\t\t\t};\n\t\t}\n\t\tif(this.editType) {\n\t\t\ttype = this.editType;\n\t\t}\n\t\treturn {value: value || \"\", type: type, update: update};\n\t};\n\n\t/*\n\tHandle an edit text operation message from the toolbar\n\t*/\n\tEditTextWidget.prototype.handleEditTextOperationMessage = function(event) {\n\t\t// Prepare information about the operation\n\t\tvar operation = this.engine.createTextOperation();\n\t\t// Invoke the handler for the selected operation\n\t\tvar handler = this.editorOperations[event.param];\n\t\tif(handler) {\n\t\t\thandler.call(this,event,operation);\n\t\t}\n\t\t// Execute the operation via the engine\n\t\tvar newText = this.engine.executeTextOperation(operation);\n\t\t// Fix the tiddler height and save changes\n\t\tthis.engine.fixHeight();\n\t\tthis.saveChanges(newText);\n\t};\n\n\t/*\n\tCompute the internal state of the widget\n\t*/\n\tEditTextWidget.prototype.execute = function() {\n\t\t// Get our parameters\n\t\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t\tthis.editField = this.getAttribute(\"field\",\"text\");\n\t\tthis.editIndex = this.getAttribute(\"index\");\n\t\tthis.editDefault = this.getAttribute(\"default\");\n\t\tthis.editClass = this.getAttribute(\"class\");\n\t\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\t\tthis.editSize = this.getAttribute(\"size\");\n\t\tthis.editRows = this.getAttribute(\"rows\");\n\t\tthis.editAutoHeight = this.wiki.getTiddlerText(HEIGHT_MODE_TITLE,\"auto\");\n\t\tthis.editAutoHeight = this.getAttribute(\"autoHeight\",this.editAutoHeight === \"auto\" ? \"yes\" : \"no\") === \"yes\";\n\t\tthis.editMinHeight = this.getAttribute(\"minHeight\",DEFAULT_MIN_TEXT_AREA_HEIGHT);\n\t\tthis.editFocusPopup = this.getAttribute(\"focusPopup\");\n\t\tthis.editFocus = this.getAttribute(\"focus\");\n\t\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\t\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\") === \"yes\";\n\t\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\t\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\t\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\n\t\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t\t// Get the default editor element tag and type\n\t\tvar tag,type;\n\t\tif(this.editField === \"text\") {\n\t\t\ttag = \"textarea\";\n\t\t} else {\n\t\t\ttag = \"input\";\n\t\t\tvar fieldModule = $tw.Tiddler.fieldModules[this.editField];\n\t\t\tif(fieldModule && fieldModule.editTag) {\n\t\t\t\ttag = fieldModule.editTag;\n\t\t\t}\n\t\t\tif(fieldModule && fieldModule.editType) {\n\t\t\t\ttype = fieldModule.editType;\n\t\t\t}\n\t\t\ttype = type || \"text\";\n\t\t}\n\t\t// Get the rest of our parameters\n\t\tthis.editTag = this.getAttribute(\"tag\",tag) || \"input\";\n\t\tthis.editType = this.getAttribute(\"type\",type);\n\t\t// Make the child widgets\n\t\tthis.makeChildWidgets();\n\t\t// Determine whether to show the toolbar\n\t\tthis.editShowToolbar = this.wiki.getTiddlerText(ENABLE_TOOLBAR_TITLE,\"yes\");\n\t\tthis.editShowToolbar = (this.editShowToolbar === \"yes\") && !!(this.children && this.children.length > 0) && (!this.document.isTiddlyWikiFakeDom);\n\t};\n\n\t/*\n\tSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n\t*/\n\tEditTextWidget.prototype.refresh = function(changedTiddlers) {\n\t\tvar changedAttributes = this.computeAttributes();\n\t\t// Completely rerender if any of our attributes have changed\n\t\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.placeholder || changedAttributes.size || changedAttributes.autoHeight || changedAttributes.minHeight || changedAttributes.focusPopup || changedAttributes.rows || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || changedTiddlers[HEIGHT_MODE_TITLE] || changedTiddlers[ENABLE_TOOLBAR_TITLE] || changedAttributes.disabled) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t\t} else if (changedTiddlers[this.editRefreshTitle]) {\n\t\t\tthis.engine.updateDomNodeText(this.getEditInfo().value);\n\t\t} else if(changedTiddlers[this.editTitle]) {\n\t\t\tvar editInfo = this.getEditInfo();\n\t\t\tthis.updateEditor(editInfo.value,editInfo.type);\n\t\t}\n\t\tthis.engine.fixHeight();\n\t\tif(this.editShowToolbar) {\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\treturn false;\n\t\t}\n\t};\n\n\t/*\n\tUpdate the editor with new text. This method is separate from updateEditorDomNode()\n\tso that subclasses can override updateEditor() and still use updateEditorDomNode()\n\t*/\n\tEditTextWidget.prototype.updateEditor = function(text,type) {\n\t\tthis.updateEditorDomNode(text,type);\n\t};\n\n\t/*\n\tUpdate the editor dom node with new text\n\t*/\n\tEditTextWidget.prototype.updateEditorDomNode = function(text,type) {\n\t\tthis.engine.setText(text,type);\n\t};\n\n\t/*\n\tSave changes back to the tiddler store\n\t*/\n\tEditTextWidget.prototype.saveChanges = function(text) {\n\t\tvar editInfo = this.getEditInfo();\n\t\tif(text !== editInfo.value) {\n\t\t\teditInfo.update(text);\n\t\t}\n\t};\n\n\t/*\n\tHandle a dom \"keydown\" event, which we'll bubble up to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.handleKeydownEvent = function(event) {\n\t\t// Check for a keyboard shortcut\n\t\tif(this.toolbarNode) {\n\t\t\tvar shortcutElements = this.toolbarNode.querySelectorAll(\"[data-tw-keyboard-shortcut]\");\n\t\t\tfor(var index=0; index<shortcutElements.length; index++) {\n\t\t\t\tvar el = shortcutElements[index],\n\t\t\t\t\tshortcutData = el.getAttribute(\"data-tw-keyboard-shortcut\"),\n\t\t\t\t\tkeyInfoArray = $tw.keyboardManager.parseKeyDescriptors(shortcutData,{\n\t\t\t\t\t\twiki: this.wiki\n\t\t\t\t\t});\n\t\t\t\tif($tw.keyboardManager.checkKeyDescriptors(event,keyInfoArray)) {\n\t\t\t\t\tvar clickEvent = this.document.createEvent(\"Events\");\n\t\t\t\t clickEvent.initEvent(\"click\",true,false);\n\t\t\t\t el.dispatchEvent(clickEvent);\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// Propogate the event to the container\n\t\tif(this.propogateKeydownEvent(event)) {\n\t\t\t// Ignore the keydown if it was already handled\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t\treturn true;\n\t\t}\n\t\t// Otherwise, process the keydown normally\n\t\treturn false;\n\t};\n\n\t/*\n\tPropogate keydown events to our container for the keyboard widgets benefit\n\t*/\n\tEditTextWidget.prototype.propogateKeydownEvent = function(event) {\n\t\tvar newEvent = this.document.createEventObject ? this.document.createEventObject() : this.document.createEvent(\"Events\");\n\t\tif(newEvent.initEvent) {\n\t\t\tnewEvent.initEvent(\"keydown\", true, true);\n\t\t}\n\t\tnewEvent.keyCode = event.keyCode;\n\t\tnewEvent.which = event.which;\n\t\tnewEvent.metaKey = event.metaKey;\n\t\tnewEvent.ctrlKey = event.ctrlKey;\n\t\tnewEvent.altKey = event.altKey;\n\t\tnewEvent.shiftKey = event.shiftKey;\n\t\treturn !this.parentDomNode.dispatchEvent(newEvent);\n\t};\n\n\treturn EditTextWidget;\n\n}\n\nexports.editTextWidgetFactory = editTextWidgetFactory;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/editor/operations/bitmap/clear.js": {
"title": "$:/core/modules/editor/operations/bitmap/clear.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/clear.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to clear the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"clear\"] = function(event) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.globalAlpha = 1;\n\tctx.fillStyle = event.paramObject.colour || \"white\";\n\tctx.fillRect(0,0,this.canvasDomNode.width,this.canvasDomNode.height);\n\t// Save changes\n\tthis.strokeEnd();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/bitmap/resize.js": {
"title": "$:/core/modules/editor/operations/bitmap/resize.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/resize.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to resize the image\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"resize\"] = function(event) {\n\t// Get the new width\n\tvar newWidth = parseInt(event.paramObject.width || this.canvasDomNode.width,10),\n\t\tnewHeight = parseInt(event.paramObject.height || this.canvasDomNode.height,10);\n\t// Update if necessary\n\tif(newWidth > 0 && newHeight > 0 && !(newWidth === this.currCanvas.width && newHeight === this.currCanvas.height)) {\n\t\tthis.changeCanvasSize(newWidth,newHeight);\n\t}\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/bitmap/rotate-left.js": {
"title": "$:/core/modules/editor/operations/bitmap/rotate-left.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/bitmap/rotate-left.js\ntype: application/javascript\nmodule-type: bitmapeditoroperation\n\nBitmap editor operation to rotate the image left by 90 degrees\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"rotate-left\"] = function(event) {\n\t// Rotate the canvas left by 90 degrees\n\tthis.rotateCanvasLeft();\n\t// Update the input controls\n\tthis.refreshToolbar();\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "bitmapeditoroperation"
},
"$:/core/modules/editor/operations/text/excise.js": {
"title": "$:/core/modules/editor/operations/text/excise.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/excise.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to excise the selection to a new tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"excise\"] = function(event,operation) {\n\tvar editTiddler = this.wiki.getTiddler(this.editTitle),\n\t\teditTiddlerTitle = this.editTitle;\n\tif(editTiddler && editTiddler.fields[\"draft.of\"]) {\n\t\teditTiddlerTitle = editTiddler.fields[\"draft.of\"];\n\t}\n\tvar excisionTitle = event.paramObject.title || this.wiki.generateNewTitle(\"New Excision\");\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\tthis.wiki.getModificationFields(),\n\t\t{\n\t\t\ttitle: excisionTitle,\n\t\t\ttext: operation.selection,\n\t\t\ttags: event.paramObject.tagnew === \"yes\" ? [editTiddlerTitle] : []\n\t\t}\n\t));\n\toperation.replacement = excisionTitle;\n\tswitch(event.paramObject.type || \"transclude\") {\n\t\tcase \"transclude\":\n\t\t\toperation.replacement = \"{{\" + operation.replacement+ \"}}\";\n\t\t\tbreak;\n\t\tcase \"link\":\n\t\t\toperation.replacement = \"[[\" + operation.replacement+ \"]]\";\n\t\t\tbreak;\n\t\tcase \"macro\":\n\t\t\toperation.replacement = \"<<\" + (event.paramObject.macro || \"translink\") + \" \\\"\\\"\\\"\" + operation.replacement + \"\\\"\\\"\\\">>\";\n\t\t\tbreak;\n\t}\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/make-link.js": {
"title": "$:/core/modules/editor/operations/text/make-link.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/make-link.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to make a link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"make-link\"] = function(event,operation) {\n\tif(operation.selection) {\n\t\toperation.replacement = \"[[\" + operation.selection + \"|\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t} else {\n\t\toperation.replacement = \"[[\" + event.paramObject.text + \"]]\";\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t}\n\toperation.newSelStart = operation.selStart + operation.replacement.length;\n\toperation.newSelEnd = operation.newSelStart;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/prefix-lines.js": {
"title": "$:/core/modules/editor/operations/text/prefix-lines.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/prefix-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to add a prefix to the selected lines\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"prefix-lines\"] = function(event,operation) {\n\tvar targetCount = parseInt(event.paramObject.count + \"\",10);\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Compose the required prefix\n\tvar prefix = $tw.utils.repeat(event.paramObject.character,targetCount);\n\t// Process each line\n\tvar lines = operation.text.substring(operation.cutStart,operation.cutEnd).split(/\\r?\\n/mg);\n\t$tw.utils.each(lines,function(line,index) {\n\t\t// Remove and count any existing prefix characters\n\t\tvar count = 0;\n\t\twhile(line.charAt(0) === event.paramObject.character) {\n\t\t\tline = line.substring(1);\n\t\t\tcount++;\n\t\t}\n\t\t// Remove any whitespace\n\t\twhile(line.charAt(0) === \" \") {\n\t\t\tline = line.substring(1);\n\t\t}\n\t\t// We're done if we removed the exact required prefix, otherwise add it\n\t\tif(count !== targetCount) {\n\t\t\t// Apply the prefix\n\t\t\tline = prefix + \" \" + line;\n\t\t}\n\t\t// Save the modified line\n\t\tlines[index] = line;\n\t});\n\t// Stitch the replacement text together and set the selection\n\toperation.replacement = lines.join(\"\\n\");\n\tif(lines.length === 1) {\n\t\toperation.newSelStart = operation.cutStart + operation.replacement.length;\n\t\toperation.newSelEnd = operation.newSelStart;\n\t} else {\n\t\toperation.newSelStart = operation.cutStart;\n\t\toperation.newSelEnd = operation.newSelStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/replace-all.js": {
"title": "$:/core/modules/editor/operations/text/replace-all.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-all.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the entire text\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-all\"] = function(event,operation) {\n\toperation.cutStart = 0;\n\toperation.cutEnd = operation.text.length;\n\toperation.replacement = event.paramObject.text;\n\toperation.newSelStart = 0;\n\toperation.newSelEnd = operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/replace-selection.js": {
"title": "$:/core/modules/editor/operations/text/replace-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/replace-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to replace the selection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"replace-selection\"] = function(event,operation) {\n\toperation.replacement = event.paramObject.text;\n\toperation.cutStart = operation.selStart;\n\toperation.cutEnd = operation.selEnd;\n\toperation.newSelStart = operation.selStart;\n\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/save-selection.js": {
"title": "$:/core/modules/editor/operations/text/save-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/save-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to save the current selection in a specified tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"save-selection\"] = function(event,operation) {\n\tvar tiddler = event.paramObject.tiddler,\n\t\tfield = event.paramObject.field || \"text\";\n\tif(tiddler && field) {\n\t\tthis.wiki.setText(tiddler,field,null,operation.text.substring(operation.selStart,operation.selEnd));\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/wrap-lines.js": {
"title": "$:/core/modules/editor/operations/text/wrap-lines.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-lines.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selected lines with a prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-lines\"] = function(event,operation) {\n\t// Cut just past the preceding line break, or the start of the text\n\toperation.cutStart = $tw.utils.findPrecedingLineBreak(operation.text,operation.selStart);\n\t// Cut to just past the following line break, or to the end of the text\n\toperation.cutEnd = $tw.utils.findFollowingLineBreak(operation.text,operation.selEnd);\n\t// Add the prefix and suffix\n\toperation.replacement = event.paramObject.prefix + \"\\n\" +\n\t\t\t\toperation.text.substring(operation.cutStart,operation.cutEnd) + \"\\n\" +\n\t\t\t\tevent.paramObject.suffix + \"\\n\";\n\toperation.newSelStart = operation.cutStart + event.paramObject.prefix.length + 1;\n\toperation.newSelEnd = operation.newSelStart + (operation.cutEnd - operation.cutStart);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/editor/operations/text/wrap-selection.js": {
"title": "$:/core/modules/editor/operations/text/wrap-selection.js",
"text": "/*\\\ntitle: $:/core/modules/editor/operations/text/wrap-selection.js\ntype: application/javascript\nmodule-type: texteditoroperation\n\nText editor operation to wrap the selection with the specified prefix and suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports[\"wrap-selection\"] = function(event,operation) {\n\tif(operation.selStart === operation.selEnd) {\n\t\t// No selection; check if we're within the prefix/suffix\n\t\tif(operation.text.substring(operation.selStart - event.paramObject.prefix.length,operation.selStart + event.paramObject.suffix.length) === event.paramObject.prefix + event.paramObject.suffix) {\n\t\t\t// Remove the prefix and suffix\n\t\t\toperation.cutStart = operation.selStart - event.paramObject.prefix.length;\n\t\t\toperation.cutEnd = operation.selEnd + event.paramObject.suffix.length;\n\t\t\toperation.replacement = \"\";\n\t\t\toperation.newSelStart = operation.cutStart;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t} else {\n\t\t\t// Wrap the cursor instead\n\t\t\toperation.cutStart = operation.selStart;\n\t\t\toperation.cutEnd = operation.selEnd;\n\t\t\toperation.replacement = event.paramObject.prefix + event.paramObject.suffix;\n\t\t\toperation.newSelStart = operation.selStart + event.paramObject.prefix.length;\n\t\t\toperation.newSelEnd = operation.newSelStart;\n\t\t}\n\t} else if(operation.text.substring(operation.selStart,operation.selStart + event.paramObject.prefix.length) === event.paramObject.prefix && operation.text.substring(operation.selEnd - event.paramObject.suffix.length,operation.selEnd) === event.paramObject.suffix) {\n\t\t// Prefix and suffix are already present, so remove them\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = operation.selection.substring(event.paramObject.prefix.length,operation.selection.length - event.paramObject.suffix.length);\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t} else {\n\t\t// Add the prefix and suffix\n\t\toperation.cutStart = operation.selStart;\n\t\toperation.cutEnd = operation.selEnd;\n\t\toperation.replacement = event.paramObject.prefix + operation.selection + event.paramObject.suffix;\n\t\toperation.newSelStart = operation.selStart;\n\t\toperation.newSelEnd = operation.selStart + operation.replacement.length;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "texteditoroperation"
},
"$:/core/modules/filterrunprefixes/all.js": {
"title": "$:/core/modules/filterrunprefixes/all.js",
"text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/all.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nUnion of sets without de-duplication.\nEquivalent to = filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.all = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.push.apply(results, operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filterrunprefix"
},
"$:/core/modules/filterrunprefixes/and.js": {
"title": "$:/core/modules/filterrunprefixes/and.js",
"text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/and.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nIntersection of sets.\nEquivalent to + filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.and = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\t// This replaces all the elements of the array, but keeps the actual array so that references to it are preserved\n\t\tsource = options.wiki.makeTiddlerIterator(results.toArray());\n\t\tresults.clear();\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filterrunprefix"
},
"$:/core/modules/filterrunprefixes/else.js": {
"title": "$:/core/modules/filterrunprefixes/else.js",
"text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/else.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to ~ filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.else = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length === 0) {\n\t\t\t// Main result so far is empty\n\t\t\tresults.pushTop(operationSubFunction(source,widget));\n\t\t}\n\t};\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filterrunprefix"
},
"$:/core/modules/filterrunprefixes/except.js": {
"title": "$:/core/modules/filterrunprefixes/except.js",
"text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/except.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nDifference of sets.\nEquivalent to - filter run prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.except = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.remove(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filterrunprefix"
},
"$:/core/modules/filterrunprefixes/filter.js": {
"title": "$:/core/modules/filterrunprefixes/filter.js",
"text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/filter.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.filter = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar resultsToRemove = [];\n\t\t\tresults.each(function(result) {\n\t\t\t\tvar filtered = operationSubFunction(options.wiki.makeTiddlerIterator([result]),widget);\n\t\t\t\tif(filtered.length === 0) {\n\t\t\t\t\tresultsToRemove.push(result);\n\t\t\t\t}\n\t\t\t});\n\t\t\tresults.remove(resultsToRemove);\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filterrunprefix"
},
"$:/core/modules/filterrunprefixes/intersection.js": {
"title": "$:/core/modules/filterrunprefixes/intersection.js",
"text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/intersection.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.intersection = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tif(results.length !== 0) {\n\t\t\tvar secondRunResults = operationSubFunction(source,widget);\n\t\t\tvar firstRunResults = results.toArray();\n\t\t\tresults.clear();\n\t\t\t$tw.utils.each(firstRunResults,function(title) {\n\t\t\t\tif(secondRunResults.indexOf(title) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t};\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filterrunprefix"
},
"$:/core/modules/filterrunprefixes/or.js": {
"title": "$:/core/modules/filterrunprefixes/or.js",
"text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/or.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\nEquivalent to a filter run with no prefix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.or = function(operationSubFunction) {\n\treturn function(results,source,widget) {\n\t\tresults.pushTop(operationSubFunction(source,widget));\n\t};\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filterrunprefix"
},
"$:/core/modules/filterrunprefixes/reduce.js": {
"title": "$:/core/modules/filterrunprefixes/reduce.js",
"text": "/*\\\ntitle: $:/core/modules/filterrunprefixes/reduce.js\ntype: application/javascript\nmodule-type: filterrunprefix\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter prefix function\n*/\nexports.reduce = function(operationSubFunction,options) {\n\treturn function(results,source,widget) {\n\t\tif(results.length > 0) {\n\t\t\tvar accumulator = \"\";\n\t\t\tvar index = 0;\n\t\t\tresults.each(function(title) {\n\t\t\t\tvar list = operationSubFunction(options.wiki.makeTiddlerIterator([title]),{\n\t\t\t\t\t\tgetVariable: function(name) {\n\t\t\t\t\t\t\tswitch(name) {\n\t\t\t\t\t\t\t\tcase \"currentTiddler\":\n\t\t\t\t\t\t\t\t\treturn \"\" + title;\n\t\t\t\t\t\t\t\tcase \"accumulator\":\n\t\t\t\t\t\t\t\t\treturn \"\" + accumulator;\n\t\t\t\t\t\t\t\tcase \"index\":\n\t\t\t\t\t\t\t\t\treturn \"\" + index;\n\t\t\t\t\t\t\t\tcase \"revIndex\":\n\t\t\t\t\t\t\t\t\treturn \"\" + (results.length - 1 - index);\n\t\t\t\t\t\t\t\tcase \"length\":\n\t\t\t\t\t\t\t\t\treturn \"\" + results.length;\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\treturn widget.getVariable(name);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\tif(list.length > 0) {\n\t\t\t\t\taccumulator = \"\" + list[0];\n\t\t\t\t}\n\t\t\t\t++index;\n\t\t\t});\n\t\t\tresults.clear();\n\t\t\tresults.push(accumulator);\t\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filterrunprefix"
},
"$:/core/modules/filters/addprefix.js": {
"title": "$:/core/modules/filters/addprefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/addprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a prefix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand + title);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/addsuffix.js": {
"title": "$:/core/modules/filters/addsuffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/addsuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for adding a suffix to each title in the list. This is\nespecially useful in contexts where only a filter expression is allowed\nand macro substitution isn't available.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.addsuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title + operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/after.js": {
"title": "$:/core/modules/filters/after.js",
"text": "/*\\\ntitle: $:/core/modules/filters/after.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is after the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.after = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index === -1 || index > (results.length - 2)) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index + 1]];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/all/current.js": {
"title": "$:/core/modules/filters/all/current.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/current.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar currTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(currTiddlerTitle) {\n\t\treturn [currTiddlerTitle];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/missing.js": {
"title": "$:/core/modules/filters/all/missing.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/missing.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\treturn options.wiki.getMissingTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/orphans.js": {
"title": "$:/core/modules/filters/all/orphans.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/orphans.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[orphans]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphans = function(source,prefix,options) {\n\treturn options.wiki.getOrphanTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/shadows.js": {
"title": "$:/core/modules/filters/all/shadows.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/shadows.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[shadows]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadows = function(source,prefix,options) {\n\treturn options.wiki.allShadowTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/tags.js": {
"title": "$:/core/modules/filters/all/tags.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/tags.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tags]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,prefix,options) {\n\treturn Object.keys(options.wiki.getTagMap());\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all/tiddlers.js": {
"title": "$:/core/modules/filters/all/tiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all/tiddlers.js\ntype: application/javascript\nmodule-type: allfilteroperator\n\nFilter function for [all[tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddlers = function(source,prefix,options) {\n\treturn options.wiki.allTitles();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "allfilteroperator"
},
"$:/core/modules/filters/all.js": {
"title": "$:/core/modules/filters/all.js",
"text": "/*\\\ntitle: $:/core/modules/filters/all.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for selecting tiddlers\n\n[all[shadows+tiddlers]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar allFilterOperators;\n\nfunction getAllFilterOperators() {\n\tif(!allFilterOperators) {\n\t\tallFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"allfilteroperator\",allFilterOperators);\n\t}\n\treturn allFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.all = function(source,operator,options) {\n\t// Get our suboperators\n\tvar allFilterOperators = getAllFilterOperators();\n\t// Cycle through the suboperators accumulating their results\n\tvar results = [],\n\t\tsubops = operator.operand.split(\"+\");\n\t// Check for common optimisations\n\tif(subops.length === 1 && subops[0] === \"\") {\n\t\treturn source;\n\t} else if(subops.length === 1 && subops[0] === \"tiddlers\") {\n\t\treturn options.wiki.each;\n\t} else if(subops.length === 1 && subops[0] === \"shadows\") {\n\t\treturn options.wiki.eachShadow;\n\t} else if(subops.length === 2 && subops[0] === \"tiddlers\" && subops[1] === \"shadows\") {\n\t\treturn options.wiki.eachTiddlerPlusShadows;\n\t} else if(subops.length === 2 && subops[0] === \"shadows\" && subops[1] === \"tiddlers\") {\n\t\treturn options.wiki.eachShadowPlusTiddlers;\n\t}\n\t// Do it the hard way\n\tfor(var t=0; t<subops.length; t++) {\n\t\tvar subop = allFilterOperators[subops[t]];\n\t\tif(subop) {\n\t\t\t$tw.utils.pushTop(results,subop(source,operator.prefix,options));\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/backlinks.js": {
"title": "$:/core/modules/filters/backlinks.js",
"text": "/*\\\ntitle: $:/core/modules/filters/backlinks.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the backlinks from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.backlinks = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerBacklinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/before.js": {
"title": "$:/core/modules/filters/before.js",
"text": "/*\\\ntitle: $:/core/modules/filters/before.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler from the current list that is before the tiddler named in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.before = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar index = results.indexOf(operator.operand);\n\tif(index <= 0) {\n\t\treturn [];\n\t} else {\n\t\treturn [results[index - 1]];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/commands.js": {
"title": "$:/core/modules/filters/commands.js",
"text": "/*\\\ntitle: $:/core/modules/filters/commands.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the commands available in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.commands = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.commands,function(commandInfo,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/compare.js": {
"title": "$:/core/modules/filters/compare.js",
"text": "/*\\\ntitle: $:/core/modules/filters/compare.js\ntype: application/javascript\nmodule-type: filteroperator\n\nGeneral purpose comparison operator\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.compare = function(source,operator,options) {\n\tvar suffixes = operator.suffixes || [],\n\t\ttype = (suffixes[0] || [])[0],\n\t\tmode = (suffixes[1] || [])[0],\n\t\ttypeFn = $tw.utils.makeCompareFunction(type,{defaultType: \"number\"}),\n\t\tmodeFn = modes[mode] || modes.eq,\n\t\tinvert = operator.prefix === \"!\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tif(modeFn(typeFn(title,operator.operand)) !== invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nvar modes = {\n\t\"eq\": function(value) {return value === 0;},\n\t\"ne\": function(value) {return value !== 0;},\n\t\"gteq\": function(value) {return value >= 0;},\n\t\"gt\": function(value) {return value > 0;},\n\t\"lteq\": function(value) {return value <= 0;},\n\t\"lt\": function(value) {return value < 0;}\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/contains.js": {
"title": "$:/core/modules/filters/contains.js",
"text": "/*\\\ntitle: $:/core/modules/filters/contains.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for finding values in array fields\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.contains = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"list\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\tvar list = tiddler.getFieldList(fieldname);\n\t\t\t\tif(list.indexOf(operator.operand) !== -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/count.js": {
"title": "$:/core/modules/filters/count.js",
"text": "/*\\\ntitle: $:/core/modules/filters/count.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the number of entries in the current list.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.count = function(source,operator,options) {\n\tvar count = 0;\n\tsource(function(tiddler,title) {\n\t\tcount++;\n\t});\n\treturn [count + \"\"];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/days.js": {
"title": "$:/core/modules/filters/days.js",
"text": "/*\\\ntitle: $:/core/modules/filters/days.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a specified date field within a specified date interval.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.days = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\tdayInterval = (parseInt(operator.operand,10)||0),\n\t\tdayIntervalSign = $tw.utils.sign(dayInterval),\n\t\ttargetTimeStamp = (new Date()).setHours(0,0,0,0) + 1000*60*60*24*dayInterval,\n\t\tisWithinDays = function(dateField) {\n\t\t\tvar sign = $tw.utils.sign(targetTimeStamp - (new Date(dateField)).setHours(0,0,0,0));\n\t\t\treturn sign === 0 || sign === dayIntervalSign;\n\t\t};\n\n\tif(operator.prefix === \"!\") {\n\t\ttargetTimeStamp = targetTimeStamp - 1000*60*60*24*dayIntervalSign;\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(!isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\t\tif(isWithinDays($tw.utils.parseDate(tiddler.fields[fieldName]))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/duplicateslugs.js": {
"title": "$:/core/modules/filters/duplicateslugs.js",
"text": "/*\\\ntitle: $:/core/modules/filters/duplicateslugs.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter function for [duplicateslugs[]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.duplicateslugs = function(source,operator,options) {\n\tvar slugs = Object.create(null), // Hashmap by slug of title, replaced with \"true\" if the duplicate title has already been output\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tvar slug = options.wiki.slugify(title);\n\t\tif(slug in slugs) {\n\t\t\tif(slugs[slug] !== true) {\n\t\t\t\tresults.push(slugs[slug]);\n\t\t\t\tslugs[slug] = true;\n\t\t\t}\n\t\t\tresults.push(title);\n\t\t} else {\n\t\t\tslugs[slug] = title;\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/each.js": {
"title": "$:/core/modules/filters/each.js",
"text": "/*\\\ntitle: $:/core/modules/filters/each.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique value of the specified field.\nWith suffix \"list\", selects all tiddlers that are values in a specified list field.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.each = function(source,operator,options) {\n\tvar results =[] ,\n\tvalue,values = {},\n\tfield = operator.operand || \"title\";\n\tif(operator.suffix === \"value\" && field === \"title\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(values,title)) {\n\t\t\t\tvalues[title] = true;\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else if(operator.suffix !== \"list-item\") {\n\t\tif(field === \"title\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && !$tw.utils.hop(values,title)) {\n\t\t\t\t\tvalues[title] = true;\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvalue = tiddler.getFieldString(field);\n\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\t$tw.utils.each(\n\t\t\t\t\toptions.wiki.getTiddlerList(title,field),\n\t\t\t\t\tfunction(value) {\n\t\t\t\t\t\tif(!$tw.utils.hop(values,value)) {\n\t\t\t\t\t\t\tvalues[value] = true;\n\t\t\t\t\t\t\tresults.push(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/eachday.js": {
"title": "$:/core/modules/filters/eachday.js",
"text": "/*\\\ntitle: $:/core/modules/filters/eachday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects one tiddler for each unique day covered by the specified date field\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.eachday = function(source,operator,options) {\n\tvar results = [],\n\t\tvalues = [],\n\t\tfieldName = operator.operand || \"modified\";\n\t// Function to convert a date/time to a date integer\n\tvar toDate = function(value) {\n\t\tvalue = (new Date(value)).setHours(0,0,0,0);\n\t\treturn value+0;\n\t};\n\tsource(function(tiddler,title) {\n\t\tif(tiddler && tiddler.fields[fieldName]) {\n\t\t\tvar value = toDate($tw.utils.parseDate(tiddler.fields[fieldName]));\n\t\t\tif(values.indexOf(value) === -1) {\n\t\t\t\tvalues.push(value);\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/editiondescription.js": {
"title": "$:/core/modules/filters/editiondescription.js",
"text": "/*\\\ntitle: $:/core/modules/filters/editiondescription.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the descriptions of the specified edition names\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editiondescription = function(source,operator,options) {\n\tvar results = [];\n\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif($tw.utils.hop(editionInfo,title)) {\n\t\t\t\t\tresults.push(editionInfo[title].description || \"\");\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/editions.js": {
"title": "$:/core/modules/filters/editions.js",
"text": "/*\\\ntitle: $:/core/modules/filters/editions.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the available editions in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.editions = function(source,operator,options) {\n\tvar results = [];\n\tif($tw.node) {\n\t\tvar editionInfo = $tw.utils.getEditionInfo();\n\t\tif(editionInfo) {\n\t\t\t$tw.utils.each(editionInfo,function(info,name) {\n\t\t\t\tresults.push(name);\n\t\t\t});\n\t\t}\n\t\tresults.sort();\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/else.js": {
"title": "$:/core/modules/filters/else.js",
"text": "/*\\\ntitle: $:/core/modules/filters/else.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing an empty input list with a constant, passing a non-empty input list straight through\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.else = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tif(results.length === 0) {\n\t\treturn [operator.operand];\n\t} else {\n\t\treturn results;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/decodeuricomponent.js": {
"title": "$:/core/modules/filters/decodeuricomponent.js",
"text": "/*\\\ntitle: $:/core/modules/filters/decodeuricomponent.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for applying decodeURIComponent() to each item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter functions\n*/\n\nexports.decodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURIComponent(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuricomponent = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURIComponent(title));\n\t});\n\treturn results;\n};\n\nexports.decodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar value = title;\n\t\ttry {\n\t\t\tvalue = decodeURI(title);\n\t\t} catch(e) {\n\t\t}\n\t\tresults.push(value);\n\t});\n\treturn results;\n};\n\nexports.encodeuri = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(encodeURI(title));\n\t});\n\treturn results;\n};\n\nexports.decodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlDecode(title));\n\t});\n\treturn results;\n};\n\nexports.encodehtml = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.htmlEncode(title));\n\t});\n\treturn results;\n};\n\nexports.stringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.stringify(title,(operator.suffix === \"rawunicode\")));\n\t});\n\treturn results;\n};\n\nexports.jsonstringify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.jsonStringify(title,(operator.suffix === \"rawunicode\")));\n\t});\n\treturn results;\n};\n\nexports.escaperegexp = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push($tw.utils.escapeRegExp(title));\n\t});\n\treturn results;\n};\n\nexports.escapecss = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t// escape any character with a special meaning in CSS using CSS.escape()\n\t\tresults.push(CSS.escape(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/enlist.js": {
"title": "$:/core/modules/filters/enlist.js",
"text": "/*\\\ntitle: $:/core/modules/filters/enlist.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand parsed as a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.enlist = function(source,operator,options) {\n\tvar allowDuplicates = false;\n\tswitch(operator.suffix) {\n\t\tcase \"raw\":\n\t\t\tallowDuplicates = true;\n\t\t\tbreak;\n\t\tcase \"dedupe\":\n\t\t\tallowDuplicates = false;\n\t\t\tbreak;\n\t}\n\tvar list = $tw.utils.parseStringArray(operator.operand,allowDuplicates);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/field.js": {
"title": "$:/core/modules/filters/field.js",
"text": "/*\\\ntitle: $:/core/modules/filters/field.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.field = function(source,operator,options) {\n\tvar results = [],indexedResults,\n\t\tfieldname = (operator.suffix || operator.operator || \"title\").toLowerCase();\n\tif(operator.prefix === \"!\") {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text !== operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.regexp) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && !!operator.regexp.exec(text)) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tif(source.byField && operator.operand) {\n\t\t\t\tindexedResults = source.byField(fieldname,operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults\n\t\t\t\t}\n\t\t\t}\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler) {\n\t\t\t\t\tvar text = tiddler.getFieldString(fieldname);\n\t\t\t\t\tif(text !== null && text === operator.operand) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/fields.js": {
"title": "$:/core/modules/filters/fields.js",
"text": "/*\\\ntitle: $:/core/modules/filters/fields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.fields = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName,\n\t\tsuffixes = (operator.suffixes || [])[0] || [],\n\t\toperand = $tw.utils.parseStringArray(operator.operand);\n\t\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(suffixes.indexOf(\"include\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? $tw.utils.pushTop(results,fieldName) : \"\";\n\t\t\t\t}\n\t\t\t} else if (suffixes.indexOf(\"exclude\") !== -1) {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t(operand.indexOf(fieldName) !== -1) ? \"\" : $tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else if\n\t\t\telse {\n\t\t\t\tfor(fieldName in tiddler.fields) {\n\t\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t\t}\n\t\t\t} // else\n\t\t} // if (tiddler)\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/filter.js": {
"title": "$:/core/modules/filters/filter.js",
"text": "/*\\\ntitle: $:/core/modules/filters/filter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning those input titles that pass a subfilter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.filter = function(source,operator,options) {\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\tresults = [],\n\t\ttarget = operator.prefix !== \"!\";\n\tsource(function(tiddler,title) {\n\t\tvar list = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]));\n\t\tif((list.length > 0) === target) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/format/date.js": {
"title": "$:/core/modules/filters/format/date.js",
"text": "/*\\\ntitle: $:/core/modules/filters/format/date.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.date = function(source,operand,options) {\n\tvar results = [];\t\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.formatDateString(value,operand || \"YYYY MM DD 0hh:0mm\"));\n\t\t}\n\t});\t\n\treturn results;\n};\n\n})();",
"type": "application/javascript",
"module-type": "formatfilteroperator"
},
"$:/core/modules/filters/format/relativedate.js": {
"title": "$:/core/modules/filters/format/relativedate.js",
"text": "/*\\\ntitle: $:/core/modules/filters/format/relativedate.js\ntype: application/javascript\nmodule-type: formatfilteroperator\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.relativedate = function(source,operand,options) {\n\tvar results = [];\t\n\tsource(function(tiddler,title) {\n\t\tvar value = $tw.utils.parseDate(title);\n\t\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\t\tresults.push($tw.utils.getRelativeDate((new Date()) - (new Date(value))).description);\n\t\t}\n\t});\t\n\treturn results;\n};\n\n})();",
"type": "application/javascript",
"module-type": "formatfilteroperator"
},
"$:/core/modules/filters/format.js": {
"title": "$:/core/modules/filters/format.js",
"text": "/*\\\ntitle: $:/core/modules/filters/format.js\ntype: application/javascript\nmodule-type: filteroperator\nFilter operator for formatting strings\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar formatFilterOperators;\n\nfunction getFormatFilterOperators() {\n\tif(!formatFilterOperators) {\n\t\tformatFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"formatfilteroperator\",formatFilterOperators);\n\t}\n\treturn formatFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.format = function(source,operator,options) {\n\t// Dispatch to the correct formatfilteroperator\n\tvar formatFilterOperators = getFormatFilterOperators();\n\tif(operator.suffix) {\n\t\tvar formatFilterOperator = formatFilterOperators[operator.suffix];\n\t\tif(formatFilterOperator) {\n\t\t\treturn formatFilterOperator(source,operator.operand,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/FormatFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all unchanged if the suffix is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/get.js": {
"title": "$:/core/modules/filters/get.js",
"text": "/*\\\ntitle: $:/core/modules/filters/get.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing tiddler titles by the value of the field specified in the operand.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.get = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tvar value = tiddler.getFieldString(operator.operand);\n\t\t\tif(value) {\n\t\t\t\tresults.push(value);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/getindex.js": {
"title": "$:/core/modules/filters/getindex.js",
"text": "/*\\\ntitle: $:/core/modules/filters/getindex.js\ntype: application/javascript\nmodule-type: filteroperator\n\nreturns the value at a given index of datatiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getindex = function(source,operator,options) {\n\tvar data,title,results = [];\n\tif(operator.operand){\n\t\tsource(function(tiddler,title) {\n\t\t\ttitle = tiddler ? tiddler.fields.title : title;\n\t\t\tdata = options.wiki.extractTiddlerDataItem(tiddler,operator.operand);\n\t\t\tif(data) {\n\t\t\t\tresults.push(data);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/getvariable.js": {
"title": "$:/core/modules/filters/getvariable.js",
"text": "/*\\\ntitle: $:/core/modules/filters/getvariable.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing input values by the value of the variable with the same name, or blank if the variable is missing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.getvariable = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.widget.getVariable(title) || \"\");\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/has.js": {
"title": "$:/core/modules/filters/has.js",
"text": "/*\\\ntitle: $:/core/modules/filters/has.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a tiddler has the specified field or index\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.has = function(source,operator,options) {\n\tvar results = [],\n\t\tinvert = operator.prefix === \"!\";\n\n\tif(operator.suffix === \"field\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(tiddler.fields,operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse if(operator.suffix === \"index\") {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || (tiddler && (!$tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)))) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(options.wiki.getTiddlerDataCached(tiddler,Object.create(null)),operator.operand)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\telse {\n\t\tif(invert) {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,operator.operand) || (tiddler.fields[operator.operand].length === 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,operator.operand) && (tiddler.fields[operator.operand].length !== 0)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\t\t\t\t\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/haschanged.js": {
"title": "$:/core/modules/filters/haschanged.js",
"text": "/*\\\ntitle: $:/core/modules/filters/haschanged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returns tiddlers from the list that have a non-zero changecount.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.haschanged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) === 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.getChangeCount(title) > 0) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/indexes.js": {
"title": "$:/core/modules/filters/indexes.js",
"text": "/*\\\ntitle: $:/core/modules/filters/indexes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the indexes of a data tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.indexes = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar data = options.wiki.getTiddlerDataCached(title);\n\t\tif(data) {\n\t\t\t$tw.utils.pushTop(results,Object.keys(data));\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/insertbefore.js": {
"title": "$:/core/modules/filters/insertbefore.js",
"text": "/*\\\ntitle: $:/core/modules/filters/insertbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nInsert an item before another item in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.insertbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\tvar target = options.widget && options.widget.getVariable(operator.suffix || \"currentTiddler\");\n\tif(target !== operator.operand) {\n\t\t// Remove the entry from the list if it is present\n\t\tvar pos = results.indexOf(operator.operand);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,1);\n\t\t}\n\t\t// Insert the entry before the target marker\n\t\tpos = results.indexOf(target);\n\t\tif(pos !== -1) {\n\t\t\tresults.splice(pos,0,operator.operand);\n\t\t} else {\n\t\t\tresults.push(operator.operand);\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/is/binary.js": {
"title": "$:/core/modules/filters/is/binary.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/binary.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[binary]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.binary = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isBinaryTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/blank.js": {
"title": "$:/core/modules/filters/is/blank.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/blank.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[blank]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.blank = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!title) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/current.js": {
"title": "$:/core/modules/filters/is/current.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/current.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[current]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.current = function(source,prefix,options) {\n\tvar results = [],\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\");\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title !== currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title === currTiddlerTitle) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/draft.js": {
"title": "$:/core/modules/filters/is/draft.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/draft.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[draft]] analagous to [has[draft.of]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.draft = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !$tw.utils.hop(tiddler.fields,\"draft.of\")) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.hop(tiddler.fields,\"draft.of\") && (tiddler.fields[\"draft.of\"].length !== 0)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\t\t\t\t\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/image.js": {
"title": "$:/core/modules/filters/is/image.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/image.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[image]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.image = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isImageTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/missing.js": {
"title": "$:/core/modules/filters/is/missing.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/missing.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[missing]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.missing = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/orphan.js": {
"title": "$:/core/modules/filters/is/orphan.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/orphan.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[orphan]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.orphan = function(source,prefix,options) {\n\tvar results = [],\n\t\torphanTitles = options.wiki.getOrphanTitles();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(orphanTitles.indexOf(title) !== -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/shadow.js": {
"title": "$:/core/modules/filters/is/shadow.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/shadow.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[shadow]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadow = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isShadowTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/system.js": {
"title": "$:/core/modules/filters/is/system.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/system.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[system]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.system = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.isSystemTiddler(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tag.js": {
"title": "$:/core/modules/filters/is/tag.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/tag.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tag]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,prefix,options) {\n\tvar results = [],\n\t\ttagMap = options.wiki.getTagMap();\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!$tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif($tw.utils.hop(tagMap,title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/tiddler.js": {
"title": "$:/core/modules/filters/is/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/tiddler.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[tiddler]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tiddler = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(options.wiki.tiddlerExists(title)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is/variable.js": {
"title": "$:/core/modules/filters/is/variable.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is/variable.js\ntype: application/javascript\nmodule-type: isfilteroperator\n\nFilter function for [is[variable]]\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variable = function(source,prefix,options) {\n\tvar results = [];\n\tif(prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!(title in options.widget.variables)) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title in options.widget.variables) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "isfilteroperator"
},
"$:/core/modules/filters/is.js": {
"title": "$:/core/modules/filters/is.js",
"text": "/*\\\ntitle: $:/core/modules/filters/is.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking tiddler properties\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar isFilterOperators;\n\nfunction getIsFilterOperators() {\n\tif(!isFilterOperators) {\n\t\tisFilterOperators = {};\n\t\t$tw.modules.applyMethods(\"isfilteroperator\",isFilterOperators);\n\t}\n\treturn isFilterOperators;\n}\n\n/*\nExport our filter function\n*/\nexports.is = function(source,operator,options) {\n\t// Dispatch to the correct isfilteroperator\n\tvar isFilterOperators = getIsFilterOperators();\n\tif(operator.operand) {\n\t\tvar isFilterOperator = isFilterOperators[operator.operand];\n\t\tif(isFilterOperator) {\n\t\t\treturn isFilterOperator(source,operator.prefix,options);\n\t\t} else {\n\t\t\treturn [$tw.language.getString(\"Error/IsFilterOperator\")];\n\t\t}\n\t} else {\n\t\t// Return all tiddlers if the operand is missing\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t}\n};\n\n})();",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/limit.js": {
"title": "$:/core/modules/filters/limit.js",
"text": "/*\\\ntitle: $:/core/modules/filters/limit.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for chopping the results to a specified maximum number of entries\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.limit = function(source,operator,options) {\n\tvar results = [];\n\t// Convert to an array\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Slice the array if necessary\n\tvar limit = Math.min(results.length,parseInt(operator.operand,10));\n\tif(operator.prefix === \"!\") {\n\t\tresults = results.slice(-limit);\n\t} else {\n\t\tresults = results.slice(0,limit);\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/links.js": {
"title": "$:/core/modules/filters/links.js",
"text": "/*\\\ntitle: $:/core/modules/filters/links.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning all the links from a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.links = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlerLinks(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/list.js": {
"title": "$:/core/modules/filters/list.js",
"text": "/*\\\ntitle: $:/core/modules/filters/list.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddlers whose title is listed in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.list = function(source,operator,options) {\n\tvar results = [],\n\t\ttr = $tw.utils.parseTextReference(operator.operand),\n\t\tcurrTiddlerTitle = options.widget && options.widget.getVariable(\"currentTiddler\"),\n\t\tlist = options.wiki.getTiddlerList(tr.title || currTiddlerTitle,tr.field,tr.index);\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults = list;\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listed.js": {
"title": "$:/core/modules/filters/listed.js",
"text": "/*\\\ntitle: $:/core/modules/filters/listed.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that have the selected tiddlers in a list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.listed = function(source,operator,options) {\n\tvar field = operator.operand || \"list\",\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.findListingsOfTiddler(title,field));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/listops.js": {
"title": "$:/core/modules/filters/listops.js",
"text": "/*\\\ntitle: $:/core/modules/filters/listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for manipulating the current selection list\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOrder a list\n*/\nexports.order = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.operand.toLowerCase() === \"reverse\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.unshift(title);\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nReverse list\n*/\nexports.reverse = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.unshift(title);\n\t});\n\treturn results;\n};\n\n/*\nFirst entry/entries in list\n*/\nexports.first = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,count);\n};\n\n/*\nLast entry/entries in list\n*/\nexports.last = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(-count);\n};\n\n/*\nAll but the first entry/entries of the list\n*/\nexports.rest = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count);\n};\nexports.butfirst = exports.rest;\nexports.bf = exports.rest;\n\n/*\nAll but the last entry/entries of the list\n*/\nexports.butlast = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(0,-count);\n};\nexports.bl = exports.butlast;\n\n/*\nThe nth member of the list\n*/\nexports.nth = function(source,operator,options) {\n\tvar count = $tw.utils.getInt(operator.operand,1),\n\t\tresults = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results.slice(count - 1,count);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/lookup.js": {
"title": "$:/core/modules/filters/lookup.js",
"text": "/*\\\ntitle: $:/core/modules/filters/lookup.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that looks up values via a title prefix\n\n[lookup:<field>[<prefix>]]\n\nPrepends the prefix to the selected items and returns the specified field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.lookup = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.getTiddlerText(operator.operand + title) || operator.suffix);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/match.js": {
"title": "$:/core/modules/filters/match.js",
"text": "/*\\\ntitle: $:/core/modules/filters/match.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title matches a string\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.match = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = (operator.suffixes || [])[0] || [];\n\tif(suffixes.indexOf(\"caseinsensitive\") !== -1) {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() !== (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title.toLowerCase() === (operator.operand || \"\").toLowerCase()) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t} else {\n\t\tif(operator.prefix === \"!\") {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title !== operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(title === operator.operand) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/math.js": {
"title": "$:/core/modules/filters/math.js",
"text": "/*\\\ntitle: $:/core/modules/filters/math.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for math. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\nNote that strings are converted to numbers automatically. Trailing non-digits are ignored.\n\n* \"\" converts to 0\n* \"12kk\" converts to 12\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.negate = makeNumericBinaryOperator(\n\tfunction(a) {return -a}\n);\n\nexports.abs = makeNumericBinaryOperator(\n\tfunction(a) {return Math.abs(a)}\n);\n\nexports.ceil = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(a)}\n);\n\nexports.floor = makeNumericBinaryOperator(\n\tfunction(a) {return Math.floor(a)}\n);\n\nexports.round = makeNumericBinaryOperator(\n\tfunction(a) {return Math.round(a)}\n);\n\nexports.trunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.trunc(a)}\n);\n\nexports.untrunc = makeNumericBinaryOperator(\n\tfunction(a) {return Math.ceil(Math.abs(a)) * Math.sign(a)}\n);\n\nexports.sign = makeNumericBinaryOperator(\n\tfunction(a) {return Math.sign(a)}\n);\n\nexports.add = makeNumericBinaryOperator(\n\tfunction(a,b) {return a + b;}\n);\n\nexports.subtract = makeNumericBinaryOperator(\n\tfunction(a,b) {return a - b;}\n);\n\nexports.multiply = makeNumericBinaryOperator(\n\tfunction(a,b) {return a * b;}\n);\n\nexports.divide = makeNumericBinaryOperator(\n\tfunction(a,b) {return a / b;}\n);\n\nexports.remainder = makeNumericBinaryOperator(\n\tfunction(a,b) {return a % b;}\n);\n\nexports.max = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.max(a,b);}\n);\n\nexports.min = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.min(a,b);}\n);\n\nexports.fixed = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toFixed.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.precision = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toPrecision.call(a,Math.min(Math.max(b,1),100));}\n);\n\nexports.exponential = makeNumericBinaryOperator(\n\tfunction(a,b) {return Number.prototype.toExponential.call(a,Math.min(Math.max(b,0),100));}\n);\n\nexports.power = makeNumericBinaryOperator(\n\tfunction(a,b) {return Math.pow(a,b);}\n);\n\nexports.log = makeNumericBinaryOperator(\n\tfunction(a,b) {\n\t\tif(b) {\n\t\t\treturn Math.log(a)/Math.log(b);\n\t\t} else {\n\t\t\treturn Math.log(a);\n\t\t}\n\t}\n);\n\nexports.sum = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator + value},\n\t0 // Initial value\n);\n\nexports.product = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return accumulator * value},\n\t1 // Initial value\n);\n\nexports.maxall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.max(accumulator,value)},\n\t-Infinity // Initial value\n);\n\nexports.minall = makeNumericReducingOperator(\n\tfunction(accumulator,value) {return Math.min(accumulator,value)},\n\tInfinity // Initial value\n);\n\nfunction makeNumericBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [],\n\t\t\tnumOperand = $tw.utils.parseNumber(operator.operand);\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push($tw.utils.stringifyNumber(fnCalc($tw.utils.parseNumber(title),numOperand)));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeNumericReducingOperator(fnCalc,initialValue) {\n\tinitialValue = initialValue || 0;\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\treturn [$tw.utils.stringifyNumber(result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,$tw.utils.parseNumber(currentValue));\n\t\t},initialValue))];\n\t};\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/minlength.js": {
"title": "$:/core/modules/filters/minlength.js",
"text": "/*\\\ntitle: $:/core/modules/filters/minlength.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for filtering out titles that don't meet the minimum length in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.minlength = function(source,operator,options) {\n\tvar results = [],\n\t\tminLength = parseInt(operator.operand || \"\",10) || 0;\n\tsource(function(tiddler,title) {\n\t\tif(title.length >= minLength) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/modules.js": {
"title": "$:/core/modules/filters/modules.js",
"text": "/*\\\ntitle: $:/core/modules/filters/modules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the modules of a given type in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.modules = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.each($tw.modules.types[title],function(moduleInfo,moduleName) {\n\t\t\tresults.push(moduleName);\n\t\t});\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/moduletypes.js": {
"title": "$:/core/modules/filters/moduletypes.js",
"text": "/*\\\ntitle: $:/core/modules/filters/moduletypes.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the module types in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.moduletypes = function(source,operator,options) {\n\tvar results = [];\n\t$tw.utils.each($tw.modules.types,function(moduleInfo,type) {\n\t\tresults.push(type);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/next.js": {
"title": "$:/core/modules/filters/next.js",
"text": "/*\\\ntitle: $:/core/modules/filters/next.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs next in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.next = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch++;\n\t\tif(match > 0 && match < list.length) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/plugintiddlers.js": {
"title": "$:/core/modules/filters/plugintiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/filters/plugintiddlers.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the titles of the shadow tiddlers within a plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.plugintiddlers = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar pluginInfo = options.wiki.getPluginInfo(title) || options.wiki.getTiddlerDataCached(title,{tiddlers:[]});\n\t\tif(pluginInfo && pluginInfo.tiddlers) {\n\t\t\t$tw.utils.each(pluginInfo.tiddlers,function(fields,title) {\n\t\t\t\tresults.push(title);\n\t\t\t});\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/prefix.js": {
"title": "$:/core/modules/filters/prefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/prefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title starts with a prefix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.prefix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/previous.js": {
"title": "$:/core/modules/filters/previous.js",
"text": "/*\\\ntitle: $:/core/modules/filters/previous.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning the tiddler whose title occurs immediately prior in the list supplied in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.previous = function(source,operator,options) {\n\tvar results = [],\n\t\tlist = options.wiki.getTiddlerList(operator.operand);\n\tsource(function(tiddler,title) {\n\t\tvar match = list.indexOf(title);\n\t\t// increment match and then test if result is in range\n\t\tmatch--;\n\t\tif(match >= 0) {\n\t\t\tresults.push(list[match]);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/range.js": {
"title": "$:/core/modules/filters/range.js",
"text": "/*\\\ntitle: $:/core/modules/filters/range.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for generating a numeric range.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.range = function(source,operator,options) {\n\tvar results = [];\n\t// Split the operand into numbers delimited by these symbols\n\tvar parts = operator.operand.split(/[,:;]/g),\n\t\tbeg, end, inc, i, fixed = 0;\n\tfor (i=0; i<parts.length; i++) {\n\t\t// Validate real number\n\t\tif(!/^\\s*[+-]?((\\d+(\\.\\d*)?)|(\\.\\d+))\\s*$/.test(parts[i])) {\n\t\t\treturn [\"range: bad number \\\"\" + parts[i] + \"\\\"\"];\n\t\t}\n\t\t// Count digits; the most precise number determines decimal places in output.\n\t\tvar frac = /\\.\\d+/.exec(parts[i]);\n\t\tif(frac) {\n\t\t\tfixed = Math.max(fixed,frac[0].length-1);\n\t\t}\n\t\tparts[i] = parseFloat(parts[i]);\n\t}\n\tswitch(parts.length) {\n\t\tcase 1:\n\t\t\tend = parts[0];\n\t\t\tif (end >= 1) {\n\t\t\t\tbeg = 1;\n\t\t\t}\n\t\t\telse if (end <= -1) {\n\t\t\t\tbeg = -1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn [];\n\t\t\t}\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = 1;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tbeg = parts[0];\n\t\t\tend = parts[1];\n\t\t\tinc = Math.abs(parts[2]);\n\t\t\tbreak;\n\t}\n\tif(inc === 0) {\n\t\treturn [\"range: increment 0 causes infinite loop\"];\n\t}\n\t// May need to count backwards\n\tvar direction = ((end < beg) ? -1 : 1);\n\tinc *= direction;\n\t// Estimate number of resulting elements\n\tif((end - beg) / inc > 10000) {\n\t\treturn [\"range: too many steps (over 10K)\"];\n\t}\n\t// Avoid rounding error on last step\n\tend += direction * 0.5 * Math.pow(0.1,fixed);\n\tvar safety = 10010;\n\t// Enumerate the range\n\tif (end<beg) {\n\t\tfor(i=beg; i>end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tfor(i=beg; i<end; i+=inc) {\n\t\t\tresults.push(i.toFixed(fixed));\n\t\t\tif(--safety<0) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif(safety<0) {\n\t\treturn [\"range: unexpectedly large output\"];\n\t}\n\t// Reverse?\n\tif(operator.prefix === \"!\") {\n\t\tresults.reverse();\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/reduce.js": {
"title": "$:/core/modules/filters/reduce.js",
"text": "/*\\\ntitle: $:/core/modules/filters/reduce.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator evaluates a subfilter for each item, making the running total available in the variable `accumulator`, and the current index available in the variable `index`\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.reduce = function(source,operator,options) {\n\t// Accumulate the list\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\t// Run the filter over each item\n\tvar filterFn = options.wiki.compileFilter(operator.operand),\n\t\taccumulator = operator.operands[1] || \"\";\n\tfor(var index=0; index<results.length; index++) {\n\t\tvar title = results[index],\n\t\t\tlist = filterFn.call(options.wiki,options.wiki.makeTiddlerIterator([title]),{\n\t\t\t\tgetVariable: function(name) {\n\t\t\t\t\tswitch(name) {\n\t\t\t\t\t\tcase \"currentTiddler\":\n\t\t\t\t\t\t\treturn \"\" + title;\n\t\t\t\t\t\tcase \"accumulator\":\n\t\t\t\t\t\t\treturn \"\" + accumulator;\n\t\t\t\t\t\tcase \"index\":\n\t\t\t\t\t\t\treturn \"\" + index;\n\t\t\t\t\t\tcase \"revIndex\":\n\t\t\t\t\t\t\treturn \"\" + (results.length - 1 - index);\n\t\t\t\t\t\tcase \"length\":\n\t\t\t\t\t\t\treturn \"\" + results.length;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\treturn options.widget.getVariable(name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\tif(list.length > 0) {\n\t\t\taccumulator = \"\" + list[0];\n\t\t}\n\t}\n\tif(results.length > 0) {\n\t\treturn [accumulator];\n\t} else {\n\t\treturn [];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/regexp.js": {
"title": "$:/core/modules/filters/regexp.js",
"text": "/*\\\ntitle: $:/core/modules/filters/regexp.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for regexp matching\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.regexp = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldname = (operator.suffix || \"title\").toLowerCase(),\n\t\tregexpString, regexp, flags = \"\", match,\n\t\tgetFieldString = function(tiddler,title) {\n\t\t\tif(tiddler) {\n\t\t\t\treturn tiddler.getFieldString(fieldname);\n\t\t\t} else if(fieldname === \"title\") {\n\t\t\t\treturn title;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t};\n\t// Process flags and construct regexp\n\tregexpString = operator.operand;\n\tmatch = /^\\(\\?([gim]+)\\)/.exec(regexpString);\n\tif(match) {\n\t\tflags = match[1];\n\t\tregexpString = regexpString.substr(match[0].length);\n\t} else {\n\t\tmatch = /\\(\\?([gim]+)\\)$/.exec(regexpString);\n\t\tif(match) {\n\t\t\tflags = match[1];\n\t\t\tregexpString = regexpString.substr(0,regexpString.length - match[0].length);\n\t\t}\n\t}\n\ttry {\n\t\tregexp = new RegExp(regexpString,flags);\n\t} catch(e) {\n\t\treturn [\"\" + e];\n\t}\n\t// Process the incoming tiddlers\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tvar text = getFieldString(tiddler,title);\n\t\t\tif(text !== null) {\n\t\t\t\tif(!!regexp.exec(text)) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removeprefix.js": {
"title": "$:/core/modules/filters/removeprefix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/removeprefix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a prefix from each title in the list. Titles that do not start with the prefix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removeprefix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title.substr(0,operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/removesuffix.js": {
"title": "$:/core/modules/filters/removesuffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/removesuffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for removing a suffix from each title in the list. Titles that do not end with the suffix are removed.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.removesuffix = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tif(title && title.substr(-operator.operand.length) === operator.operand) {\n\t\t\tresults.push(title.substr(0,title.length - operator.operand.length));\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sameday.js": {
"title": "$:/core/modules/filters/sameday.js",
"text": "/*\\\ntitle: $:/core/modules/filters/sameday.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that selects tiddlers with a modified date field on the same day as the provided value.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sameday = function(source,operator,options) {\n\tvar results = [],\n\t\tfieldName = operator.suffix || \"modified\",\n\t\ttargetDate = (new Date($tw.utils.parseDate(operator.operand))).setHours(0,0,0,0);\n\t// Function to convert a date/time to a date integer\n\tsource(function(tiddler,title) {\n\t\tif(tiddler) {\n\t\t\tif(tiddler.getFieldDay(fieldName) === targetDate) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/search.js": {
"title": "$:/core/modules/filters/search.js",
"text": "/*\\\ntitle: $:/core/modules/filters/search.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for searching for the text in the operand tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.search = function(source,operator,options) {\n\tvar invert = operator.prefix === \"!\";\n\tif(operator.suffixes) {\n\t\tvar hasFlag = function(flag) {\n\t\t\t\treturn (operator.suffixes[1] || []).indexOf(flag) !== -1;\n\t\t\t},\n\t\t\texcludeFields = false,\n\t\t\tfieldList = operator.suffixes[0] || [],\n\t\t\tfirstField = fieldList[0] || \"\", \n\t\t\tfirstChar = firstField.charAt(0),\n\t\t\tfields;\n\t\tif(firstChar === \"-\") {\n\t\t\tfields = [firstField.slice(1)].concat(fieldList.slice(1));\n\t\t\texcludeFields = true;\n\t\t} else if(fieldList[0] === \"*\"){\n\t\t\tfields = [];\n\t\t\texcludeFields = true;\n\t\t} else {\n\t\t\tfields = fieldList.slice(0);\n\t\t}\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert,\n\t\t\tfield: fields,\n\t\t\texcludeField: excludeFields,\n\t\t\tcaseSensitive: hasFlag(\"casesensitive\"),\n\t\t\tliteral: hasFlag(\"literal\"),\n\t\t\twhitespace: hasFlag(\"whitespace\"),\n\t\t\tanchored: hasFlag(\"anchored\"),\n\t\t\tregexp: hasFlag(\"regexp\"),\n\t\t\twords: hasFlag(\"words\")\n\t\t});\n\t} else {\n\t\treturn options.wiki.search(operator.operand,{\n\t\t\tsource: source,\n\t\t\tinvert: invert\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/shadowsource.js": {
"title": "$:/core/modules/filters/shadowsource.js",
"text": "/*\\\ntitle: $:/core/modules/filters/shadowsource.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the source plugins for shadow tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.shadowsource = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar source = options.wiki.getShadowSource(title);\n\t\tif(source) {\n\t\t\t$tw.utils.pushTop(results,source);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/slugify.js": {
"title": "$:/core/modules/filters/slugify.js",
"text": "/*\\\ntitle: $:/core/modules/filters/slugify.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for slugifying a tiddler title\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.slugify = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(options.wiki.slugify(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sort.js": {
"title": "$:/core/modules/filters/sort.js",
"text": "/*\\\ntitle: $:/core/modules/filters/sort.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,false);\n\treturn results;\n};\n\nexports.nsort = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",false,true);\n\treturn results;\n};\n\nexports.sortan = function(source, operator, options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results, operator.operand || \"title\", operator.prefix === \"!\",false,false,true);\n\treturn results;\n};\n\nexports.sortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,false);\n\treturn results;\n};\n\nexports.nsortcs = function(source,operator,options) {\n\tvar results = prepare_results(source);\n\toptions.wiki.sortTiddlers(results,operator.operand || \"title\",operator.prefix === \"!\",true,true);\n\treturn results;\n};\n\nvar prepare_results = function (source) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(title);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/sortsub.js": {
"title": "$:/core/modules/filters/sortsub.js",
"text": "/*\\\ntitle: $:/core/modules/filters/sortsub.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for sorting by a subfilter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.sortsub = function(source,operator,options) {\n\t// Compile the subfilter\n\tvar filterFn = options.wiki.compileFilter(operator.operand);\n\t// Collect the input titles and the corresponding sort keys\n\tvar inputTitles = [],\n\t\tsortKeys = [];\n\tsource(function(tiddler,title) {\n\t\tinputTitles.push(title);\n\t\tvar r = filterFn.call(options.wiki,function(iterator) {\n\t\t\titerator(options.wiki.getTiddler(title),title);\n\t\t},{\n\t\t\tgetVariable: function(name) {\n\t\t\t\tif(name === \"currentTiddler\") {\n\t\t\t\t\treturn title;\n\t\t\t\t} else {\n\t\t\t\t\treturn options.widget.getVariable(name);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tsortKeys.push(r[0] || \"\");\n\t});\n\t// Rather than sorting the titles array, we'll sort the indexes so that we can consult both arrays\n\tvar indexes = new Array(inputTitles.length);\n\tfor(var t=0; t<inputTitles.length; t++) {\n\t\tindexes[t] = t;\n\t}\n\t// Sort the indexes\n\tvar compareFn = $tw.utils.makeCompareFunction(operator.suffix,{defaultType: \"string\",invert: operator.prefix === \"!\"});\n\tindexes = indexes.sort(function(a,b) {\n\t\treturn compareFn(sortKeys[a],sortKeys[b]);\n\t});\n\t// Make the results array in order\n\tvar results = [];\n\t$tw.utils.each(indexes,function(index) {\n\t\tresults.push(inputTitles[index]);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/splitbefore.js": {
"title": "$:/core/modules/filters/splitbefore.js",
"text": "/*\\\ntitle: $:/core/modules/filters/splitbefore.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator that splits each result on the first occurance of the specified separator and returns the unique values.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.splitbefore = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar parts = title.split(operator.operand);\n\t\tif(parts.length === 1) {\n\t\t\t$tw.utils.pushTop(results,parts[0]);\n\t\t} else {\n\t\t\t$tw.utils.pushTop(results,parts[0] + operator.operand);\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/storyviews.js": {
"title": "$:/core/modules/filters/storyviews.js",
"text": "/*\\\ntitle: $:/core/modules/filters/storyviews.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the story views in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.storyviews = function(source,operator,options) {\n\tvar results = [],\n\t\tstoryviews = {};\n\t$tw.modules.applyMethods(\"storyview\",storyviews);\n\t$tw.utils.each(storyviews,function(info,name) {\n\t\tresults.push(name);\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/strings.js": {
"title": "$:/core/modules/filters/strings.js",
"text": "/*\\\ntitle: $:/core/modules/filters/strings.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operators for strings. Unary/binary operators work on each item in turn, and return a new item list.\n\nSum/product/maxall/minall operate on the entire list, returning a single item.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.length = makeStringBinaryOperator(\n\tfunction(a) {return [\"\" + (\"\" + a).length];}\n);\n\nexports.uppercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toUpperCase()];}\n);\n\nexports.lowercase = makeStringBinaryOperator(\n\tfunction(a) {return [(\"\" + a).toLowerCase()];}\n);\n\nexports.sentencecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toSentenceCase(a)];}\n);\n\nexports.titlecase = makeStringBinaryOperator(\n\tfunction(a) {return [$tw.utils.toTitleCase(a)];}\n);\n\nexports.trim = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\toperand = (operator.operand || \"\"),\n\t\tfnCalc;\n\tif(suffix === \"prefix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimPrefix(a,b)];}\n\t} else if(suffix === \"suffix\") {\n\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix(a,b)];}\n\t} else {\n\t\tif(operand === \"\") {\n\t\t\tfnCalc = function(a) {return [$tw.utils.trim(a)];}\n\t\t} else {\n\t\t\tfnCalc = function(a,b) {return [$tw.utils.trimSuffix($tw.utils.trimPrefix(a,b),b)];}\n\t\t}\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,fnCalc(title,operand));\n\t});\n\treturn result;\n};\n\nexports.split = makeStringBinaryOperator(\n\tfunction(a,b) {return (\"\" + a).split(b);}\n);\n\nexports[\"enlist-input\"] = makeStringBinaryOperator(\n\tfunction(a,o,s) {return $tw.utils.parseStringArray(\"\" + a,(s === \"raw\"));}\n);\n\nexports.join = makeStringReducingOperator(\n\tfunction(accumulator,value,operand) {\n\t\tif(accumulator === null) {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn accumulator + operand + value;\n\t\t}\n\t},null\n);\n\nfunction makeStringBinaryOperator(fnCalc) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tArray.prototype.push.apply(result,fnCalc(title,operator.operand || \"\",operator.suffix || \"\"));\n\t\t});\n\t\treturn result;\n\t};\n}\n\nfunction makeStringReducingOperator(fnCalc,initialValue) {\n\treturn function(source,operator,options) {\n\t\tvar result = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tresult.push(title);\n\t\t});\n\t\tif(result.length === 0) {\n\t\t\treturn [];\n\t\t}\n\t\treturn [result.reduce(function(accumulator,currentValue) {\n\t\t\treturn fnCalc(accumulator,currentValue,operator.operand || \"\");\n\t\t},initialValue) || \"\"];\n\t};\n}\n\nexports.splitregexp = function(source,operator,options) {\n\tvar result = [],\n\t\tsuffix = operator.suffix || \"\",\n\t\tflags = (suffix.indexOf(\"m\") !== -1 ? \"m\" : \"\") + (suffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tregExp;\n\ttry {\n\t\tregExp = new RegExp(operator.operand || \"\",flags);\t\t\n\t} catch(ex) {\n\t\treturn [\"RegExp error: \" + ex];\n\t}\n\tsource(function(tiddler,title) {\n\t\tArray.prototype.push.apply(result,title.split(regExp));\n\t});\t\t\n\treturn result;\n};\n\nexports[\"search-replace\"] = function(source,operator,options) {\n\tvar results = [],\n\t\tsuffixes = operator.suffixes || [],\n\t\tflagSuffix = (suffixes[0] ? (suffixes[0][0] || \"\") : \"\"),\n\t\tflags = (flagSuffix.indexOf(\"g\") !== -1 ? \"g\" : \"\") + (flagSuffix.indexOf(\"i\") !== -1 ? \"i\" : \"\"),\n\t\tisRegExp = (suffixes[1] && suffixes[1][0] === \"regexp\") ? true : false,\n\t\tsearchTerm,\n\t\tregExp;\n\t\n\tsource(function(tiddler,title) {\n\t\tif(title && (operator.operands.length > 1)) {\n\t\t\t//Escape regexp characters if the operand is not a regular expression\n\t\t\tsearchTerm = isRegExp ? operator.operand : $tw.utils.escapeRegExp(operator.operand);\n\t\t\ttry {\n\t\t\t\tregExp = new RegExp(searchTerm,flags);\n\t\t\t} catch(ex) {\n\t\t\t\treturn [\"RegExp error: \" + ex];\n\t\t\t}\n\t\t\tresults.push(\n\t\t\t\ttitle.replace(regExp,operator.operands[1])\n\t\t\t);\n\t\t} else {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\treturn results;\n};\n\nexports.pad = function(source,operator,options) {\n\tvar results = [],\n\t\ttargetLength = operator.operand ? parseInt(operator.operand) : 0,\n\t\tfill = operator.operands[1] || \"0\";\n\n\tsource(function(tiddler,title) {\n\t\tif(title && title.length) {\n\t\t\tif(title.length >= targetLength) {\n\t\t\t\tresults.push(title);\n\t\t\t} else {\n\t\t\t\tvar padString = \"\",\n\t\t\t\t\tpadStringLength = targetLength - title.length;\n\t\t\t\twhile (padStringLength > padString.length) {\n\t\t\t\t\tpadString += fill;\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t//make sure we do not exceed the specified length\n\t\t\t\tpadString = padString.slice(0,padStringLength);\n\t\t\t\tif(operator.suffix && (operator.suffix === \"suffix\")) {\n\t\t\t\t\ttitle = title + padString;\n\t\t\t\t} else {\n\t\t\t\t\ttitle = padString + title;\n\t\t\t\t}\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/subfilter.js": {
"title": "$:/core/modules/filters/subfilter.js",
"text": "/*\\\ntitle: $:/core/modules/filters/subfilter.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning its operand evaluated as a filter\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subfilter = function(source,operator,options) {\n\tvar list = options.wiki.filterTiddlers(operator.operand,options.widget,source);\n\tif(operator.prefix === \"!\") {\n\t\tvar results = [];\n\t\tsource(function(tiddler,title) {\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t\treturn results;\n\t} else {\n\t\treturn list;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/subtiddlerfields.js": {
"title": "$:/core/modules/filters/subtiddlerfields.js",
"text": "/*\\\ntitle: $:/core/modules/filters/subtiddlerfields.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the fields on the selected subtiddlers of the plugin named in the operand\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.subtiddlerfields = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tvar subtiddler = options.wiki.getSubTiddler(operator.operand,title);\n\t\tif(subtiddler) {\n\t\t\tfor(var fieldName in subtiddler.fields) {\n\t\t\t\t$tw.utils.pushTop(results,fieldName);\n\t\t\t}\n\t\t}\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/suffix.js": {
"title": "$:/core/modules/filters/suffix.js",
"text": "/*\\\ntitle: $:/core/modules/filters/suffix.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking if a title ends with a suffix\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.suffix = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(title.substr(-operator.operand.length) === operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tag.js": {
"title": "$:/core/modules/filters/tag.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tag.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for checking for the presence of a tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tag = function(source,operator,options) {\n\tvar results = [],indexedResults;\n\tif((operator.suffix || \"\").toLowerCase() === \"strict\" && !operator.operand) {\n\t\t// New semantics:\n\t\t// Always return copy of input if operator.operand is missing\n\t\tsource(function(tiddler,title) {\n\t\t\tresults.push(title);\n\t\t});\n\t} else {\n\t\t// Old semantics:\n\t\tvar tiddlers;\n\t\tif(operator.prefix === \"!\") {\n\t\t\t// Returns a copy of the input if operator.operand is missing\n\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\tsource(function(tiddler,title) {\n\t\t\t\tif(tiddlers.indexOf(title) === -1) {\n\t\t\t\t\tresults.push(title);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// Returns empty results if operator.operand is missing\n\t\t\tif(source.byTag) {\n\t\t\t\tindexedResults = source.byTag(operator.operand);\n\t\t\t\tif(indexedResults) {\n\t\t\t\t\treturn indexedResults;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttiddlers = options.wiki.getTiddlersWithTag(operator.operand);\n\t\t\t\tsource(function(tiddler,title) {\n\t\t\t\t\tif(tiddlers.indexOf(title) !== -1) {\n\t\t\t\t\t\tresults.push(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tresults = options.wiki.sortByList(results,operator.operand);\n\t\t\t}\n\t\t}\t\t\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tagging.js": {
"title": "$:/core/modules/filters/tagging.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tagging.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all tiddlers that are tagged with the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tagging = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\t$tw.utils.pushTop(results,options.wiki.getTiddlersWithTag(title));\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/tags.js": {
"title": "$:/core/modules/filters/tags.js",
"text": "/*\\\ntitle: $:/core/modules/filters/tags.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the tags of the selected tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.tags = function(source,operator,options) {\n\tvar tags = {};\n\tsource(function(tiddler,title) {\n\t\tvar t, length;\n\t\tif(tiddler && tiddler.fields.tags) {\n\t\t\tfor(t=0, length=tiddler.fields.tags.length; t<length; t++) {\n\t\t\t\ttags[tiddler.fields.tags[t]] = true;\n\t\t\t}\n\t\t}\n\t});\n\treturn Object.keys(tags);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/then.js": {
"title": "$:/core/modules/filters/then.js",
"text": "/*\\\ntitle: $:/core/modules/filters/then.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for replacing any titles with a constant\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.then = function(source,operator,options) {\n\tvar results = [];\n\tsource(function(tiddler,title) {\n\t\tresults.push(operator.operand);\n\t});\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/title.js": {
"title": "$:/core/modules/filters/title.js",
"text": "/*\\\ntitle: $:/core/modules/filters/title.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for comparing title fields for equality\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.title = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && tiddler.fields.title !== operator.operand) {\n\t\t\t\tresults.push(title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tresults.push(operator.operand);\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/untagged.js": {
"title": "$:/core/modules/filters/untagged.js",
"text": "/*\\\ntitle: $:/core/modules/filters/untagged.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator returning all the selected tiddlers that are untagged\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.untagged = function(source,operator,options) {\n\tvar results = [];\n\tif(operator.prefix === \"!\") {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(tiddler && $tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length > 0) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tsource(function(tiddler,title) {\n\t\t\tif(!tiddler || !tiddler.hasField(\"tags\") || ($tw.utils.isArray(tiddler.fields.tags) && tiddler.fields.tags.length === 0)) {\n\t\t\t\t$tw.utils.pushTop(results,title);\n\t\t\t}\n\t\t});\n\t}\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/variables.js": {
"title": "$:/core/modules/filters/variables.js",
"text": "/*\\\ntitle: $:/core/modules/filters/variables.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the active variables\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.variables = function(source,operator,options) {\n\tvar names = [];\n\tfor(var variable in options.widget.variables) {\n\t\tnames.push(variable);\n\t}\n\treturn names.sort();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/wikiparserrules.js": {
"title": "$:/core/modules/filters/wikiparserrules.js",
"text": "/*\\\ntitle: $:/core/modules/filters/wikiparserrules.js\ntype: application/javascript\nmodule-type: filteroperator\n\nFilter operator for returning the names of the wiki parser rules in this wiki\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nExport our filter function\n*/\nexports.wikiparserrules = function(source,operator,options) {\n\tvar results = [],\n\t\toperand = operator.operand;\n\t$tw.utils.each($tw.modules.types.wikirule,function(mod) {\n\t\tvar exp = mod.exports;\n\t\tif(!operand || exp.types[operand]) {\n\t\t\tresults.push(exp.name);\n\t\t}\n\t});\n\tresults.sort();\n\treturn results;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters/x-listops.js": {
"title": "$:/core/modules/filters/x-listops.js",
"text": "/*\\\ntitle: $:/core/modules/filters/x-listops.js\ntype: application/javascript\nmodule-type: filteroperator\n\nExtended filter operators to manipulate the current list.\n\n\\*/\n(function () {\n\n\t/*jslint node: true, browser: true */\n\t/*global $tw: false */\n\t\"use strict\";\n\n\t/*\n\tFetch titles from the current list\n\t*/\n\tvar prepare_results = function (source) {\n\tvar results = [];\n\t\tsource(function (tiddler, title) {\n\t\t\tresults.push(title);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list before the item named in the operand\n\t*/\n\texports.putbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list after the item named in the operand\n\t*/\n\texports.putafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -1) :\n\t\t\tresults.slice(0, index + 1).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tReplaces the item named in the operand with a number of items from the tail of the current list\n\t*/\n\texports.replace = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn (index === -1) ?\n\t\t\tresults.slice(0, -count) :\n\t\t\tresults.slice(0, index).concat(results.slice(-count)).concat(results.slice(index + 1, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the tail of the current list to the head of the list\n\t*/\n\texports.putfirst = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(-count).concat(results.slice(0, -count));\n\t};\n\n\t/*\n\tMoves a number of items from the head of the current list to the tail of the list\n\t*/\n\texports.putlast = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1);\n\t\treturn results.slice(count).concat(results.slice(0, count));\n\t};\n\n\t/*\n\tMoves the item named in the operand a number of places forward or backward in the list\n\t*/\n\texports.move = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,1),\n\t\t\tmarker = results.splice(index, 1),\n\t\t\toffset = (index + count) > 0 ? index + count : 0;\n\t\treturn results.slice(0, offset).concat(marker).concat(results.slice(offset));\n\t};\n\n\t/*\n\tReturns the items from the current list that are after the item named in the operand\n\t*/\n\texports.allafter = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(index) :\n\t\t\tresults.slice(index + 1);\n\t};\n\n\t/*\n\tReturns the items from the current list that are before the item named in the operand\n\t*/\n\texports.allbefore = function (source, operator) {\n\t\tvar results = prepare_results(source),\n\t\t\tindex = results.indexOf(operator.operand);\n\t\treturn (index === -1) ? [] :\n\t\t\t(operator.suffix) ? results.slice(0, index + 1) :\n\t\t\tresults.slice(0, index);\n\t};\n\n\t/*\n\tAppends the items listed in the operand array to the tail of the current list\n\t*/\n\texports.append = function (source, operator) {\n\t\tvar append = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || append.length;\n\t\treturn (append.length === 0) ? results :\n\t\t\t(operator.prefix) ? results.concat(append.slice(-count)) :\n\t\t\tresults.concat(append.slice(0, count));\n\t};\n\n\t/*\n\tPrepends the items listed in the operand array to the head of the current list\n\t*/\n\texports.prepend = function (source, operator) {\n\t\tvar prepend = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = $tw.utils.getInt(operator.suffix,prepend.length);\n\t\treturn (prepend.length === 0) ? results :\n\t\t\t(operator.prefix) ? prepend.slice(-count).concat(results) :\n\t\t\tprepend.slice(0, count).concat(results);\n\t};\n\n\t/*\n\tReturns all items from the current list except the items listed in the operand array\n\t*/\n\texports.remove = function (source, operator) {\n\t\tvar array = $tw.utils.parseStringArray(operator.operand, \"true\"),\n\t\t\tresults = prepare_results(source),\n\t\t\tcount = parseInt(operator.suffix) || array.length,\n\t\t\tp,\n\t\t\tlen,\n\t\t\tindex;\n\t\tlen = array.length - 1;\n\t\tfor (p = 0; p < count; ++p) {\n\t\t\tif (operator.prefix) {\n\t\t\t\tindex = results.indexOf(array[len - p]);\n\t\t\t} else {\n\t\t\t\tindex = results.indexOf(array[p]);\n\t\t\t}\n\t\t\tif (index !== -1) {\n\t\t\t\tresults.splice(index, 1);\n\t\t\t}\n\t\t}\n\t\treturn results;\n\t};\n\n\t/*\n\tReturns all items from the current list sorted in the order of the items in the operand array\n\t*/\n\texports.sortby = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tif (!results || results.length < 2) {\n\t\t\treturn results;\n\t\t}\n\t\tvar lookup = $tw.utils.parseStringArray(operator.operand, \"true\");\n\t\tresults.sort(function (a, b) {\n\t\t\treturn lookup.indexOf(a) - lookup.indexOf(b);\n\t\t});\n\t\treturn results;\n\t};\n\n\t/*\n\tRemoves all duplicate items from the current list\n\t*/\n\texports.unique = function (source, operator) {\n\t\tvar results = prepare_results(source);\n\t\tvar set = results.reduce(function (a, b) {\n\t\t\tif (a.indexOf(b) < 0) {\n\t\t\t\ta.push(b);\n\t\t\t}\n\t\t\treturn a;\n\t\t}, []);\n\t\treturn set;\n\t};\n\n\tvar cycleValueInArray = function(results,operands,stepSize) {\n\t\tvar resultsIndex,\n\t\t\tstep = stepSize || 1,\n\t\t\ti = 0,\n\t\t\topLength = operands.length,\n\t\t\tnextOperandIndex;\t\t\n\t\tfor(i; i < opLength; i++) {\n\t\t\tresultsIndex = results.indexOf(operands[i]);\n\t\t\tif(resultsIndex !== -1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif(resultsIndex !== -1) {\n\t\t\ti = i + step;\n\t\t\tnextOperandIndex = (i < opLength ? i : i - opLength);\n\t\t\tif(operands.length > 1) {\n\t\t\t\tresults.splice(resultsIndex,1,operands[nextOperandIndex]);\n\t\t\t} else {\n\t\t\t\tresults.splice(resultsIndex,1);\n\t\t\t}\n\t\t} else {\n\t\t\tresults.push(operands[0]);\n\t\t}\n\t\treturn results;\t\t\n\t}\n\n\t/*\n\tToggles an item in the current list.\n\t*/\t\n\texports.toggle = function(source,operator) {\n\t\treturn cycleValueInArray(prepare_results(source),operator.operands);\n\t}\n\n\texports.cycle = function(source,operator) {\n\t\tvar results = prepare_results(source),\n\t\t\toperands = (operator.operand.length ? $tw.utils.parseStringArray(operator.operand, \"true\") : [\"\"]),\n\t\t\tstep = $tw.utils.getInt(operator.operands[1]||\"\",1);\n\t\tif(step < 0) {\n\t\t\toperands.reverse();\n\t\t\tstep = Math.abs(step);\n\t\t}\t\n\t\treturn cycleValueInArray(results,operands,step);\n\t}\n\t\n})();\n",
"type": "application/javascript",
"module-type": "filteroperator"
},
"$:/core/modules/filters.js": {
"title": "$:/core/modules/filters.js",
"text": "/*\\\ntitle: $:/core/modules/filters.js\ntype: application/javascript\nmodule-type: wikimethod\n\nAdds tiddler filtering methods to the $tw.Wiki object.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParses an operation (i.e. a run) within a filter string\n\toperators: Array of array of operator nodes into which results should be inserted\n\tfilterString: filter string\n\tp: start position within the string\nReturns the new start position, after the parsed operation\n*/\nfunction parseFilterOperation(operators,filterString,p) {\n\tvar nextBracketPos, operator;\n\t// Skip the starting square bracket\n\tif(filterString.charAt(p++) !== \"[\") {\n\t\tthrow \"Missing [ in filter expression\";\n\t}\n\t// Process each operator in turn\n\tdo {\n\t\toperator = {};\n\t\t// Check for an operator prefix\n\t\tif(filterString.charAt(p) === \"!\") {\n\t\t\toperator.prefix = filterString.charAt(p++);\n\t\t}\n\t\t// Get the operator name\n\t\tnextBracketPos = filterString.substring(p).search(/[\\[\\{<\\/]/);\n\t\tif(nextBracketPos === -1) {\n\t\t\tthrow \"Missing [ in filter expression\";\n\t\t}\n\t\tnextBracketPos += p;\n\t\tvar bracket = filterString.charAt(nextBracketPos);\n\t\toperator.operator = filterString.substring(p,nextBracketPos);\n\t\t// Any suffix?\n\t\tvar colon = operator.operator.indexOf(':');\n\t\tif(colon > -1) {\n\t\t\t// The raw suffix for older filters\n\t\t\toperator.suffix = operator.operator.substring(colon + 1);\n\t\t\toperator.operator = operator.operator.substring(0,colon) || \"field\";\n\t\t\t// The processed suffix for newer filters\n\t\t\toperator.suffixes = [];\n\t\t\t$tw.utils.each(operator.suffix.split(\":\"),function(subsuffix) {\n\t\t\t\toperator.suffixes.push([]);\n\t\t\t\t$tw.utils.each(subsuffix.split(\",\"),function(entry) {\n\t\t\t\t\tentry = $tw.utils.trim(entry);\n\t\t\t\t\tif(entry) {\n\t\t\t\t\t\toperator.suffixes[operator.suffixes.length - 1].push(entry); \n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\t\t// Empty operator means: title\n\t\telse if(operator.operator === \"\") {\n\t\t\toperator.operator = \"title\";\n\t\t}\n\t\toperator.operands = [];\n\t\tfunction parseOperand(bracketType) {\n\t\t\tvar operand = {};\n\t\t\tswitch (bracketType) {\n\t\t\t\tcase \"{\": // Curly brackets\n\t\t\t\t\toperand.indirect = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"}\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"[\": // Square brackets\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\"]\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"<\": // Angle brackets\n\t\t\t\t\toperand.variable = true;\n\t\t\t\t\tnextBracketPos = filterString.indexOf(\">\",p);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"/\": // regexp brackets\n\t\t\t\t\tvar rex = /^((?:[^\\\\\\/]*|\\\\.)*)\\/(?:\\(([mygi]+)\\))?/g,\n\t\t\t\t\t\trexMatch = rex.exec(filterString.substring(p));\n\t\t\t\t\tif(rexMatch) {\n\t\t\t\t\t\toperator.regexp = new RegExp(rexMatch[1], rexMatch[2]);\n\t// DEPRECATION WARNING\n\tconsole.log(\"WARNING: Filter\",operator.operator,\"has a deprecated regexp operand\",operator.regexp);\n\t\t\t\t\t\tnextBracketPos = p + rex.lastIndex - 1;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthrow \"Unterminated regular expression in filter expression\";\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif(nextBracketPos === -1) {\n\t\t\t\tthrow \"Missing closing bracket in filter expression\";\n\t\t\t}\n\t\t\tif(!operator.regexp) {\n\t\t\t\toperand.text = filterString.substring(p,nextBracketPos);\n\t\t\t\toperator.operands.push(operand);\n\t\t\t}\n\t\t\tp = nextBracketPos + 1;\n\t\t}\n\t\t\n\t\tp = nextBracketPos + 1;\n\t\tparseOperand(bracket);\n\t\t\n\t\t// Check for multiple operands\n\t\twhile(filterString.charAt(p) === \",\") {\n\t\t\tp++;\n\t\t\tif(/^[\\[\\{<\\/]/.test(filterString.substring(p))) {\n\t\t\t\tnextBracketPos = p;\n\t\t\t\tp++;\n\t\t\t\tparseOperand(filterString.charAt(nextBracketPos));\n\t\t\t} else {\n\t\t\t\tthrow \"Missing [ in filter expression\";\n\t\t\t}\n\t\t}\n\t\t\n\t\t// Push this operator\n\t\toperators.push(operator);\n\t} while(filterString.charAt(p) !== \"]\");\n\t// Skip the ending square bracket\n\tif(filterString.charAt(p++) !== \"]\") {\n\t\tthrow \"Missing ] in filter expression\";\n\t}\n\t// Return the parsing position\n\treturn p;\n}\n\n/*\nParse a filter string\n*/\nexports.parseFilter = function(filterString) {\n\tfilterString = filterString || \"\";\n\tvar results = [], // Array of arrays of operator nodes {operator:,operand:}\n\t\tp = 0, // Current position in the filter string\n\t\tmatch;\n\tvar whitespaceRegExp = /(\\s+)/mg,\n\t\toperandRegExp = /((?:\\+|\\-|~|=|\\:(\\w+))?)(?:(\\[)|(?:\"([^\"]*)\")|(?:'([^']*)')|([^\\s\\[\\]]+))/mg;\n\twhile(p < filterString.length) {\n\t\t// Skip any whitespace\n\t\twhitespaceRegExp.lastIndex = p;\n\t\tmatch = whitespaceRegExp.exec(filterString);\n\t\tif(match && match.index === p) {\n\t\t\tp = p + match[0].length;\n\t\t}\n\t\t// Match the start of the operation\n\t\tif(p < filterString.length) {\n\t\t\toperandRegExp.lastIndex = p;\n\t\t\tmatch = operandRegExp.exec(filterString);\n\t\t\tif(!match || match.index !== p) {\n\t\t\t\tthrow $tw.language.getString(\"Error/FilterSyntax\");\n\t\t\t}\n\t\t\tvar operation = {\n\t\t\t\tprefix: \"\",\n\t\t\t\toperators: []\n\t\t\t};\n\t\t\tif(match[1]) {\n\t\t\t\toperation.prefix = match[1];\n\t\t\t\tp = p + operation.prefix.length;\n\t\t\t\tif(match[2]) {\n\t\t\t\t\toperation.namedPrefix = match[2];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(match[3]) { // Opening square bracket\n\t\t\t\tp = parseFilterOperation(operation.operators,filterString,p);\n\t\t\t} else {\n\t\t\t\tp = match.index + match[0].length;\n\t\t\t}\n\t\t\tif(match[4] || match[5] || match[6]) { // Double quoted string, single quoted string or unquoted title\n\t\t\t\toperation.operators.push(\n\t\t\t\t\t{operator: \"title\", operands: [{text: match[4] || match[5] || match[6]}]}\n\t\t\t\t);\n\t\t\t}\n\t\t\tresults.push(operation);\n\t\t}\n\t}\n\treturn results;\n};\n\nexports.getFilterOperators = function() {\n\tif(!this.filterOperators) {\n\t\t$tw.Wiki.prototype.filterOperators = {};\n\t\t$tw.modules.applyMethods(\"filteroperator\",this.filterOperators);\n\t}\n\treturn this.filterOperators;\n};\n\nexports.getFilterRunPrefixes = function() {\n\tif(!this.filterRunPrefixes) {\n\t\t$tw.Wiki.prototype.filterRunPrefixes = {};\n\t\t$tw.modules.applyMethods(\"filterrunprefix\",this.filterRunPrefixes);\n\t}\n\treturn this.filterRunPrefixes;\n}\n\nexports.filterTiddlers = function(filterString,widget,source) {\n\tvar fn = this.compileFilter(filterString);\n\treturn fn.call(this,source,widget);\n};\n\n/*\nCompile a filter into a function with the signature fn(source,widget) where:\nsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\nwidget: an optional widget node for retrieving the current tiddler etc.\n*/\nexports.compileFilter = function(filterString) {\n\tvar filterParseTree;\n\ttry {\n\t\tfilterParseTree = this.parseFilter(filterString);\n\t} catch(e) {\n\t\treturn function(source,widget) {\n\t\t\treturn [$tw.language.getString(\"Error/Filter\") + \": \" + e];\n\t\t};\n\t}\n\t// Get the hashmap of filter operator functions\n\tvar filterOperators = this.getFilterOperators();\n\t// Assemble array of functions, one for each operation\n\tvar operationFunctions = [];\n\t// Step through the operations\n\tvar self = this;\n\t$tw.utils.each(filterParseTree,function(operation) {\n\t\t// Create a function for the chain of operators in the operation\n\t\tvar operationSubFunction = function(source,widget) {\n\t\t\tvar accumulator = source,\n\t\t\t\tresults = [],\n\t\t\t\tcurrTiddlerTitle = widget && widget.getVariable(\"currentTiddler\");\n\t\t\t$tw.utils.each(operation.operators,function(operator) {\n\t\t\t\tvar operands = [],\n\t\t\t\t\toperatorFunction;\n\t\t\t\tif(!operator.operator) {\n\t\t\t\t\toperatorFunction = filterOperators.title;\n\t\t\t\t} else if(!filterOperators[operator.operator]) {\n\t\t\t\t\toperatorFunction = filterOperators.field;\n\t\t\t\t} else {\n\t\t\t\t\toperatorFunction = filterOperators[operator.operator];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t$tw.utils.each(operator.operands,function(operand) {\n\t\t\t\t\tif(operand.indirect) {\n\t\t\t\t\t\toperand.value = self.getTextReference(operand.text,\"\",currTiddlerTitle);\n\t\t\t\t\t} else if(operand.variable) {\n\t\t\t\t\t\toperand.value = widget.getVariable(operand.text,{defaultValue: \"\"});\n\t\t\t\t\t} else {\n\t\t\t\t\t\toperand.value = operand.text;\n\t\t\t\t\t}\n\t\t\t\t\toperands.push(operand.value);\n\t\t\t\t});\n\n\t\t\t\t// Invoke the appropriate filteroperator module\n\t\t\t\tresults = operatorFunction(accumulator,{\n\t\t\t\t\t\t\toperator: operator.operator,\n\t\t\t\t\t\t\toperand: operands.length > 0 ? operands[0] : undefined,\n\t\t\t\t\t\t\toperands: operands,\n\t\t\t\t\t\t\tprefix: operator.prefix,\n\t\t\t\t\t\t\tsuffix: operator.suffix,\n\t\t\t\t\t\t\tsuffixes: operator.suffixes,\n\t\t\t\t\t\t\tregexp: operator.regexp\n\t\t\t\t\t\t},{\n\t\t\t\t\t\t\twiki: self,\n\t\t\t\t\t\t\twidget: widget\n\t\t\t\t\t\t});\n\t\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\t\taccumulator = self.makeTiddlerIterator(results);\n\t\t\t\t} else {\n\t\t\t\t\taccumulator = results;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif($tw.utils.isArray(results)) {\n\t\t\t\treturn results;\n\t\t\t} else {\n\t\t\t\tvar resultArray = [];\n\t\t\t\tresults(function(tiddler,title) {\n\t\t\t\t\tresultArray.push(title);\n\t\t\t\t});\n\t\t\t\treturn resultArray;\n\t\t\t}\n\t\t};\n\t\tvar filterRunPrefixes = self.getFilterRunPrefixes();\n\t\t// Wrap the operator functions in a wrapper function that depends on the prefix\n\t\toperationFunctions.push((function() {\n\t\t\tvar options = {wiki: self};\n\t\t\tswitch(operation.prefix || \"\") {\n\t\t\t\tcase \"\": // No prefix means that the operation is unioned into the result\n\t\t\t\t\treturn filterRunPrefixes[\"or\"](operationSubFunction, options);\n\t\t\t\tcase \"=\": // The results of the operation are pushed into the result without deduplication\n\t\t\t\t\treturn filterRunPrefixes[\"all\"](operationSubFunction, options);\n\t\t\t\tcase \"-\": // The results of this operation are removed from the main result\n\t\t\t\t\treturn filterRunPrefixes[\"except\"](operationSubFunction, options);\n\t\t\t\tcase \"+\": // This operation is applied to the main results so far\n\t\t\t\t\treturn filterRunPrefixes[\"and\"](operationSubFunction, options);\n\t\t\t\tcase \"~\": // This operation is unioned into the result only if the main result so far is empty\n\t\t\t\t\treturn filterRunPrefixes[\"else\"](operationSubFunction, options);\n\t\t\t\tdefault: \n\t\t\t\t\tif(operation.namedPrefix && filterRunPrefixes[operation.namedPrefix]) {\n\t\t\t\t\t\treturn filterRunPrefixes[operation.namedPrefix](operationSubFunction, options);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn function(results,source,widget) {\n\t\t\t\t\t\t\tresults.clear();\n\t\t\t\t\t\t\tresults.push($tw.language.getString(\"Error/FilterRunPrefix\"));\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t}\n\t\t})());\n\t});\n\t// Return a function that applies the operations to a source iterator of tiddler titles\n\treturn $tw.perf.measure(\"filter: \" + filterString,function filterFunction(source,widget) {\n\t\tif(!source) {\n\t\t\tsource = self.each;\n\t\t} else if(typeof source === \"object\") { // Array or hashmap\n\t\t\tsource = self.makeTiddlerIterator(source);\n\t\t}\n\t\tvar results = new $tw.utils.LinkedList();\n\t\t$tw.utils.each(operationFunctions,function(operationFunction) {\n\t\t\toperationFunction(results,source,widget);\n\t\t});\n\t\treturn results.toArray();\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/core/modules/indexers/backlinks-indexer.js": {
"title": "$:/core/modules/indexers/backlinks-indexer.js",
"text": "/*\\\ntitle: $:/core/modules/indexers/backlinks-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers' backlinks\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\n\nfunction BacklinksIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nBacklinksIndexer.prototype.init = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype.rebuild = function() {\n\tthis.index = null;\n}\n\nBacklinksIndexer.prototype._getLinks = function(tiddler) {\n\tvar parser = this.wiki.parseText(tiddler.fields.type, tiddler.fields.text, {});\n\tif(parser) {\n\t\treturn this.wiki.extractLinks(parser.tree);\n\t}\n\treturn [];\n}\n\nBacklinksIndexer.prototype.update = function(updateDescriptor) {\n\tif(!this.index) {\n\t\treturn;\n\t}\n\tvar newLinks = [],\n\t oldLinks = [],\n\t self = this;\n\tif(updateDescriptor.old.exists) {\n\t\toldLinks = this._getLinks(updateDescriptor.old.tiddler);\n\t}\n\tif(updateDescriptor.new.exists) {\n\t\tnewLinks = this._getLinks(updateDescriptor.new.tiddler);\n\t}\n\n\t$tw.utils.each(oldLinks,function(link) {\n\t\tif(self.index[link]) {\n\t\t\tdelete self.index[link][updateDescriptor.old.tiddler.fields.title];\n\t\t}\n\t});\n\t$tw.utils.each(newLinks,function(link) {\n\t\tif(!self.index[link]) {\n\t\t\tself.index[link] = Object.create(null);\n\t\t}\n\t\tself.index[link][updateDescriptor.new.tiddler.fields.title] = true;\n\t});\n}\n\nBacklinksIndexer.prototype.lookup = function(title) {\n\tif(!this.index) {\n\t\tthis.index = Object.create(null);\n\t\tvar self = this;\n\t\tthis.wiki.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self._getLinks(tiddler);\n\t\t\t$tw.utils.each(links, function(link) {\n\t\t\t\tif(!self.index[link]) {\n\t\t\t\t\tself.index[link] = Object.create(null);\n\t\t\t\t}\n\t\t\t\tself.index[link][title] = true;\n\t\t\t});\n\t\t});\n\t}\n\tif(this.index[title]) {\n\t\treturn Object.keys(this.index[title]);\n\t} else {\n\t\treturn [];\n\t}\n}\n\nexports.BacklinksIndexer = BacklinksIndexer;\n\n})();\n",
"type": "application/javascript",
"module-type": "indexer"
},
"$:/core/modules/indexers/field-indexer.js": {
"title": "$:/core/modules/indexers/field-indexer.js",
"text": "/*\\\ntitle: $:/core/modules/indexers/field-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each field value\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nvar DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH = 128;\n\nfunction FieldIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nFieldIndexer.prototype.init = function() {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = DEFAULT_MAXIMUM_INDEXED_VALUE_LENGTH;\n\tthis.addIndexMethods();\n}\n\n// Provided for testing\nFieldIndexer.prototype.setMaxIndexedValueLength = function(length) {\n\tthis.index = null;\n\tthis.maxIndexedValueLength = length;\n};\n\nFieldIndexer.prototype.addIndexMethods = function() {\n\tvar self = this;\n\tthis.wiki.each.byField = function(name,value) {\n\t\tvar titles = self.wiki.allTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachShadow.byField = function(name,value) {\n\t\tvar titles = self.wiki.allShadowTitles(),\n\t\t\tlookup = self.lookup(name,value);\n\t\treturn lookup && lookup.filter(function(title) {\n\t\t\treturn titles.indexOf(title) !== -1;\n\t\t});\n\t};\n\tthis.wiki.eachTiddlerPlusShadows.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n\tthis.wiki.eachShadowPlusTiddlers.byField = function(name,value) {\n\t\tvar lookup = self.lookup(name,value);\n\t\treturn lookup ? lookup.slice(0) : null;\n\t};\n};\n\n/*\nTear down and then rebuild the index as if all tiddlers have changed\n*/\nFieldIndexer.prototype.rebuild = function() {\n\t// Invalidate the index so that it will be rebuilt when it is next used\n\tthis.index = null;\n};\n\n/*\nBuild the index for a particular field\n*/\nFieldIndexer.prototype.buildIndexForField = function(name) {\n\tvar self = this;\n\t// Hashmap by field name of hashmap by field value of array of tiddler titles\n\tthis.index = this.index || Object.create(null);\n\tthis.index[name] = Object.create(null);\n\tvar baseIndex = this.index[name];\n\t// Update the index for each tiddler\n\tthis.wiki.eachTiddlerPlusShadows(function(tiddler,title) {\n\t\tif(name in tiddler.fields) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\t// Skip any values above the maximum length\n\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\tbaseIndex[value] = baseIndex[value] || [];\n\t\t\t\tbaseIndex[value].push(title);\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nUpdate the index in the light of a tiddler value changing; note that the title must be identical. (Renames are handled as a separate delete and create)\nupdateDescriptor: {old: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>},new: {tiddler: <tiddler>, shadow: <boolean>, exists: <boolean>}}\n*/\nFieldIndexer.prototype.update = function(updateDescriptor) {\n\tvar self = this;\n\t// Don't do anything if the index hasn't been built yet\n\tif(this.index === null) {\n\t\treturn;\n\t}\n\t// Remove the old tiddler from the index\n\tif(updateDescriptor.old.tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor.old.tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor.old.tiddler.getFieldString(name),\n\t\t\t\t\ttiddlerList = indexEntry[value];\n\t\t\t\tif(tiddlerList) {\n\t\t\t\t\tvar index = tiddlerList.indexOf(updateDescriptor.old.tiddler.fields.title);\n\t\t\t\t\tif(index !== -1) {\n\t\t\t\t\t\ttiddlerList.splice(index,1);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\t// Add the new tiddler to the index\n\tif(updateDescriptor[\"new\"].tiddler) {\n\t\t$tw.utils.each(this.index,function(indexEntry,name) {\n\t\t\tif(name in updateDescriptor[\"new\"].tiddler.fields) {\n\t\t\t\tvar value = updateDescriptor[\"new\"].tiddler.getFieldString(name);\n\t\t\t\tif(value.length < self.maxIndexedValueLength) {\n\t\t\t\t\tindexEntry[value] = indexEntry[value] || [];\n\t\t\t\t\tindexEntry[value].push(updateDescriptor[\"new\"].tiddler.fields.title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n// Lookup the given field returning a list of tiddler titles\nFieldIndexer.prototype.lookup = function(name,value) {\n\t// Fail the lookup if the value is too long\n\tif(value.length >= this.maxIndexedValueLength) {\n\t\treturn null;\n\t}\n\t// Update the index if it has yet to be built\n\tif(this.index === null || !this.index[name]) {\n\t\tthis.buildIndexForField(name);\n\t}\n\treturn this.index[name][value] || [];\n};\n\nexports.FieldIndexer = FieldIndexer;\n\n})();\n",
"type": "application/javascript",
"module-type": "indexer"
},
"$:/core/modules/indexers/tag-indexer.js": {
"title": "$:/core/modules/indexers/tag-indexer.js",
"text": "/*\\\ntitle: $:/core/modules/indexers/tag-indexer.js\ntype: application/javascript\nmodule-type: indexer\n\nIndexes the tiddlers with each tag\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global modules: false */\n\"use strict\";\n\nfunction TagIndexer(wiki) {\n\tthis.wiki = wiki;\n}\n\nTagIndexer.prototype.init = function() {\n\tthis.subIndexers = [\n\t\tnew TagSubIndexer(this,\"each\"),\n\t\tnew TagSubIndexer(this,\"eachShadow\"),\n\t\tnew TagSubIndexer(this,\"eachTiddlerPlusShadows\"),\n\t\tnew TagSubIndexer(this,\"eachShadowPlusTiddlers\")\n\t];\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.addIndexMethod();\n\t});\n};\n\nTagIndexer.prototype.rebuild = function() {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.rebuild();\n\t});\n};\n\nTagIndexer.prototype.update = function(updateDescriptor) {\n\t$tw.utils.each(this.subIndexers,function(subIndexer) {\n\t\tsubIndexer.update(updateDescriptor);\n\t});\n};\n\nfunction TagSubIndexer(indexer,iteratorMethod) {\n\tthis.indexer = indexer;\n\tthis.iteratorMethod = iteratorMethod;\n\tthis.index = null; // Hashmap of tag title to {isSorted: bool, titles: [array]} or null if not yet initialised\n}\n\nTagSubIndexer.prototype.addIndexMethod = function() {\n\tvar self = this;\n\tthis.indexer.wiki[this.iteratorMethod].byTag = function(tag) {\n\t\treturn self.lookup(tag).slice(0);\n\t};\n};\n\nTagSubIndexer.prototype.rebuild = function() {\n\tvar self = this;\n\t// Hashmap by tag of array of {isSorted:, titles:[]}\n\tthis.index = Object.create(null);\n\t// Add all the tags\n\tthis.indexer.wiki[this.iteratorMethod](function(tiddler,title) {\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\tif(!self.index[tag]) {\n\t\t\t\tself.index[tag] = {isSorted: false, titles: [title]};\n\t\t\t} else {\n\t\t\t\tself.index[tag].titles.push(title);\n\t\t\t}\n\t\t});\t\t\n\t});\n};\n\nTagSubIndexer.prototype.update = function(updateDescriptor) {\n\tthis.index = null;\n};\n\nTagSubIndexer.prototype.lookup = function(tag) {\n\t// Update the index if it has yet to be built\n\tif(this.index === null) {\n\t\tthis.rebuild();\n\t}\n\tvar indexRecord = this.index[tag];\n\tif(indexRecord) {\n\t\tif(!indexRecord.isSorted) {\n\t\t\tif(this.indexer.wiki.sortByList) {\n\t\t\t\tindexRecord.titles = this.indexer.wiki.sortByList(indexRecord.titles,tag);\n\t\t\t}\t\t\t\n\t\t\tindexRecord.isSorted = true;\n\t\t}\n\t\treturn indexRecord.titles;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n\nexports.TagIndexer = TagIndexer;\n\n})();\n",
"type": "application/javascript",
"module-type": "indexer"
},
"$:/core/modules/info/platform.js": {
"title": "$:/core/modules/info/platform.js",
"text": "/*\\\ntitle: $:/core/modules/info/platform.js\ntype: application/javascript\nmodule-type: info\n\nInitialise basic platform $:/info/ tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.getInfoTiddlerFields = function(updateInfoTiddlersCallback) {\n\tvar mapBoolean = function(value) {return value ? \"yes\" : \"no\";},\n\t\tinfoTiddlerFields = [];\n\t// Basics\n\tinfoTiddlerFields.push({title: \"$:/info/browser\", text: mapBoolean(!!$tw.browser)});\n\tinfoTiddlerFields.push({title: \"$:/info/node\", text: mapBoolean(!!$tw.node)});\n\tinfoTiddlerFields.push({title: \"$:/info/startup-timestamp\", text: $tw.utils.stringifyDate(new Date())});\n\tif($tw.browser) {\n\t\t// Document location\n\t\tvar setLocationProperty = function(name,value) {\n\t\t\t\tinfoTiddlerFields.push({title: \"$:/info/url/\" + name, text: value});\t\t\t\n\t\t\t},\n\t\t\tlocation = document.location;\n\t\tsetLocationProperty(\"full\", (location.toString()).split(\"#\")[0]);\n\t\tsetLocationProperty(\"host\", location.host);\n\t\tsetLocationProperty(\"hostname\", location.hostname);\n\t\tsetLocationProperty(\"protocol\", location.protocol);\n\t\tsetLocationProperty(\"port\", location.port);\n\t\tsetLocationProperty(\"pathname\", location.pathname);\n\t\tsetLocationProperty(\"search\", location.search);\n\t\tsetLocationProperty(\"origin\", location.origin);\n\t\t// Screen size\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/width\", text: window.screen.width.toString()});\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/screen/height\", text: window.screen.height.toString()});\n \t\t// Dark mode through event listener on MediaQueryList\n \t\tvar mqList = window.matchMedia(\"(prefers-color-scheme: dark)\"),\n \t\t\tgetDarkModeTiddler = function() {return {title: \"$:/info/darkmode\", text: mqList.matches ? \"yes\" : \"no\"};};\n \t\tinfoTiddlerFields.push(getDarkModeTiddler());\n \t\tmqList.addListener(function(event) {\n \t\t\tupdateInfoTiddlersCallback([getDarkModeTiddler()]);\n \t\t});\n\t\t// Language\n\t\tinfoTiddlerFields.push({title: \"$:/info/browser/language\", text: navigator.language || \"\"});\n\t}\n\treturn infoTiddlerFields;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "info"
},
"$:/core/modules/keyboard.js": {
"title": "$:/core/modules/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/keyboard.js\ntype: application/javascript\nmodule-type: global\n\nKeyboard handling utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar namedKeys = {\n\t\"cancel\": 3,\n\t\"help\": 6,\n\t\"backspace\": 8,\n\t\"tab\": 9,\n\t\"clear\": 12,\n\t\"return\": 13,\n\t\"enter\": 13,\n\t\"pause\": 19,\n\t\"escape\": 27,\n\t\"space\": 32,\n\t\"page_up\": 33,\n\t\"page_down\": 34,\n\t\"end\": 35,\n\t\"home\": 36,\n\t\"left\": 37,\n\t\"up\": 38,\n\t\"right\": 39,\n\t\"down\": 40,\n\t\"printscreen\": 44,\n\t\"insert\": 45,\n\t\"delete\": 46,\n\t\"0\": 48,\n\t\"1\": 49,\n\t\"2\": 50,\n\t\"3\": 51,\n\t\"4\": 52,\n\t\"5\": 53,\n\t\"6\": 54,\n\t\"7\": 55,\n\t\"8\": 56,\n\t\"9\": 57,\n\t\"firefoxsemicolon\": 59,\n\t\"firefoxequals\": 61,\n\t\"a\": 65,\n\t\"b\": 66,\n\t\"c\": 67,\n\t\"d\": 68,\n\t\"e\": 69,\n\t\"f\": 70,\n\t\"g\": 71,\n\t\"h\": 72,\n\t\"i\": 73,\n\t\"j\": 74,\n\t\"k\": 75,\n\t\"l\": 76,\n\t\"m\": 77,\n\t\"n\": 78,\n\t\"o\": 79,\n\t\"p\": 80,\n\t\"q\": 81,\n\t\"r\": 82,\n\t\"s\": 83,\n\t\"t\": 84,\n\t\"u\": 85,\n\t\"v\": 86,\n\t\"w\": 87,\n\t\"x\": 88,\n\t\"y\": 89,\n\t\"z\": 90,\n\t\"numpad0\": 96,\n\t\"numpad1\": 97,\n\t\"numpad2\": 98,\n\t\"numpad3\": 99,\n\t\"numpad4\": 100,\n\t\"numpad5\": 101,\n\t\"numpad6\": 102,\n\t\"numpad7\": 103,\n\t\"numpad8\": 104,\n\t\"numpad9\": 105,\n\t\"multiply\": 106,\n\t\"add\": 107,\n\t\"separator\": 108,\n\t\"subtract\": 109,\n\t\"decimal\": 110,\n\t\"divide\": 111,\n\t\"f1\": 112,\n\t\"f2\": 113,\n\t\"f3\": 114,\n\t\"f4\": 115,\n\t\"f5\": 116,\n\t\"f6\": 117,\n\t\"f7\": 118,\n\t\"f8\": 119,\n\t\"f9\": 120,\n\t\"f10\": 121,\n\t\"f11\": 122,\n\t\"f12\": 123,\n\t\"f13\": 124,\n\t\"f14\": 125,\n\t\"f15\": 126,\n\t\"f16\": 127,\n\t\"f17\": 128,\n\t\"f18\": 129,\n\t\"f19\": 130,\n\t\"f20\": 131,\n\t\"f21\": 132,\n\t\"f22\": 133,\n\t\"f23\": 134,\n\t\"f24\": 135,\n\t\"firefoxminus\": 173,\n\t\"semicolon\": 186,\n\t\"equals\": 187,\n\t\"comma\": 188,\n\t\"dash\": 189,\n\t\"period\": 190,\n\t\"slash\": 191,\n\t\"backquote\": 192,\n\t\"openbracket\": 219,\n\t\"backslash\": 220,\n\t\"closebracket\": 221,\n\t\"quote\": 222\n};\n\nfunction KeyboardManager(options) {\n\tvar self = this;\n\toptions = options || \"\";\n\t// Save the named key hashmap\n\tthis.namedKeys = namedKeys;\n\t// Create a reverse mapping of code to keyname\n\tthis.keyNames = [];\n\t$tw.utils.each(namedKeys,function(keyCode,name) {\n\t\tself.keyNames[keyCode] = name.substr(0,1).toUpperCase() + name.substr(1);\n\t});\n\t// Save the platform-specific name of the \"meta\" key\n\tthis.metaKeyName = $tw.platform.isMac ? \"cmd-\" : \"win-\";\n\tthis.shortcutKeysList = [], // Stores the shortcut-key descriptors\n\tthis.shortcutActionList = [], // Stores the corresponding action strings\n\tthis.shortcutParsedList = []; // Stores the parsed key descriptors\n\tthis.lookupNames = [\"shortcuts\"];\n\tthis.lookupNames.push($tw.platform.isMac ? \"shortcuts-mac\" : \"shortcuts-not-mac\")\n\tthis.lookupNames.push($tw.platform.isWindows ? \"shortcuts-windows\" : \"shortcuts-not-windows\");\n\tthis.lookupNames.push($tw.platform.isLinux ? \"shortcuts-linux\" : \"shortcuts-not-linux\");\n\tthis.updateShortcutLists(this.getShortcutTiddlerList());\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tself.handleShortcutChanges(changes);\n\t});\n}\n\n/*\nReturn an array of keycodes for the modifier keys ctrl, shift, alt, meta\n*/\nKeyboardManager.prototype.getModifierKeys = function() {\n\treturn [\n\t\t16, // Shift\n\t\t17, // Ctrl\n\t\t18, // Alt\n\t\t20, // CAPS LOCK\n\t\t91, // Meta (left)\n\t\t93, // Meta (right)\n\t\t224 // Meta (Firefox)\n\t]\n};\n\n/*\nParses a key descriptor into the structure:\n{\n\tkeyCode: numeric keycode\n\tshiftKey: boolean\n\taltKey: boolean\n\tctrlKey: boolean\n\tmetaKey: boolean\n}\nKey descriptors have the following format:\n\tctrl+enter\n\tctrl+shift+alt+A\n*/\nKeyboardManager.prototype.parseKeyDescriptor = function(keyDescriptor) {\n\tvar components = keyDescriptor.split(/\\+|\\-/),\n\t\tinfo = {\n\t\t\tkeyCode: 0,\n\t\t\tshiftKey: false,\n\t\t\taltKey: false,\n\t\t\tctrlKey: false,\n\t\t\tmetaKey: false\n\t\t};\n\tfor(var t=0; t<components.length; t++) {\n\t\tvar s = components[t].toLowerCase(),\n\t\t\tc = s.charCodeAt(0);\n\t\t// Look for modifier keys\n\t\tif(s === \"ctrl\") {\n\t\t\tinfo.ctrlKey = true;\n\t\t} else if(s === \"shift\") {\n\t\t\tinfo.shiftKey = true;\n\t\t} else if(s === \"alt\") {\n\t\t\tinfo.altKey = true;\n\t\t} else if(s === \"meta\" || s === \"cmd\" || s === \"win\") {\n\t\t\tinfo.metaKey = true;\n\t\t}\n\t\t// Replace named keys with their code\n\t\tif(this.namedKeys[s]) {\n\t\t\tinfo.keyCode = this.namedKeys[s];\n\t\t}\n\t}\n\tif(info.keyCode) {\n\t\treturn info;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nParse a list of key descriptors into an array of keyInfo objects. The key descriptors can be passed as an array of strings or a space separated string\n*/\nKeyboardManager.prototype.parseKeyDescriptors = function(keyDescriptors,options) {\n\tvar self = this;\n\toptions = options || {};\n\toptions.stack = options.stack || [];\n\tvar wiki = options.wiki || $tw.wiki;\n\tif(typeof keyDescriptors === \"string\" && keyDescriptors === \"\") {\n\t\treturn [];\n\t}\n\tif(!$tw.utils.isArray(keyDescriptors)) {\n\t\tkeyDescriptors = keyDescriptors.split(\" \");\n\t}\n\tvar result = [];\n\t$tw.utils.each(keyDescriptors,function(keyDescriptor) {\n\t\t// Look for a named shortcut\n\t\tif(keyDescriptor.substr(0,2) === \"((\" && keyDescriptor.substr(-2,2) === \"))\") {\n\t\t\tif(options.stack.indexOf(keyDescriptor) === -1) {\n\t\t\t\toptions.stack.push(keyDescriptor);\n\t\t\t\tvar name = keyDescriptor.substring(2,keyDescriptor.length - 2),\n\t\t\t\t\tlookupName = function(configName) {\n\t\t\t\t\t\tvar keyDescriptors = wiki.getTiddlerText(\"$:/config/\" + configName + \"/\" + name);\n\t\t\t\t\t\tif(keyDescriptors) {\n\t\t\t\t\t\t\tresult.push.apply(result,self.parseKeyDescriptors(keyDescriptors,options));\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t$tw.utils.each(self.lookupNames,function(platformDescriptor) {\n\t\t\t\t\tlookupName(platformDescriptor);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tresult.push(self.parseKeyDescriptor(keyDescriptor));\n\t\t}\n\t});\n\treturn result;\n};\n\nKeyboardManager.prototype.getPrintableShortcuts = function(keyInfoArray) {\n\tvar self = this,\n\t\tresult = [];\n\t$tw.utils.each(keyInfoArray,function(keyInfo) {\n\t\tif(keyInfo) {\n\t\t\tresult.push((keyInfo.ctrlKey ? \"ctrl-\" : \"\") + \n\t\t\t\t (keyInfo.shiftKey ? \"shift-\" : \"\") + \n\t\t\t\t (keyInfo.altKey ? \"alt-\" : \"\") + \n\t\t\t\t (keyInfo.metaKey ? self.metaKeyName : \"\") + \n\t\t\t\t (self.keyNames[keyInfo.keyCode]));\n\t\t}\n\t});\n\treturn result;\n}\n\nKeyboardManager.prototype.checkKeyDescriptor = function(event,keyInfo) {\n\treturn keyInfo &&\n\t\t\tevent.keyCode === keyInfo.keyCode && \n\t\t\tevent.shiftKey === keyInfo.shiftKey && \n\t\t\tevent.altKey === keyInfo.altKey && \n\t\t\tevent.ctrlKey === keyInfo.ctrlKey && \n\t\t\tevent.metaKey === keyInfo.metaKey;\n};\n\nKeyboardManager.prototype.checkKeyDescriptors = function(event,keyInfoArray) {\n\tfor(var t=0; t<keyInfoArray.length; t++) {\n\t\tif(this.checkKeyDescriptor(event,keyInfoArray[t])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.getEventModifierKeyDescriptor = function(event) {\n\treturn event.ctrlKey && !event.shiftKey && !event.altKey && !event.metaKey ? \"ctrl\" : \n\t\tevent.shiftKey && !event.ctrlKey && !event.altKey && !event.metaKey ? \"shift\" : \n\t\tevent.ctrlKey && event.shiftKey && !event.altKey && !event.metaKey ? \"ctrl-shift\" : \n\t\tevent.altKey && !event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt\" : \n\t\tevent.altKey && event.shiftKey && !event.ctrlKey && !event.metaKey ? \"alt-shift\" : \n\t\tevent.altKey && event.ctrlKey && !event.shiftKey && !event.metaKey ? \"ctrl-alt\" : \n\t\tevent.altKey && event.shiftKey && event.ctrlKey && !event.metaKey ? \"ctrl-alt-shift\" : \n\t\tevent.metaKey && !event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta\" : \n\t\tevent.metaKey && event.ctrlKey && !event.shiftKey && !event.altKey ? \"meta-ctrl\" :\n\t\tevent.metaKey && event.ctrlKey && event.shiftKey && !event.altKey ? \"meta-ctrl-shift\" :\n\t\tevent.metaKey && event.ctrlKey & event.shiftKey && event.altKey ? \"meta-ctrl-alt-shift\" : \"normal\";\n};\n\nKeyboardManager.prototype.getShortcutTiddlerList = function() {\n\treturn $tw.wiki.getTiddlersWithTag(\"$:/tags/KeyboardShortcut\");\n};\n\nKeyboardManager.prototype.updateShortcutLists = function(tiddlerList) {\n\tthis.shortcutTiddlers = tiddlerList;\n\tfor(var i=0; i<tiddlerList.length; i++) {\n\t\tvar title = tiddlerList[i],\n\t\t\ttiddlerFields = $tw.wiki.getTiddler(title).fields;\n\t\tthis.shortcutKeysList[i] = tiddlerFields.key !== undefined ? tiddlerFields.key : undefined;\n\t\tthis.shortcutActionList[i] = tiddlerFields.text;\n\t\tthis.shortcutParsedList[i] = this.shortcutKeysList[i] !== undefined ? this.parseKeyDescriptors(this.shortcutKeysList[i]) : undefined;\n\t}\n};\n\nKeyboardManager.prototype.handleKeydownEvent = function(event) {\n\tvar key, action;\n\tfor(var i=0; i<this.shortcutTiddlers.length; i++) {\n\t\tif(this.shortcutParsedList[i] !== undefined && this.checkKeyDescriptors(event,this.shortcutParsedList[i])) {\n\t\t\tkey = this.shortcutParsedList[i];\n\t\t\taction = this.shortcutActionList[i];\n\t\t}\n\t}\n\tif(key !== undefined) {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\t$tw.rootWidget.invokeActionString(action,$tw.rootWidget);\n\t\treturn true;\n\t}\n\treturn false;\n};\n\nKeyboardManager.prototype.detectNewShortcuts = function(changedTiddlers) {\n\tvar shortcutConfigTiddlers = [],\n\t\thandled = false;\n\t$tw.utils.each(this.lookupNames,function(platformDescriptor) {\n\t\tvar descriptorString = \"$:/config/\" + platformDescriptor + \"/\";\n\t\tObject.keys(changedTiddlers).forEach(function(configTiddler) {\n\t\t\tvar configString = configTiddler.substr(0, configTiddler.lastIndexOf(\"/\") + 1);\n\t\t\tif(configString === descriptorString) {\n\t\t\t\tshortcutConfigTiddlers.push(configTiddler);\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t});\n\t});\n\tif(handled) {\n\t\treturn $tw.utils.hopArray(changedTiddlers,shortcutConfigTiddlers);\n\t} else {\n\t\treturn false;\n\t}\n};\n\nKeyboardManager.prototype.handleShortcutChanges = function(changedTiddlers) {\n\tvar newList = this.getShortcutTiddlerList();\n\tvar hasChanged = $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers) ? true :\n\t\t($tw.utils.hopArray(changedTiddlers,newList) ? true :\n\t\t(this.detectNewShortcuts(changedTiddlers))\n\t);\n\t// Re-cache shortcuts if something changed\n\tif(hasChanged) {\n\t\tthis.updateShortcutLists(newList);\n\t}\n};\n\nexports.KeyboardManager = KeyboardManager;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/language.js": {
"title": "$:/core/modules/language.js",
"text": "/*\\\ntitle: $:/core/modules/language.js\ntype: application/javascript\nmodule-type: global\n\nThe $tw.Language() manages translateable strings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate an instance of the language manager. Options include:\nwiki: wiki from which to retrieve translation tiddlers\n*/\nfunction Language(options) {\n\toptions = options || \"\";\n\tthis.wiki = options.wiki || $tw.wiki;\n}\n\n/*\nReturn a wikified translateable string. The title is automatically prefixed with \"$:/language/\"\nOptions include:\nvariables: optional hashmap of variables to supply to the language wikification\n*/\nLanguage.prototype.getString = function(title,options) {\n\toptions = options || {};\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.renderTiddler(\"text/plain\",title,{variables: options.variables});\n};\n\n/*\nReturn a raw, unwikified translateable string. The title is automatically prefixed with \"$:/language/\"\n*/\nLanguage.prototype.getRawString = function(title) {\n\ttitle = \"$:/language/\" + title;\n\treturn this.wiki.getTiddlerText(title);\n};\n\nexports.Language = Language;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/macros/changecount.js": {
"title": "$:/core/modules/macros/changecount.js",
"text": "/*\\\ntitle: $:/core/modules/macros/changecount.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the changecount for the current tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"changecount\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn this.wiki.getChangeCount(this.getVariable(\"currentTiddler\")) + \"\";\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/contrastcolour.js": {
"title": "$:/core/modules/macros/contrastcolour.js",
"text": "/*\\\ntitle: $:/core/modules/macros/contrastcolour.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to choose which of two colours has the highest contrast with a base colour\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"contrastcolour\";\n\nexports.params = [\n\t{name: \"target\"},\n\t{name: \"fallbackTarget\"},\n\t{name: \"colourA\"},\n\t{name: \"colourB\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(target,fallbackTarget,colourA,colourB) {\n\tvar rgbTarget = $tw.utils.parseCSSColor(target) || $tw.utils.parseCSSColor(fallbackTarget);\n\tif(!rgbTarget) {\n\t\treturn colourA;\n\t}\n\tvar rgbColourA = $tw.utils.parseCSSColor(colourA),\n\t\trgbColourB = $tw.utils.parseCSSColor(colourB);\n\tif(rgbColourA && !rgbColourB) {\n\t\treturn rgbColourA;\n\t}\n\tif(rgbColourB && !rgbColourA) {\n\t\treturn rgbColourB;\n\t}\n\tif(!rgbColourA && !rgbColourB) {\n\t\t// If neither colour is readable, return a crude inverse of the target\n\t\treturn [255 - rgbTarget[0],255 - rgbTarget[1],255 - rgbTarget[2],rgbTarget[3]];\n\t}\n\t// Colour brightness formula derived from http://www.w3.org/WAI/ER/WD-AERT/#color-contrast\n\tvar brightnessTarget = rgbTarget[0] * 0.299 + rgbTarget[1] * 0.587 + rgbTarget[2] * 0.114,\n\t\tbrightnessA = rgbColourA[0] * 0.299 + rgbColourA[1] * 0.587 + rgbColourA[2] * 0.114,\n\t\tbrightnessB = rgbColourB[0] * 0.299 + rgbColourB[1] * 0.587 + rgbColourB[2] * 0.114;\n\treturn Math.abs(brightnessTarget - brightnessA) > Math.abs(brightnessTarget - brightnessB) ? colourA : colourB;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/csvtiddlers.js": {
"title": "$:/core/modules/macros/csvtiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/macros/csvtiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to CSV\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"csvtiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"format\"},\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,format) {\n\tvar self = this,\n\t\ttiddlers = this.wiki.filterTiddlers(filter),\n\t\ttiddler,\n\t\tfields = [],\n\t\tt,f;\n\t// Collect all the fields\n\tfor(t=0;t<tiddlers.length; t++) {\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\tfor(f in tiddler.fields) {\n\t\t\tif(fields.indexOf(f) === -1) {\n\t\t\t\tfields.push(f);\n\t\t\t}\n\t\t}\n\t}\n\t// Sort the fields and bring the standard ones to the front\n\tfields.sort();\n\t\"title text modified modifier created creator\".split(\" \").reverse().forEach(function(value,index) {\n\t\tvar p = fields.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tfields.splice(p,1);\n\t\t\tfields.unshift(value)\n\t\t}\n\t});\n\t// Output the column headings\n\tvar output = [], row = [];\n\tfields.forEach(function(value) {\n\t\trow.push(quoteAndEscape(value))\n\t});\n\toutput.push(row.join(\",\"));\n\t// Output each tiddler\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\trow = [];\n\t\ttiddler = this.wiki.getTiddler(tiddlers[t]);\n\t\t\tfor(f=0; f<fields.length; f++) {\n\t\t\t\trow.push(quoteAndEscape(tiddler ? tiddler.getFieldString(fields[f]) || \"\" : \"\"));\n\t\t\t}\n\t\toutput.push(row.join(\",\"));\n\t}\n\treturn output.join(\"\\n\");\n};\n\nfunction quoteAndEscape(value) {\n\treturn \"\\\"\" + value.replace(/\"/mg,\"\\\"\\\"\") + \"\\\"\";\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/displayshortcuts.js": {
"title": "$:/core/modules/macros/displayshortcuts.js",
"text": "/*\\\ntitle: $:/core/modules/macros/displayshortcuts.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to display a list of keyboard shortcuts in human readable form. Notably, it resolves named shortcuts like `((bold))` to the underlying keystrokes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"displayshortcuts\";\n\nexports.params = [\n\t{name: \"shortcuts\"},\n\t{name: \"prefix\"},\n\t{name: \"separator\"},\n\t{name: \"suffix\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(shortcuts,prefix,separator,suffix) {\n\tvar shortcutArray = $tw.keyboardManager.getPrintableShortcuts($tw.keyboardManager.parseKeyDescriptors(shortcuts,{\n\t\twiki: this.wiki\n\t}));\n\tif(shortcutArray.length > 0) {\n\t\tshortcutArray.sort(function(a,b) {\n\t\t return a.toLowerCase().localeCompare(b.toLowerCase());\n\t\t})\n\t\treturn prefix + shortcutArray.join(separator) + suffix;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/jsontiddler.js": {
"title": "$:/core/modules/macros/jsontiddler.js",
"text": "/*\\\ntitle: $:/core/modules/macros/jsontiddler.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output a single tiddler to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddler\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\ttitle = title || this.getVariable(\"currentTiddler\");\n\tvar tiddler = !!title && this.wiki.getTiddler(title),\n\t\tfields = new Object();\n\tif(tiddler) {\n\t\tfor(var field in tiddler.fields) {\n\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t}\n\t}\n\treturn JSON.stringify(fields,null,$tw.config.preferences.jsonSpaces);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/jsontiddlers.js": {
"title": "$:/core/modules/macros/jsontiddlers.js",
"text": "/*\\\ntitle: $:/core/modules/macros/jsontiddlers.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to output tiddlers matching a filter to JSON\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"jsontiddlers\";\n\nexports.params = [\n\t{name: \"filter\"},\n\t{name: \"spaces\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(filter,spaces) {\n\treturn this.wiki.getTiddlersAsJson(filter,$tw.utils.parseInt(spaces));\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/makedatauri.js": {
"title": "$:/core/modules/macros/makedatauri.js",
"text": "/*\\\ntitle: $:/core/modules/macros/makedatauri.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to convert a string of text to a data URI\n\n<<makedatauri text:\"Text to be converted\" type:\"text/vnd.tiddlywiki\">>\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"makedatauri\";\n\nexports.params = [\n\t{name: \"text\"},\n\t{name: \"type\"},\n\t{name: \"_canonical_uri\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(text,type,_canonical_uri) {\n\treturn $tw.utils.makeDataUri(text,type,_canonical_uri);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/now.js": {
"title": "$:/core/modules/macros/now.js",
"text": "/*\\\ntitle: $:/core/modules/macros/now.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return a formatted version of the current time\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"now\";\n\nexports.params = [\n\t{name: \"format\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(format) {\n\treturn $tw.utils.formatDateString(new Date(),format || \"0hh:0mm, DDth MMM YYYY\");\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/qualify.js": {
"title": "$:/core/modules/macros/qualify.js",
"text": "/*\\\ntitle: $:/core/modules/macros/qualify.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to qualify a state tiddler title according\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"qualify\";\n\nexports.params = [\n\t{name: \"title\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(title) {\n\treturn title + \"-\" + this.getStateQualifier();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/resolvepath.js": {
"title": "$:/core/modules/macros/resolvepath.js",
"text": "/*\\\ntitle: $:/core/modules/macros/resolvepath.js\ntype: application/javascript\nmodule-type: macro\n\nResolves a relative path for an absolute rootpath.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"resolvepath\";\n\nexports.params = [\n\t{name: \"source\"},\n\t{name: \"root\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(source, root) {\n\treturn $tw.utils.resolvePath(source, root);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/unusedtitle.js": {
"title": "$:/core/modules/macros/unusedtitle.js",
"text": "/*\\\ntitle: $:/core/modules/macros/unusedtitle.js\ntype: application/javascript\nmodule-type: macro\nMacro to return a new title that is unused in the wiki. It can be given a name as a base.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"unusedtitle\";\n\nexports.params = [\n\t{name: \"baseName\"},\n\t{name: \"options\"}\n];\n\n/*\nRun the macro\n*/\nexports.run = function(baseName, options) {\n\tif(!baseName) {\n\t\tbaseName = $tw.language.getString(\"DefaultNewTiddlerTitle\");\n\t}\n\treturn this.wiki.generateNewTitle(baseName, options);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/macros/version.js": {
"title": "$:/core/modules/macros/version.js",
"text": "/*\\\ntitle: $:/core/modules/macros/version.js\ntype: application/javascript\nmodule-type: macro\n\nMacro to return the TiddlyWiki core version number\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInformation about this macro\n*/\n\nexports.name = \"version\";\n\nexports.params = [];\n\n/*\nRun the macro\n*/\nexports.run = function() {\n\treturn $tw.version;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "macro"
},
"$:/core/modules/parsers/audioparser.js": {
"title": "$:/core/modules/parsers/audioparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/audioparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe audio parser parses an audio tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar AudioParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"audio\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"audio/ogg\"] = AudioParser;\nexports[\"audio/mpeg\"] = AudioParser;\nexports[\"audio/mp3\"] = AudioParser;\nexports[\"audio/mp4\"] = AudioParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/binaryparser.js": {
"title": "$:/core/modules/parsers/binaryparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/binaryparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe binary parser parses a binary tiddler into a warning message and download link\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar BinaryParser = function(type,text,options) {\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on binary tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!title\"}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to external or internal data URI\n\tif(options._canonical_uri) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: options._canonical_uri\n\t\t};\n\t} else if(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/octet-stream\"] = BinaryParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/csvparser.js": {
"title": "$:/core/modules/parsers/csvparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/csvparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe CSV text parser processes CSV files into a table wrapped in a scrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar CsvParser = function(type,text,options) {\n\t// Table framework\n\tthis.tree = [{\n\t\t\"type\": \"scrollable\", \"children\": [{\n\t\t\t\"type\": \"element\", \"tag\": \"table\", \"children\": [{\n\t\t\t\t\"type\": \"element\", \"tag\": \"tbody\", \"children\": []\n\t\t\t}], \"attributes\": {\n\t\t\t\t\"class\": {\"type\": \"string\", \"value\": \"tc-csv-table\"}\n\t\t\t}\n\t\t}]\n\t}];\n\t// Split the text into lines\n\tvar lines = text.split(/\\r?\\n/mg),\n\t\ttag = \"th\";\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar lineText = lines[line];\n\t\tif(lineText) {\n\t\t\tvar row = {\n\t\t\t\t\t\"type\": \"element\", \"tag\": \"tr\", \"children\": []\n\t\t\t\t};\n\t\t\tvar columns = lineText.split(\",\");\n\t\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\t\trow.children.push({\n\t\t\t\t\t\t\"type\": \"element\", \"tag\": tag, \"children\": [{\n\t\t\t\t\t\t\t\"type\": \"text\",\n\t\t\t\t\t\t\t\"text\": columns[column]\n\t\t\t\t\t\t}]\n\t\t\t\t\t});\n\t\t\t}\n\t\t\ttag = \"td\";\n\t\t\tthis.tree[0].children[0].children[0].children.push(row);\n\t\t}\n\t}\n};\n\nexports[\"text/csv\"] = CsvParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/htmlparser.js": {
"title": "$:/core/modules/parsers/htmlparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/htmlparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe HTML parser displays text as raw HTML\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar HtmlParser = function(type,text,options) {\n\tvar src;\n\tif(options._canonical_uri) {\n\t\tsrc = options._canonical_uri;\n\t} else if(text) {\n\t\tsrc = \"data:text/html;charset=utf-8,\" + encodeURIComponent(text);\n\t}\n\tthis.tree = [{\n\t\ttype: \"element\",\n\t\ttag: \"iframe\",\n\t\tattributes: {\n\t\t\tsrc: {type: \"string\", value: src},\n\t\t\tsandbox: {type: \"string\", value: \"\"}\n\t\t}\n\t}];\n};\n\nexports[\"text/html\"] = HtmlParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/imageparser.js": {
"title": "$:/core/modules/parsers/imageparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/imageparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe image parser parses an image into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"img\",\n\t\t\tattributes: {}\n\t\t};\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\tif(type === \"image/svg+xml\" || type === \".svg\") {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:image/svg+xml,\" + encodeURIComponent(text)};\n\t\t} else {\n\t\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t\t}\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"image/svg+xml\"] = ImageParser;\nexports[\"image/jpg\"] = ImageParser;\nexports[\"image/jpeg\"] = ImageParser;\nexports[\"image/png\"] = ImageParser;\nexports[\"image/gif\"] = ImageParser;\nexports[\"image/webp\"] = ImageParser;\nexports[\"image/heic\"] = ImageParser;\nexports[\"image/heif\"] = ImageParser;\nexports[\"image/x-icon\"] = ImageParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/utils/parseutils.js": {
"title": "$:/core/modules/utils/parseutils.js",
"text": "/*\\\ntitle: $:/core/modules/utils/parseutils.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions concerned with parsing text into tokens.\n\nMost functions have the following pattern:\n\n* The parameters are:\n** `source`: the source string being parsed\n** `pos`: the current parse position within the string\n** Any further parameters are used to identify the token that is being parsed\n* The return value is:\n** null if the token was not found at the specified position\n** an object representing the token with the following standard fields:\n*** `type`: string indicating the type of the token\n*** `start`: start position of the token in the source string\n*** `end`: end position of the token in the source string\n*** Any further fields required to describe the token\n\nThe exception is `skipWhiteSpace`, which just returns the position after the whitespace.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for a whitespace token. Returns null if not found, otherwise returns {type: \"whitespace\", start:, end:,}\n*/\nexports.parseWhiteSpace = function(source,pos) {\n\tvar p = pos,c;\n\twhile(true) {\n\t\tc = source.charAt(p);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tp++;\n\t\t} else {\n\t\t\tbreak;\n\t\t}\n\t}\n\tif(p === pos) {\n\t\treturn null;\n\t} else {\n\t\treturn {\n\t\t\ttype: \"whitespace\",\n\t\t\tstart: pos,\n\t\t\tend: p\n\t\t}\n\t}\n};\n\n/*\nConvenience wrapper for parseWhiteSpace. Returns the position after the whitespace\n*/\nexports.skipWhiteSpace = function(source,pos) {\n\tvar c;\n\twhile(true) {\n\t\tc = source.charAt(pos);\n\t\tif((c === \" \") || (c === \"\\f\") || (c === \"\\n\") || (c === \"\\r\") || (c === \"\\t\") || (c === \"\\v\") || (c === \"\\u00a0\")) { // Ignores some obscure unicode spaces\n\t\t\tpos++;\n\t\t} else {\n\t\t\treturn pos;\n\t\t}\n\t}\n};\n\n/*\nLook for a given string token. Returns null if not found, otherwise returns {type: \"token\", value:, start:, end:,}\n*/\nexports.parseTokenString = function(source,pos,token) {\n\tvar match = source.indexOf(token,pos) === pos;\n\tif(match) {\n\t\treturn {\n\t\t\ttype: \"token\",\n\t\t\tvalue: token,\n\t\t\tstart: pos,\n\t\t\tend: pos + token.length\n\t\t};\n\t}\n\treturn null;\n};\n\n/*\nLook for a token matching a regex. Returns null if not found, otherwise returns {type: \"regexp\", match:, start:, end:,}\n*/\nexports.parseTokenRegExp = function(source,pos,reToken) {\n\tvar node = {\n\t\ttype: \"regexp\",\n\t\tstart: pos\n\t};\n\treToken.lastIndex = pos;\n\tnode.match = reToken.exec(source);\n\tif(node.match && node.match.index === pos) {\n\t\tnode.end = pos + node.match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a string literal. Returns null if not found, otherwise returns {type: \"string\", value:, start:, end:,}\n*/\nexports.parseStringLiteral = function(source,pos) {\n\tvar node = {\n\t\ttype: \"string\",\n\t\tstart: pos\n\t};\n\tvar reString = /(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\")|(?:'([^']*)')/g;\n\treString.lastIndex = pos;\n\tvar match = reString.exec(source);\n\tif(match && match.index === pos) {\n\t\tnode.value = match[1] !== undefined ? match[1] :(\n\t\t\tmatch[2] !== undefined ? match[2] : match[3] \n\t\t\t\t\t);\n\t\tnode.end = pos + match[0].length;\n\t\treturn node;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLook for a macro invocation parameter. Returns null if not found, or {type: \"macro-parameter\", name:, value:, start:, end:}\n*/\nexports.parseMacroParameter = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macro-parameter\",\n\t\tstart: pos\n\t};\n\t// Define our regexp\n\tvar reMacroParameter = /(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\\s>\"'=]+)))/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the parameter\n\tvar token = $tw.utils.parseTokenRegExp(source,pos,reMacroParameter);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the parameter details\n\tnode.value = token.match[2] !== undefined ? token.match[2] : (\n\t\t\t\t\ttoken.match[3] !== undefined ? token.match[3] : (\n\t\t\t\t\t\ttoken.match[4] !== undefined ? token.match[4] : (\n\t\t\t\t\t\t\ttoken.match[5] !== undefined ? token.match[5] : (\n\t\t\t\t\t\t\t\ttoken.match[6] !== undefined ? token.match[6] : (\n\t\t\t\t\t\t\t\t\t\"\"\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t);\n\tif(token.match[1]) {\n\t\tnode.name = token.match[1];\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for a macro invocation. Returns null if not found, or {type: \"macrocall\", name:, parameters:, start:, end:}\n*/\nexports.parseMacroInvocation = function(source,pos) {\n\tvar node = {\n\t\ttype: \"macrocall\",\n\t\tstart: pos,\n\t\tparams: []\n\t};\n\t// Define our regexps\n\tvar reMacroName = /([^\\s>\"'=]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double less than sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"<<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the macro name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reMacroName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Process parameters\n\tvar parameter = $tw.utils.parseMacroParameter(source,pos);\n\twhile(parameter) {\n\t\tnode.params.push(parameter);\n\t\tpos = parameter.end;\n\t\t// Get the next parameter\n\t\tparameter = $tw.utils.parseMacroParameter(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a double greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">>\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n/*\nLook for an HTML attribute definition. Returns null if not found, otherwise returns {type: \"attribute\", name:, valueType: \"string|indirect|macro\", value:, start:, end:,}\n*/\nexports.parseAttribute = function(source,pos) {\n\tvar node = {\n\t\tstart: pos\n\t};\n\t// Define our regexps\n\tvar reAttributeName = /([^\\/\\s>\"'=]+)/g,\n\t\treUnquotedAttribute = /([^\\/\\s<>\"'=]+)/g,\n\t\treFilteredValue = /\\{\\{\\{(.+?)\\}\\}\\}/g,\n\t\treIndirectValue = /\\{\\{([^\\}]+)\\}\\}/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the attribute name\n\tvar name = $tw.utils.parseTokenRegExp(source,pos,reAttributeName);\n\tif(!name) {\n\t\treturn null;\n\t}\n\tnode.name = name.match[1];\n\tpos = name.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for an equals sign\n\tvar token = $tw.utils.parseTokenString(source,pos,\"=\");\n\tif(token) {\n\t\tpos = token.end;\n\t\t// Skip whitespace\n\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t// Look for a string literal\n\t\tvar stringLiteral = $tw.utils.parseStringLiteral(source,pos);\n\t\tif(stringLiteral) {\n\t\t\tpos = stringLiteral.end;\n\t\t\tnode.type = \"string\";\n\t\t\tnode.value = stringLiteral.value;\n\t\t} else {\n\t\t\t// Look for a filtered value\n\t\t\tvar filteredValue = $tw.utils.parseTokenRegExp(source,pos,reFilteredValue);\n\t\t\tif(filteredValue) {\n\t\t\t\tpos = filteredValue.end;\n\t\t\t\tnode.type = \"filtered\";\n\t\t\t\tnode.filter = filteredValue.match[1];\n\t\t\t} else {\n\t\t\t\t// Look for an indirect value\n\t\t\t\tvar indirectValue = $tw.utils.parseTokenRegExp(source,pos,reIndirectValue);\n\t\t\t\tif(indirectValue) {\n\t\t\t\t\tpos = indirectValue.end;\n\t\t\t\t\tnode.type = \"indirect\";\n\t\t\t\t\tnode.textReference = indirectValue.match[1];\n\t\t\t\t} else {\n\t\t\t\t\t// Look for a unquoted value\n\t\t\t\t\tvar unquotedValue = $tw.utils.parseTokenRegExp(source,pos,reUnquotedAttribute);\n\t\t\t\t\tif(unquotedValue) {\n\t\t\t\t\t\tpos = unquotedValue.end;\n\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\tnode.value = unquotedValue.match[1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Look for a macro invocation value\n\t\t\t\t\t\tvar macroInvocation = $tw.utils.parseMacroInvocation(source,pos);\n\t\t\t\t\t\tif(macroInvocation) {\n\t\t\t\t\t\t\tpos = macroInvocation.end;\n\t\t\t\t\t\t\tnode.type = \"macro\";\n\t\t\t\t\t\t\tnode.value = macroInvocation;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tnode.type = \"string\";\n\t\t\t\t\t\t\tnode.value = \"true\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} else {\n\t\tnode.type = \"string\";\n\t\tnode.value = \"true\";\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/parsers/pdfparser.js": {
"title": "$:/core/modules/parsers/pdfparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/pdfparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe PDF parser embeds a PDF viewer\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ImageParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"embed\",\n\t\t\tattributes: {}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:application/pdf;base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"application/pdf\"] = ImageParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/textparser.js": {
"title": "$:/core/modules/parsers/textparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/textparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe plain text parser processes blocks of source text into a degenerate parse tree consisting of a single text node\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TextParser = function(type,text,options) {\n\tthis.tree = [{\n\t\ttype: \"codeblock\",\n\t\tattributes: {\n\t\t\tcode: {type: \"string\", value: text},\n\t\t\tlanguage: {type: \"string\", value: type}\n\t\t}\n\t}];\n};\n\nexports[\"text/plain\"] = TextParser;\nexports[\"text/x-tiddlywiki\"] = TextParser;\nexports[\"application/javascript\"] = TextParser;\nexports[\"application/json\"] = TextParser;\nexports[\"text/css\"] = TextParser;\nexports[\"application/x-tiddler-dictionary\"] = TextParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/videoparser.js": {
"title": "$:/core/modules/parsers/videoparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/videoparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe video parser parses a video tiddler into an embeddable HTML element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar VideoParser = function(type,text,options) {\n\tvar element = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"video\",\n\t\t\tattributes: {\n\t\t\t\tcontrols: {type: \"string\", value: \"controls\"},\n\t\t\t\tstyle: {type: \"string\", value: \"width: 100%; object-fit: contain\"}\n\t\t\t}\n\t\t},\n\t\tsrc;\n\tif(options._canonical_uri) {\n\t\telement.attributes.src = {type: \"string\", value: options._canonical_uri};\n\t} else if(text) {\n\t\telement.attributes.src = {type: \"string\", value: \"data:\" + type + \";base64,\" + text};\n\t}\n\tthis.tree = [element];\n};\n\nexports[\"video/ogg\"] = VideoParser;\nexports[\"video/webm\"] = VideoParser;\nexports[\"video/mp4\"] = VideoParser;\nexports[\"video/quicktime\"] = VideoParser;\n\n})();\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/codeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/codeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for code blocks. For example:\n\n```\n\t```\n\tThis text will not be //wikified//\n\t```\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match and get language if defined\n\tthis.matchRegExp = /```([\\w-]*)\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\\r?\\n```$)/mg;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Return the $codeblock widget\n\treturn [{\n\t\t\ttype: \"codeblock\",\n\t\t\tattributes: {\n\t\t\t\t\tcode: {type: \"string\", value: text},\n\t\t\t\t\tlanguage: {type: \"string\", value: this.match[1]}\n\t\t\t}\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/codeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/codeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/codeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for code runs. For example:\n\n```\n\tThis is a `code run`.\n\tThis is another ``code run``\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"codeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(``?)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar reEnd = new RegExp(this.match[1], \"mg\");\n\t// Look for the end marker\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the text\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"code\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: text\n\t\t}]\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/commentblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/commentinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/commentinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/commentinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML comments. For example:\n\n```\n<!-- This is a comment -->\n```\n\nNote that the syntax for comments is simplified to an opening \"<!--\" sequence and a closing \"-->\" sequence -- HTML itself implements a more complex format (see http://ostermiller.org/findhtmlcomment.html)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"commentinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\tthis.matchRegExp = /<!--/mg;\n\tthis.endMatchRegExp = /-->/mg;\n};\n\nexports.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\tif(this.match) {\n\t\tthis.endMatchRegExp.lastIndex = startPos + this.match[0].length;\n\t\tthis.endMatch = this.endMatchRegExp.exec(this.parser.source);\n\t\tif(this.endMatch) {\n\t\t\treturn this.match.index;\n\t\t}\n\t}\n\treturn undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.endMatchRegExp.lastIndex;\n\t// Don't return any elements\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/dash.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/dash.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/dash.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for dashes. For example:\n\n```\nThis is an en-dash: --\n\nThis is an em-dash: ---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"dash\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{2,3}(?!-)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar dash = this.match[0].length === 2 ? \"–\" : \"—\";\n\treturn [{\n\t\ttype: \"entity\",\n\t\tentity: dash\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/bold.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/bold.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - bold. For example:\n\n```\n\tThis is ''bold'' text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except bold \n\\rules only bold \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"bold\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /''/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/''/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strong\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/italic.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/italic.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - italic. For example:\n\n```\n\tThis is //italic// text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except italic\n\\rules only italic\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"italic\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\/\\//mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\/\\//mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"em\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/strikethrough.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - strikethrough. For example:\n\n```\n\tThis is ~~strikethrough~~ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except strikethrough \n\\rules only strikethrough \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"strikethrough\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~~/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/~~/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"strike\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/subscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - subscript. For example:\n\n```\n\tThis is ,,subscript,, text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except subscript \n\\rules only subscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"subscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /,,/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/,,/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sub\",\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/superscript.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - superscript. For example:\n\n```\n\tThis is ^^superscript^^ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except superscript \n\\rules only superscript \n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"superscript\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\^\\^/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/\\^\\^/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"sup\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/emphasis/underscore.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for emphasis - underscore. For example:\n\n```\n\tThis is __underscore__ text\n```\n\nThis wikiparser can be modified using the rules eg:\n\n```\n\\rules except underscore \n\\rules only underscore\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"underscore\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /__/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\n\t// Parse the run including the terminator\n\tvar tree = this.parser.parseInlineRun(/__/mg,{eatTerminator: true});\n\n\t// Return the classed span\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"u\",\n\t\tchildren: tree\n\t}];\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/entity.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/entity.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/entity.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for HTML entities. For example:\n\n```\n\tThis is a copyright symbol: ©\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"entity\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(&#?[a-zA-Z0-9]{2,8};)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar entityString = this.match[1];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Return the entity\n\treturn [{type: \"entity\", entity: this.match[0]}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/extlink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/extlink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/extlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\nAn external link: https://www.tiddlywiki.com/\n\nA suppressed external link: ~http://www.tiddlyspace.com/\n```\n\nExternal links can be suppressed by preceding them with `~`.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"extlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /~?(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(this.match[0].substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: this.match[0].substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: this.match[0]},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: this.match[0]\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t},\n\t\tisBlock: true\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/filteredtranscludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline filtered transclusion. For example:\n\n```\n{{{ [tag[docs]] }}}\n{{{ [tag[docs]] |tooltip}}}\n{{{ [tag[docs]] ||TemplateTitle}}}\n{{{ [tag[docs]] |tooltip||TemplateTitle}}}\n{{{ [tag[docs]] }}width:40;height:50;}.class.class\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"filteredtranscludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{\\{([^\\|]+?)(?:\\|([^\\|\\{\\}]+))?(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}([^\\}]*)\\}(?:\\.(\\S+))?/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar filter = this.match[1],\n\t\ttooltip = this.match[2],\n\t\ttemplate = $tw.utils.trim(this.match[3]),\n\t\tstyle = this.match[4],\n\t\tclasses = this.match[5];\n\t// Return the list widget\n\tvar node = {\n\t\ttype: \"list\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: filter}\n\t\t}\n\t};\n\tif(tooltip) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: tooltip};\n\t}\n\tif(template) {\n\t\tnode.attributes.template = {type: \"string\", value: template};\n\t}\n\tif(style) {\n\t\tnode.attributes.style = {type: \"string\", value: style};\n\t}\n\tif(classes) {\n\t\tnode.attributes.itemClass = {type: \"string\", value: classes.split(\".\").join(\" \")};\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/hardlinebreaks.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for marking areas with hard line breaks. For example:\n\n```\n\"\"\"\nThis is some text\nThat is set like\nIt is a Poem\nWhen it is\nClearly\nNot\n\"\"\"\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"hardlinebreaks\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\"\"\"(?:\\r?\\n)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /(\"\"\")|(\\r?\\n)/mg,\n\t\ttree = [],\n\t\tmatch;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tdo {\n\t\t// Parse the run up to the terminator\n\t\ttree.push.apply(tree,this.parser.parseInlineRun(reEnd,{eatTerminator: false}));\n\t\t// Redo the terminator match\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tmatch = reEnd.exec(this.parser.source);\n\t\tif(match) {\n\t\t\tthis.parser.pos = reEnd.lastIndex;\n\t\t\t// Add a line break if the terminator was a line break\n\t\t\tif(match[2]) {\n\t\t\t\ttree.push({type: \"element\", tag: \"br\"});\n\t\t\t}\n\t\t}\n\t} while(match && !match[1]);\n\t// Return the nodes\n\treturn tree;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/heading.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/heading.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/heading.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for headings\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"heading\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(!{1,6})/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar headingLevel = this.match[1].length;\n\t// Move past the !s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse any classes, whitespace and then the heading itself\n\tvar classes = this.parser.parseClasses();\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// Return the heading\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"h\" + headingLevel, \n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: classes.join(\" \")}\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/horizrule.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/horizrule.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/horizrule.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for rules. For example:\n\n```\n---\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"horizrule\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /-{3,}\\r?(?:\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\treturn [{type: \"element\", tag: \"hr\"}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/html.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/html.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/html.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for HTML elements and widgets. For example:\n\n{{{\n<aside>\nThis is an HTML5 aside element\n</aside>\n\n<$slider target=\"MyTiddler\">\nThis is a widget invocation\n</$slider>\n\n}}}\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"html\";\nexports.types = {inline: true, block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextTag = this.findNextTag(this.parser.source,startPos,{\n\t\trequireLineBreak: this.is.block\n\t});\n\treturn this.nextTag ? this.nextTag.start : undefined;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Retrieve the most recent match so that recursive calls don't overwrite it\n\tvar tag = this.nextTag;\n\tthis.nextTag = null;\n\t// Advance the parser position to past the tag\n\tthis.parser.pos = tag.end;\n\t// Check for an immediately following double linebreak\n\tvar hasLineBreak = !tag.isSelfClosing && !!$tw.utils.parseTokenRegExp(this.parser.source,this.parser.pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t// Set whether we're in block mode\n\ttag.isBlock = this.is.block || hasLineBreak;\n\t// Parse the body if we need to\n\tif(!tag.isSelfClosing && $tw.config.htmlVoidElements.indexOf(tag.tag) === -1) {\n\t\t\tvar reEndString = \"</\" + $tw.utils.escapeRegExp(tag.tag) + \">\",\n\t\t\t\treEnd = new RegExp(\"(\" + reEndString + \")\",\"mg\");\n\t\tif(hasLineBreak) {\n\t\t\ttag.children = this.parser.parseBlocks(reEndString);\n\t\t} else {\n\t\t\ttag.children = this.parser.parseInlineRun(reEnd);\n\t\t}\n\t\treEnd.lastIndex = this.parser.pos;\n\t\tvar endMatch = reEnd.exec(this.parser.source);\n\t\tif(endMatch && endMatch.index === this.parser.pos) {\n\t\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t\t}\n\t}\n\t// Return the tag\n\treturn [tag];\n};\n\n/*\nLook for an HTML tag. Returns null if not found, otherwise returns {type: \"element\", name:, attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseTag = function(source,pos,options) {\n\toptions = options || {};\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Define our regexps\n\tvar reTagName = /([a-zA-Z0-9\\-\\$]+)/g;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a less than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\"<\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Get the tag name\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,reTagName);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tnode.tag = token.match[1];\n\tif(node.tag.slice(1).indexOf(\"$\") !== -1) {\n\t\treturn null;\n\t}\n\tif(node.tag.charAt(0) === \"$\") {\n\t\tnode.type = node.tag.substr(1);\n\t}\n\tpos = token.end;\n\t// Check that the tag is terminated by a space, / or >\n\tif(!$tw.utils.parseWhiteSpace(source,pos) && !(source.charAt(pos) === \"/\") && !(source.charAt(pos) === \">\") ) {\n\t\treturn null;\n\t}\n\t// Process attributes\n\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\twhile(attribute) {\n\t\tnode.attributes[attribute.name] = attribute;\n\t\tpos = attribute.end;\n\t\t// Get the next attribute\n\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for a closing slash\n\ttoken = $tw.utils.parseTokenString(source,pos,\"/\");\n\tif(token) {\n\t\tpos = token.end;\n\t\tnode.isSelfClosing = true;\n\t}\n\t// Look for a greater than sign\n\ttoken = $tw.utils.parseTokenString(source,pos,\">\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Check for a required line break\n\tif(options.requireLineBreak) {\n\t\ttoken = $tw.utils.parseTokenRegExp(source,pos,/([^\\S\\n\\r]*\\r?\\n(?:[^\\S\\n\\r]*\\r?\\n|$))/g);\n\t\tif(!token) {\n\t\t\treturn null;\n\t\t}\n\t}\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\nexports.findNextTag = function(source,pos,options) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /<([a-zA-Z\\-\\$]+)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseTag(source,match.index,options);\n\t\t// Return success\n\t\tif(tag && this.isLegalTag(tag)) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\nexports.isLegalTag = function(tag) {\n\t// Widgets are always OK\n\tif(tag.type !== \"element\") {\n\t\treturn true;\n\t// If it's an HTML tag that starts with a dash then it's not legal\n\t} else if(tag.tag.charAt(0) === \"-\") {\n\t\treturn false;\n\t} else {\n\t\t// Otherwise it's OK\n\t\treturn true;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/image.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/image.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/image.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for embedding images. For example:\n\n```\n[img[https://tiddlywiki.com/fractalveg.jpg]]\n[img width=23 height=24 [https://tiddlywiki.com/fractalveg.jpg]]\n[img width={{!!width}} height={{!!height}} [https://tiddlywiki.com/fractalveg.jpg]]\n[img[Description of image|https://tiddlywiki.com/fractalveg.jpg]]\n[img[TiddlerTitle]]\n[img[Description of image|TiddlerTitle]]\n```\n\nGenerates the `<$image>` widget.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"image\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextImage = this.findNextImage(this.parser.source,startPos);\n\treturn this.nextImage ? this.nextImage.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextImage.end;\n\tvar node = {\n\t\ttype: \"image\",\n\t\tattributes: this.nextImage.attributes\n\t};\n\treturn [node];\n};\n\n/*\nFind the next image from the current position\n*/\nexports.findNextImage = function(source,pos) {\n\t// A regexp for finding candidate HTML tags\n\tvar reLookahead = /(\\[img)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a tag\n\t\tvar tag = this.parseImage(source,match.index);\n\t\t// Return success\n\t\tif(tag) {\n\t\t\treturn tag;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an image at the specified position. Returns null if not found, otherwise returns {type: \"image\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseImage = function(source,pos) {\n\tvar token,\n\t\tnode = {\n\t\t\ttype: \"image\",\n\t\t\tstart: pos,\n\t\t\tattributes: {}\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[img`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[img\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Process attributes\n\tif(source.charAt(pos) !== \"[\") {\n\t\tvar attribute = $tw.utils.parseAttribute(source,pos);\n\t\twhile(attribute) {\n\t\t\tnode.attributes[attribute.name] = attribute;\n\t\t\tpos = attribute.end;\n\t\t\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t\t\tif(source.charAt(pos) !== \"[\") {\n\t\t\t\t// Get the next attribute\n\t\t\t\tattribute = $tw.utils.parseAttribute(source,pos);\n\t\t\t} else {\n\t\t\t\tattribute = null;\n\t\t\t}\n\t\t}\n\t}\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[` after the attributes\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Get the source up to the terminating `]]`\n\ttoken = $tw.utils.parseTokenRegExp(source,pos,/(?:([^|\\]]*?)\\|)?([^\\]]+?)\\]\\]/g);\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\tif(token.match[1]) {\n\t\tnode.attributes.tooltip = {type: \"string\", value: token.match[1].trim()};\n\t}\n\tnode.attributes.source = {type: \"string\", value: (token.match[2] || \"\").trim()};\n\t// Update the end position\n\tnode.end = pos;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/import.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/import.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/import.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for importing variable definitions\n\n```\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"import\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\import[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the filter terminated by a line break\n\tvar reMatch = /(.*)(\\r?\\n)|$/mg;\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\tthis.parser.pos = reMatch.lastIndex;\n\t// Parse tree nodes to return\n\treturn [{\n\t\ttype: \"importvariables\",\n\t\tattributes: {\n\t\t\tfilter: {type: \"string\", value: match[1]}\n\t\t},\n\t\tchildren: []\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/list.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/list.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/list.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for lists. For example:\n\n```\n* This is an unordered list\n* It has two items\n\n# This is a numbered list\n## With a subitem\n# And a third item\n\n; This is a term that is being defined\n: This is the definition of that term\n```\n\nNote that lists can be nested arbitrarily:\n\n```\n#** One\n#* Two\n#** Three\n#**** Four\n#**# Five\n#**## Six\n## Seven\n### Eight\n## Nine\n```\n\nA CSS class can be applied to a list item as follows:\n\n```\n* List item one\n*.active List item two has the class `active`\n* List item three\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"list\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /([\\*#;:>]+)/mg;\n};\n\nvar listTypes = {\n\t\"*\": {listTag: \"ul\", itemTag: \"li\"},\n\t\"#\": {listTag: \"ol\", itemTag: \"li\"},\n\t\";\": {listTag: \"dl\", itemTag: \"dt\"},\n\t\":\": {listTag: \"dl\", itemTag: \"dd\"},\n\t\">\": {listTag: \"blockquote\", itemTag: \"div\"}\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Array of parse tree nodes for the previous row of the list\n\tvar listStack = [];\n\t// Cycle through the items in the list\n\twhile(true) {\n\t\t// Match the list marker\n\t\tvar reMatch = /([\\*#;:>]+)/mg;\n\t\treMatch.lastIndex = this.parser.pos;\n\t\tvar match = reMatch.exec(this.parser.source);\n\t\tif(!match || match.index !== this.parser.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check whether the list type of the top level matches\n\t\tvar listInfo = listTypes[match[0].charAt(0)];\n\t\tif(listStack.length > 0 && listStack[0].tag !== listInfo.listTag) {\n\t\t\tbreak;\n\t\t}\n\t\t// Move past the list marker\n\t\tthis.parser.pos = match.index + match[0].length;\n\t\t// Walk through the list markers for the current row\n\t\tfor(var t=0; t<match[0].length; t++) {\n\t\t\tlistInfo = listTypes[match[0].charAt(t)];\n\t\t\t// Remove any stacked up element if we can't re-use it because the list type doesn't match\n\t\t\tif(listStack.length > t && listStack[t].tag !== listInfo.listTag) {\n\t\t\t\tlistStack.splice(t,listStack.length - t);\n\t\t\t}\n\t\t\t// Construct the list element or reuse the previous one at this level\n\t\t\tif(listStack.length <= t) {\n\t\t\t\tvar listElement = {type: \"element\", tag: listInfo.listTag, children: [\n\t\t\t\t\t{type: \"element\", tag: listInfo.itemTag, children: []}\n\t\t\t\t]};\n\t\t\t\t// Link this list element into the last child item of the parent list item\n\t\t\t\tif(t) {\n\t\t\t\t\tvar prevListItem = listStack[t-1].children[listStack[t-1].children.length-1];\n\t\t\t\t\tprevListItem.children.push(listElement);\n\t\t\t\t}\n\t\t\t\t// Save this element in the stack\n\t\t\t\tlistStack[t] = listElement;\n\t\t\t} else if(t === (match[0].length - 1)) {\n\t\t\t\tlistStack[t].children.push({type: \"element\", tag: listInfo.itemTag, children: []});\n\t\t\t}\n\t\t}\n\t\tif(listStack.length > match[0].length) {\n\t\t\tlistStack.splice(match[0].length,listStack.length - match[0].length);\n\t\t}\n\t\t// Process the body of the list item into the last list item\n\t\tvar lastListChildren = listStack[listStack.length-1].children,\n\t\t\tlastListItem = lastListChildren[lastListChildren.length-1],\n\t\t\tclasses = this.parser.parseClasses();\n\t\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\t\tvar tree = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t\tlastListItem.children.push.apply(lastListItem.children,tree);\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(lastListItem,classes.join(\" \"));\n\t\t}\n\t\t// Consume any whitespace following the list item\n\t\tthis.parser.skipWhitespace();\n\t}\n\t// Return the root element of the list\n\treturn [listStack[0]];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for block macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^>\\s]+)(?:\\s*)((?:[^>]|(?:>(?!>)))*?)>>(?:\\r?\\n|$)/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params,\n\t\tisBlock: true\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrocallinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrocallinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrocallinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki rule for macro calls\n\n```\n<<name value value2>>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrocallinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /<<([^\\s>]+)\\s*([\\s\\S]*?)>>/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get all the details of the match\n\tvar macroName = this.match[1],\n\t\tparamString = this.match[2];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\tvar params = [],\n\t\treParam = /\\s*(?:([A-Za-z0-9\\-_]+)\\s*:)?(?:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))/mg,\n\t\tparamMatch = reParam.exec(paramString);\n\twhile(paramMatch) {\n\t\t// Process this parameter\n\t\tvar paramInfo = {\n\t\t\tvalue: paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5]|| paramMatch[6]\n\t\t};\n\t\tif(paramMatch[1]) {\n\t\t\tparamInfo.name = paramMatch[1];\n\t\t}\n\t\tparams.push(paramInfo);\n\t\t// Find the next match\n\t\tparamMatch = reParam.exec(paramString);\n\t}\n\treturn [{\n\t\ttype: \"macrocall\",\n\t\tname: macroName,\n\t\tparams: params\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/macrodef.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/macrodef.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/macrodef.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for macro definitions\n\n```\n\\define name(param:defaultvalue,param2:defaultvalue)\ndefinition text, including $param$ markers\n\\end\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"macrodef\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\define\\s+([^(\\s]+)\\(\\s*([^)]*)\\)(\\s*\\r?\\n)?/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the macro name and parameters\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the parameters\n\tvar paramString = this.match[2],\n\t\tparams = [];\n\tif(paramString !== \"\") {\n\t\tvar reParam = /\\s*([A-Za-z0-9\\-_]+)(?:\\s*:\\s*(?:\"\"\"([\\s\\S]*?)\"\"\"|\"([^\"]*)\"|'([^']*)'|\\[\\[([^\\]]*)\\]\\]|([^\"'\\s]+)))?/mg,\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\twhile(paramMatch) {\n\t\t\t// Save the parameter details\n\t\t\tvar paramInfo = {name: paramMatch[1]},\n\t\t\t\tdefaultValue = paramMatch[2] || paramMatch[3] || paramMatch[4] || paramMatch[5] || paramMatch[6];\n\t\t\tif(defaultValue) {\n\t\t\t\tparamInfo[\"default\"] = defaultValue;\n\t\t\t}\n\t\t\tparams.push(paramInfo);\n\t\t\t// Look for the next parameter\n\t\t\tparamMatch = reParam.exec(paramString);\n\t\t}\n\t}\n\t// Is this a multiline definition?\n\tvar reEnd;\n\tif(this.match[3]) {\n\t\t// If so, the end of the body is marked with \\end\n\t\treEnd = /(\\r?\\n\\\\end[^\\S\\n\\r]*(?:$|\\r?\\n))/mg;\n\t} else {\n\t\t// Otherwise, the end of the definition is marked by the end of the line\n\t\treEnd = /($|\\r?\\n)/mg;\n\t\t// Move past any whitespace\n\t\tthis.parser.pos = $tw.utils.skipWhiteSpace(this.parser.source,this.parser.pos);\n\t}\n\t// Find the end of the definition\n\treEnd.lastIndex = this.parser.pos;\n\tvar text,\n\t\tendMatch = reEnd.exec(this.parser.source);\n\tif(endMatch) {\n\t\ttext = this.parser.source.substring(this.parser.pos,endMatch.index);\n\t\tthis.parser.pos = endMatch.index + endMatch[0].length;\n\t} else {\n\t\t// We didn't find the end of the definition, so we'll make it blank\n\t\ttext = \"\";\n\t}\n\t// Save the macro definition\n\treturn [{\n\t\ttype: \"set\",\n\t\tattributes: {\n\t\t\tname: {type: \"string\", value: this.match[1]},\n\t\t\tvalue: {type: \"string\", value: text}\n\t\t},\n\t\tchildren: [],\n\t\tparams: params,\n\t\tisMacroDefinition: true\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettyextlink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/prettyextlink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettyextlink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for external links. For example:\n\n```\n[ext[https://tiddlywiki.com/fractalveg.jpg]]\n[ext[Tooltip|https://tiddlywiki.com/fractalveg.jpg]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettyextlink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n};\n\nexports.findNextMatch = function(startPos) {\n\t// Find the next tag\n\tthis.nextLink = this.findNextLink(this.parser.source,startPos);\n\treturn this.nextLink ? this.nextLink.start : undefined;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.nextLink.end;\n\treturn [this.nextLink];\n};\n\n/*\nFind the next link from the current position\n*/\nexports.findNextLink = function(source,pos) {\n\t// A regexp for finding candidate links\n\tvar reLookahead = /(\\[ext\\[)/g;\n\t// Find the next candidate\n\treLookahead.lastIndex = pos;\n\tvar match = reLookahead.exec(source);\n\twhile(match) {\n\t\t// Try to parse the candidate as a link\n\t\tvar link = this.parseLink(source,match.index);\n\t\t// Return success\n\t\tif(link) {\n\t\t\treturn link;\n\t\t}\n\t\t// Look for the next match\n\t\treLookahead.lastIndex = match.index + 1;\n\t\tmatch = reLookahead.exec(source);\n\t}\n\t// Failed\n\treturn null;\n};\n\n/*\nLook for an link at the specified position. Returns null if not found, otherwise returns {type: \"element\", tag: \"a\", attributes: [], isSelfClosing:, start:, end:,}\n*/\nexports.parseLink = function(source,pos) {\n\tvar token,\n\t\ttextNode = {\n\t\t\ttype: \"text\"\n\t\t},\n\t\tnode = {\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tstart: pos,\n\t\t\tattributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t},\n\t\t\tchildren: [textNode]\n\t\t};\n\t// Skip whitespace\n\tpos = $tw.utils.skipWhiteSpace(source,pos);\n\t// Look for the `[ext[`\n\ttoken = $tw.utils.parseTokenString(source,pos,\"[ext[\");\n\tif(!token) {\n\t\treturn null;\n\t}\n\tpos = token.end;\n\t// Look ahead for the terminating `]]`\n\tvar closePos = source.indexOf(\"]]\",pos);\n\tif(closePos === -1) {\n\t\treturn null;\n\t}\n\t// Look for a `|` separating the tooltip\n\tvar splitPos = source.indexOf(\"|\",pos);\n\tif(splitPos === -1 || splitPos > closePos) {\n\t\tsplitPos = null;\n\t}\n\t// Pull out the tooltip and URL\n\tvar tooltip, URL;\n\tif(splitPos) {\n\t\tURL = source.substring(splitPos + 1,closePos).trim();\n\t\ttextNode.text = source.substring(pos,splitPos).trim();\n\t} else {\n\t\tURL = source.substring(pos,closePos).trim();\n\t\ttextNode.text = URL;\n\t}\n\tnode.attributes.href = {type: \"string\", value: URL};\n\tnode.attributes.target = {type: \"string\", value: \"_blank\"};\n\tnode.attributes.rel = {type: \"string\", value: \"noopener noreferrer\"};\n\t// Update the end position\n\tnode.end = closePos + 2;\n\treturn node;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/prettylink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/prettylink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/prettylink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for pretty links. For example:\n\n```\n[[Introduction]]\n\n[[Link description|TiddlerTitle]]\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"prettylink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\[\\[(.*?)(?:\\|(.*?))?\\]\\]/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Process the link\n\tvar text = this.match[1],\n\t\tlink = this.match[2] || text;\n\tif($tw.utils.isLinkExternal(link)) {\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"a\",\n\t\t\tattributes: {\n\t\t\t\thref: {type: \"string\", value: link},\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-tiddlylink-external\"},\n\t\t\t\ttarget: {type: \"string\", value: \"_blank\"},\n\t\t\t\trel: {type: \"string\", value: \"noopener noreferrer\"}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: link}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\", text: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/quoteblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/quoteblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/quoteblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for quote blocks. For example:\n\n```\n\t<<<.optionalClass(es) optional cited from\n\ta quote\n\t<<<\n\t\n\t<<<.optionalClass(es)\n\ta quote\n\t<<< optional cited from\n```\n\nQuotes can be quoted by putting more <s\n\n```\n\t<<<\n\tQuote Level 1\n\t\n\t<<<<\n\tQuoteLevel 2\n\t<<<<\n\t\n\t<<<\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"quoteblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /(<<<+)/mg;\n};\n\nexports.parse = function() {\n\tvar classes = [\"tc-quote\"];\n\t// Get all the details of the match\n\tvar reEndString = \"^\" + this.match[1] + \"(?!<)\";\n\t// Move past the <s\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\n\t// Parse any classes, whitespace and then the optional cite itself\n\tclasses.push.apply(classes, this.parser.parseClasses());\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tvar cite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// before handling the cite, parse the body of the quote\n\tvar tree= this.parser.parseBlocks(reEndString);\n\t// If we got a cite, put it before the text\n\tif(cite.length > 0) {\n\t\ttree.unshift({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Parse any optional cite\n\tthis.parser.skipWhitespace({treatNewlinesAsNonWhitespace: true});\n\tcite = this.parser.parseInlineRun(/(\\r?\\n)/mg);\n\t// If we got a cite, push it\n\tif(cite.length > 0) {\n\t\ttree.push({\n\t\t\ttype: \"element\",\n\t\t\ttag: \"cite\",\n\t\t\tchildren: cite\n\t\t});\n\t}\n\t// Return the blockquote element\n\treturn [{\n\t\ttype: \"element\",\n\t\ttag: \"blockquote\",\n\t\tattributes: {\n\t\t\tclass: { type: \"string\", value: classes.join(\" \") },\n\t\t},\n\t\tchildren: tree\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/rules.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/rules.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/rules.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for rules specifications\n\n```\n\\rules except ruleone ruletwo rulethree\n\\rules only ruleone ruletwo rulethree\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"rules\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\rules[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\tif(tokens.length > 0) {\n\t\tthis.parser.amendRules(tokens[0],tokens.slice(1));\n\t}\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/styleblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for assigning styles and classes to paragraphs and other blocks. For example:\n\n```\n@@.myClass\n@@background-color:red;\nThis paragraph will have the CSS class `myClass`.\n\n* The `<ul>` around this list will also have the class `myClass`\n* List item 2\n\n@@\n```\n\nNote that classes and styles can be mixed subject to the rule that styles must precede classes. For example\n\n```\n@@.myFirstClass.mySecondClass\n@@width:100px;.myThirdClass\nThis is a paragraph\n@@\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(?:\\.([^\\r\\n\\s]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEndString = \"^@@(?:\\\\r?\\\\n)?\";\n\tvar classes = [], styles = [];\n\tdo {\n\t\t// Get the class and style\n\t\tif(this.match[1]) {\n\t\t\tstyles.push(this.match[1]);\n\t\t}\n\t\tif(this.match[2]) {\n\t\t\tclasses.push(this.match[2].split(\".\").join(\" \"));\n\t\t}\n\t\t// Move past the match\n\t\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t\t// Look for another line of classes and styles\n\t\tthis.match = this.matchRegExp.exec(this.parser.source);\n\t} while(this.match && this.match.index === this.parser.pos);\n\t// Parse the body\n\tvar tree = this.parser.parseBlocks(reEndString);\n\tfor(var t=0; t<tree.length; t++) {\n\t\tif(classes.length > 0) {\n\t\t\t$tw.utils.addClassToParseTreeNode(tree[t],classes.join(\" \"));\n\t\t}\n\t\tif(styles.length > 0) {\n\t\t\t$tw.utils.addAttributeToParseTreeNode(tree[t],\"style\",styles.join(\"\"));\n\t\t}\n\t}\n\treturn tree;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/styleinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/styleinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/styleinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for assigning styles and classes to inline runs. For example:\n\n```\n@@.myClass This is some text with a class@@\n@@background-color:red;This is some text with a background colour@@\n@@width:100px;.myClass This is some text with a class and a width@@\n```\n\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"styleinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /@@((?:[^\\.\\r\\n\\s:]+:[^\\r\\n;]+;)+)?(\\.(?:[^\\r\\n\\s]+)\\s+)?/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /@@/g;\n\t// Get the styles and class\n\tvar stylesString = this.match[1],\n\t\tclassString = this.match[2] ? this.match[2].split(\".\").join(\" \") : undefined;\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse the run up to the terminator\n\tvar tree = this.parser.parseInlineRun(reEnd,{eatTerminator: true});\n\t// Return the classed span\n\tvar node = {\n\t\ttype: \"element\",\n\t\ttag: \"span\",\n\t\tattributes: {\n\t\t\t\"class\": {type: \"string\", value: \"tc-inline-style\"}\n\t\t},\n\t\tchildren: tree\n\t};\n\tif(classString) {\n\t\t$tw.utils.addClassToParseTreeNode(node,classString);\n\t}\n\tif(stylesString) {\n\t\t$tw.utils.addAttributeToParseTreeNode(node,\"style\",stylesString);\n\t}\n\treturn [node];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/syslink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/syslink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/syslink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for system tiddler links.\nCan be suppressed preceding them with `~`.\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"syslink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp(\n\t\t\"~?\\\\$:\\\\/[\" +\n\t\t$tw.config.textPrimitives.anyLetter.substr(1,$tw.config.textPrimitives.anyLetter.length - 2) +\n\t\t\"\\/._-]+\",\n\t\t\"mg\"\n\t);\n};\n\nexports.parse = function() {\n\tvar match = this.match[0];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Create the link unless it is suppressed\n\tif(match.substr(0,1) === \"~\") {\n\t\treturn [{type: \"text\", text: match.substr(1)}];\n\t} else {\n\t\treturn [{\n\t\t\ttype: \"link\",\n\t\t\tattributes: {\n\t\t\t\tto: {type: \"string\", value: match}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: match\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/table.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/table.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/table.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text block rule for tables.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"table\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\|(?:[^\\n]*)\\|(?:[fhck]?)\\r?(?:\\n|$)/mg;\n};\n\nvar processRow = function(prevColumns) {\n\tvar cellRegExp = /(?:\\|([^\\n\\|]*)\\|)|(\\|[fhck]?\\r?(?:\\n|$))/mg,\n\t\tcellTermRegExp = /((?:\\x20*)\\|)/mg,\n\t\ttree = [],\n\t\tcol = 0,\n\t\tcolSpanCount = 1,\n\t\tprevCell,\n\t\tvAlign;\n\t// Match a single cell\n\tcellRegExp.lastIndex = this.parser.pos;\n\tvar cellMatch = cellRegExp.exec(this.parser.source);\n\twhile(cellMatch && cellMatch.index === this.parser.pos) {\n\t\tif(cellMatch[1] === \"~\") {\n\t\t\t// Rowspan\n\t\t\tvar last = prevColumns[col];\n\t\t\tif(last) {\n\t\t\t\tlast.rowSpanCount++;\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"rowspan\",last.rowSpanCount);\n\t\t\t\tvAlign = $tw.utils.getAttributeValueFromParseTreeNode(last.element,\"valign\",\"center\");\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"valign\",vAlign);\n\t\t\t\tif(colSpanCount > 1) {\n\t\t\t\t\t$tw.utils.addAttributeToParseTreeNode(last.element,\"colspan\",colSpanCount);\n\t\t\t\t\tcolSpanCount = 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \">\") {\n\t\t\t// Colspan\n\t\t\tcolSpanCount++;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[1] === \"<\" && prevCell) {\n\t\t\tcolSpanCount = 1 + $tw.utils.getAttributeValueFromParseTreeNode(prevCell,\"colspan\",1);\n\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\tcolSpanCount = 1;\n\t\t\t// Move to just before the `|` terminating the cell\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t} else if(cellMatch[2]) {\n\t\t\t// End of row\n\t\t\tif(prevCell && colSpanCount > 1) {\n\t\t\t\tif(prevCell.attributes && prevCell.attributes && prevCell.attributes.colspan) {\n\t\t\t\t\t\tcolSpanCount += prevCell.attributes.colspan.value;\n\t\t\t\t} else {\n\t\t\t\t\tcolSpanCount -= 1;\n\t\t\t\t}\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(prevCell,\"colspan\",colSpanCount);\n\t\t\t}\n\t\t\tthis.parser.pos = cellRegExp.lastIndex - 1;\n\t\t\tbreak;\n\t\t} else {\n\t\t\t// For ordinary cells, step beyond the opening `|`\n\t\t\tthis.parser.pos++;\n\t\t\t// Look for a space at the start of the cell\n\t\t\tvar spaceLeft = false;\n\t\t\tvAlign = null;\n\t\t\tif(this.parser.source.substr(this.parser.pos).search(/^\\^([^\\^]|\\^\\^)/) === 0) {\n\t\t\t\tvAlign = \"top\";\n\t\t\t} else if(this.parser.source.substr(this.parser.pos).search(/^,([^,]|,,)/) === 0) {\n\t\t\t\tvAlign = \"bottom\";\n\t\t\t}\n\t\t\tif(vAlign) {\n\t\t\t\tthis.parser.pos++;\n\t\t\t}\n\t\t\tvar chr = this.parser.source.substr(this.parser.pos,1);\n\t\t\twhile(chr === \" \") {\n\t\t\t\tspaceLeft = true;\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tchr = this.parser.source.substr(this.parser.pos,1);\n\t\t\t}\n\t\t\t// Check whether this is a heading cell\n\t\t\tvar cell;\n\t\t\tif(chr === \"!\") {\n\t\t\t\tthis.parser.pos++;\n\t\t\t\tcell = {type: \"element\", tag: \"th\", children: []};\n\t\t\t} else {\n\t\t\t\tcell = {type: \"element\", tag: \"td\", children: []};\n\t\t\t}\n\t\t\ttree.push(cell);\n\t\t\t// Record information about this cell\n\t\t\tprevCell = cell;\n\t\t\tprevColumns[col] = {rowSpanCount:1,element:cell};\n\t\t\t// Check for a colspan\n\t\t\tif(colSpanCount > 1) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"colspan\",colSpanCount);\n\t\t\t\tcolSpanCount = 1;\n\t\t\t}\n\t\t\t// Parse the cell\n\t\t\tcell.children = this.parser.parseInlineRun(cellTermRegExp,{eatTerminator: true});\n\t\t\t// Set the alignment for the cell\n\t\t\tif(vAlign) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"valign\",vAlign);\n\t\t\t}\n\t\t\tif(this.parser.source.substr(this.parser.pos - 2,1) === \" \") { // spaceRight\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",spaceLeft ? \"center\" : \"left\");\n\t\t\t} else if(spaceLeft) {\n\t\t\t\t$tw.utils.addAttributeToParseTreeNode(cell,\"align\",\"right\");\n\t\t\t}\n\t\t\t// Move back to the closing `|`\n\t\t\tthis.parser.pos--;\n\t\t}\n\t\tcol++;\n\t\tcellRegExp.lastIndex = this.parser.pos;\n\t\tcellMatch = cellRegExp.exec(this.parser.source);\n\t}\n\treturn tree;\n};\n\nexports.parse = function() {\n\tvar rowContainerTypes = {\"c\":\"caption\", \"h\":\"thead\", \"\":\"tbody\", \"f\":\"tfoot\"},\n\t\ttable = {type: \"element\", tag: \"table\", children: []},\n\t\trowRegExp = /^\\|([^\\n]*)\\|([fhck]?)\\r?(?:\\n|$)/mg,\n\t\trowTermRegExp = /(\\|(?:[fhck]?)\\r?(?:\\n|$))/mg,\n\t\tprevColumns = [],\n\t\tcurrRowType,\n\t\trowContainer,\n\t\trowCount = 0;\n\t// Match the row\n\trowRegExp.lastIndex = this.parser.pos;\n\tvar rowMatch = rowRegExp.exec(this.parser.source);\n\twhile(rowMatch && rowMatch.index === this.parser.pos) {\n\t\tvar rowType = rowMatch[2];\n\t\t// Check if it is a class assignment\n\t\tif(rowType === \"k\") {\n\t\t\t$tw.utils.addClassToParseTreeNode(table,rowMatch[1]);\n\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t} else {\n\t\t\t// Otherwise, create a new row if this one is of a different type\n\t\t\tif(rowType !== currRowType) {\n\t\t\t\trowContainer = {type: \"element\", tag: rowContainerTypes[rowType], children: []};\n\t\t\t\ttable.children.push(rowContainer);\n\t\t\t\tcurrRowType = rowType;\n\t\t\t}\n\t\t\t// Is this a caption row?\n\t\t\tif(currRowType === \"c\") {\n\t\t\t\t// If so, move past the opening `|` of the row\n\t\t\t\tthis.parser.pos++;\n\t\t\t\t// Move the caption to the first row if it isn't already\n\t\t\t\tif(table.children.length !== 1) {\n\t\t\t\t\ttable.children.pop(); // Take rowContainer out of the children array\n\t\t\t\t\ttable.children.splice(0,0,rowContainer); // Insert it at the bottom\t\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t// Set the alignment - TODO: figure out why TW did this\n//\t\t\t\trowContainer.attributes.align = rowCount === 0 ? \"top\" : \"bottom\";\n\t\t\t\t// Parse the caption\n\t\t\t\trowContainer.children = this.parser.parseInlineRun(rowTermRegExp,{eatTerminator: true});\n\t\t\t} else {\n\t\t\t\t// Create the row\n\t\t\t\tvar theRow = {type: \"element\", tag: \"tr\", children: []};\n\t\t\t\t$tw.utils.addClassToParseTreeNode(theRow,rowCount%2 ? \"oddRow\" : \"evenRow\");\n\t\t\t\trowContainer.children.push(theRow);\n\t\t\t\t// Process the row\n\t\t\t\ttheRow.children = processRow.call(this,prevColumns);\n\t\t\t\tthis.parser.pos = rowMatch.index + rowMatch[0].length;\n\t\t\t\t// Increment the row count\n\t\t\t\trowCount++;\n\t\t\t}\n\t\t}\n\t\trowMatch = rowRegExp.exec(this.parser.source);\n\t}\n\treturn [table];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for block-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}(?:\\r?\\n|$)/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {},\n\t\t\tisBlock: true\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tisBlock: true,\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/transcludeinline.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/transcludeinline.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/transcludeinline.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for inline-level transclusion. For example:\n\n```\n{{MyTiddler}}\n{{MyTiddler||TemplateTitle}}\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"transcludeinline\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\{\\{([^\\{\\}\\|]*)(?:\\|\\|([^\\|\\{\\}]+))?\\}\\}/mg;\n};\n\nexports.parse = function() {\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Get the match details\n\tvar template = $tw.utils.trim(this.match[2]),\n\t\ttextRef = $tw.utils.trim(this.match[1]);\n\t// Prepare the transclude widget\n\tvar transcludeNode = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {}\n\t\t};\n\t// Prepare the tiddler widget\n\tvar tr, targetTitle, targetField, targetIndex, tiddlerNode;\n\tif(textRef) {\n\t\ttr = $tw.utils.parseTextReference(textRef);\n\t\ttargetTitle = tr.title;\n\t\ttargetField = tr.field;\n\t\ttargetIndex = tr.index;\n\t\ttiddlerNode = {\n\t\t\ttype: \"tiddler\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: targetTitle}\n\t\t\t},\n\t\t\tchildren: [transcludeNode]\n\t\t};\n\t}\n\tif(template) {\n\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: template};\n\t\tif(textRef) {\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t} else {\n\t\tif(textRef) {\n\t\t\ttranscludeNode.attributes.tiddler = {type: \"string\", value: targetTitle};\n\t\t\tif(targetField) {\n\t\t\t\ttranscludeNode.attributes.field = {type: \"string\", value: targetField};\n\t\t\t}\n\t\t\tif(targetIndex) {\n\t\t\t\ttranscludeNode.attributes.index = {type: \"string\", value: targetIndex};\n\t\t\t}\n\t\t\treturn [tiddlerNode];\n\t\t} else {\n\t\t\treturn [transcludeNode];\n\t\t}\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/typedblock.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/typedblock.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/typedblock.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text rule for typed blocks. For example:\n\n```\n$$$.js\nThis will be rendered as JavaScript\n$$$\n\n$$$.svg\n<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"150\" height=\"100\">\n <circle cx=\"100\" cy=\"50\" r=\"40\" stroke=\"black\" stroke-width=\"2\" fill=\"red\" />\n</svg>\n$$$\n\n$$$text/vnd.tiddlywiki>text/html\nThis will be rendered as an //HTML representation// of WikiText\n$$$\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.name = \"typedblock\";\nexports.types = {block: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /\\$\\$\\$([^ >\\r\\n]*)(?: *> *([^ \\r\\n]+))?\\r?\\n/mg;\n};\n\nexports.parse = function() {\n\tvar reEnd = /\\r?\\n\\$\\$\\$\\r?(?:\\n|$)/mg;\n\t// Save the type\n\tvar parseType = this.match[1],\n\t\trenderType = this.match[2];\n\t// Move past the match\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Look for the end of the block\n\treEnd.lastIndex = this.parser.pos;\n\tvar match = reEnd.exec(this.parser.source),\n\t\ttext;\n\t// Process the block\n\tif(match) {\n\t\ttext = this.parser.source.substring(this.parser.pos,match.index);\n\t\tthis.parser.pos = match.index + match[0].length;\n\t} else {\n\t\ttext = this.parser.source.substr(this.parser.pos);\n\t\tthis.parser.pos = this.parser.sourceLength;\n\t}\n\t// Parse the block according to the specified type\n\tvar parser = this.parser.wiki.parseText(parseType,text,{defaultType: \"text/plain\"});\n\t// If there's no render type, just return the parse tree\n\tif(!renderType) {\n\t\treturn parser.tree;\n\t} else {\n\t\t// Otherwise, render to the rendertype and return in a <PRE> tag\n\t\tvar widgetNode = this.parser.wiki.makeWidget(parser),\n\t\t\tcontainer = $tw.fakeDocument.createElement(\"div\");\n\t\twidgetNode.render(container,null);\n\t\ttext = renderType === \"text/html\" ? container.innerHTML : container.textContent;\n\t\treturn [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"pre\",\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: text\n\t\t\t}]\n\t\t}];\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/whitespace.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/whitespace.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/whitespace.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki pragma rule for whitespace specifications\n\n```\n\\whitespace trim\n\\whitespace notrim\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"whitespace\";\nexports.types = {pragma: true};\n\n/*\nInstantiate parse rule\n*/\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = /^\\\\whitespace[^\\S\\n]/mg;\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\tvar self = this;\n\t// Move past the pragma invocation\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// Parse whitespace delimited tokens terminated by a line break\n\tvar reMatch = /[^\\S\\n]*(\\S+)|(\\r?\\n)/mg,\n\t\ttokens = [];\n\treMatch.lastIndex = this.parser.pos;\n\tvar match = reMatch.exec(this.parser.source);\n\twhile(match && match.index === this.parser.pos) {\n\t\tthis.parser.pos = reMatch.lastIndex;\n\t\t// Exit if we've got the line break\n\t\tif(match[2]) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the token\n\t\tif(match[1]) {\n\t\t\ttokens.push(match[1]);\n\t\t}\n\t\t// Match the next token\n\t\tmatch = reMatch.exec(this.parser.source);\n\t}\n\t// Process the tokens\n\t$tw.utils.each(tokens,function(token) {\n\t\tswitch(token) {\n\t\t\tcase \"trim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = true;\n\t\t\t\tbreak;\n\t\t\tcase \"notrim\":\n\t\t\t\tself.parser.configTrimWhiteSpace = false;\n\t\t\t\tbreak;\n\t\t}\n\t});\n\t// No parse tree nodes to return\n\treturn [];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/rules/wikilink.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/wikilink.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikilink.js\ntype: application/javascript\nmodule-type: wikirule\n\nWiki text inline rule for wiki links. For example:\n\n```\nAWikiLink\nAnotherLink\n~SuppressedLink\n```\n\nPrecede a camel case word with `~` to prevent it from being recognised as a link.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.name = \"wikilink\";\nexports.types = {inline: true};\n\nexports.init = function(parser) {\n\tthis.parser = parser;\n\t// Regexp to match\n\tthis.matchRegExp = new RegExp($tw.config.textPrimitives.unWikiLink + \"?\" + $tw.config.textPrimitives.wikiLink,\"mg\");\n};\n\n/*\nParse the most recent match\n*/\nexports.parse = function() {\n\t// Get the details of the match\n\tvar linkText = this.match[0];\n\t// Move past the macro call\n\tthis.parser.pos = this.matchRegExp.lastIndex;\n\t// If the link starts with the unwikilink character then just output it as plain text\n\tif(linkText.substr(0,1) === $tw.config.textPrimitives.unWikiLink) {\n\t\treturn [{type: \"text\", text: linkText.substr(1)}];\n\t}\n\t// If the link has been preceded with a blocked letter then don't treat it as a link\n\tif(this.match.index > 0) {\n\t\tvar preRegExp = new RegExp($tw.config.textPrimitives.blockPrefixLetters,\"mg\");\n\t\tpreRegExp.lastIndex = this.match.index-1;\n\t\tvar preMatch = preRegExp.exec(this.parser.source);\n\t\tif(preMatch && preMatch.index === this.match.index-1) {\n\t\t\treturn [{type: \"text\", text: linkText}];\n\t\t}\n\t}\n\treturn [{\n\t\ttype: \"link\",\n\t\tattributes: {\n\t\t\tto: {type: \"string\", value: linkText}\n\t\t},\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\ttext: linkText\n\t\t}]\n\t}];\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "wikirule"
},
"$:/core/modules/parsers/wikiparser/wikiparser.js": {
"title": "$:/core/modules/parsers/wikiparser/wikiparser.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/wikiparser.js\ntype: application/javascript\nmodule-type: parser\n\nThe wiki text parser processes blocks of source text into a parse tree.\n\nThe parse tree is made up of nested arrays of these JavaScript objects:\n\n\t{type: \"element\", tag: <string>, attributes: {}, children: []} - an HTML element\n\t{type: \"text\", text: <string>} - a text node\n\t{type: \"entity\", value: <string>} - an entity\n\t{type: \"raw\", html: <string>} - raw HTML\n\nAttributes are stored as hashmaps of the following objects:\n\n\t{type: \"string\", value: <string>} - literal string\n\t{type: \"indirect\", textReference: <textReference>} - indirect through a text reference\n\t{type: \"macro\", macro: <TBD>} - indirect through a macro invocation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar WikiParser = function(type,text,options) {\n\tthis.wiki = options.wiki;\n\tvar self = this;\n\t// Check for an externally linked tiddler\n\tif($tw.browser && (text || \"\") === \"\" && options._canonical_uri) {\n\t\tthis.loadRemoteTiddler(options._canonical_uri);\n\t\ttext = $tw.language.getRawString(\"LazyLoadingWarning\");\n\t}\n\t// Initialise the classes if we don't have them already\n\tif(!this.pragmaRuleClasses) {\n\t\tWikiParser.prototype.pragmaRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"pragma\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.pragmaRuleClasses,\"$:/config/WikiParserRules/Pragmas/\");\n\t}\n\tif(!this.blockRuleClasses) {\n\t\tWikiParser.prototype.blockRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"block\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.blockRuleClasses,\"$:/config/WikiParserRules/Block/\");\n\t}\n\tif(!this.inlineRuleClasses) {\n\t\tWikiParser.prototype.inlineRuleClasses = $tw.modules.createClassesFromModules(\"wikirule\",\"inline\",$tw.WikiRuleBase);\n\t\tthis.setupRules(WikiParser.prototype.inlineRuleClasses,\"$:/config/WikiParserRules/Inline/\");\n\t}\n\t// Save the parse text\n\tthis.type = type || \"text/vnd.tiddlywiki\";\n\tthis.source = text || \"\";\n\tthis.sourceLength = this.source.length;\n\t// Flag for ignoring whitespace\n\tthis.configTrimWhiteSpace = false;\n\t// Set current parse position\n\tthis.pos = 0;\n\t// Instantiate the pragma parse rules\n\tthis.pragmaRules = this.instantiateRules(this.pragmaRuleClasses,\"pragma\",0);\n\t// Instantiate the parser block and inline rules\n\tthis.blockRules = this.instantiateRules(this.blockRuleClasses,\"block\",0);\n\tthis.inlineRules = this.instantiateRules(this.inlineRuleClasses,\"inline\",0);\n\t// Parse any pragmas\n\tthis.tree = [];\n\tvar topBranch = this.parsePragmas();\n\t// Parse the text into inline runs or blocks\n\tif(options.parseAsInline) {\n\t\ttopBranch.push.apply(topBranch,this.parseInlineRun());\n\t} else {\n\t\ttopBranch.push.apply(topBranch,this.parseBlocks());\n\t}\n\t// Return the parse tree\n};\n\n/*\n*/\nWikiParser.prototype.loadRemoteTiddler = function(url) {\n\tvar self = this;\n\t$tw.utils.httpRequest({\n\t\turl: url,\n\t\ttype: \"GET\",\n\t\tcallback: function(err,data) {\n\t\t\tif(!err) {\n\t\t\t\tvar tiddlers = self.wiki.deserializeTiddlers(\".tid\",data,self.wiki.getCreationFields());\n\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\ttiddler[\"_canonical_uri\"] = url;\n\t\t\t\t});\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tself.wiki.addTiddlers(tiddlers);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\n*/\nWikiParser.prototype.setupRules = function(proto,configPrefix) {\n\tvar self = this;\n\tif(!$tw.safemode) {\n\t\t$tw.utils.each(proto,function(object,name) {\n\t\t\tif(self.wiki.getTiddlerText(configPrefix + name,\"enable\") !== \"enable\") {\n\t\t\t\tdelete proto[name];\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nInstantiate an array of parse rules\n*/\nWikiParser.prototype.instantiateRules = function(classes,type,startPos) {\n\tvar rulesInfo = [],\n\t\tself = this;\n\t$tw.utils.each(classes,function(RuleClass) {\n\t\t// Instantiate the rule\n\t\tvar rule = new RuleClass(self);\n\t\trule.is = {};\n\t\trule.is[type] = true;\n\t\trule.init(self);\n\t\tvar matchIndex = rule.findNextMatch(startPos);\n\t\tif(matchIndex !== undefined) {\n\t\t\trulesInfo.push({\n\t\t\t\trule: rule,\n\t\t\t\tmatchIndex: matchIndex\n\t\t\t});\n\t\t}\n\t});\n\treturn rulesInfo;\n};\n\n/*\nSkip any whitespace at the current position. Options are:\n\ttreatNewlinesAsNonWhitespace: true if newlines are NOT to be treated as whitespace\n*/\nWikiParser.prototype.skipWhitespace = function(options) {\n\toptions = options || {};\n\tvar whitespaceRegExp = options.treatNewlinesAsNonWhitespace ? /([^\\S\\n]+)/mg : /(\\s+)/mg;\n\twhitespaceRegExp.lastIndex = this.pos;\n\tvar whitespaceMatch = whitespaceRegExp.exec(this.source);\n\tif(whitespaceMatch && whitespaceMatch.index === this.pos) {\n\t\tthis.pos = whitespaceRegExp.lastIndex;\n\t}\n};\n\n/*\nGet the next match out of an array of parse rule instances\n*/\nWikiParser.prototype.findNextMatch = function(rules,startPos) {\n\t// Find the best matching rule by finding the closest match position\n\tvar matchingRule,\n\t\tmatchingRulePos = this.sourceLength;\n\t// Step through each rule\n\tfor(var t=0; t<rules.length; t++) {\n\t\tvar ruleInfo = rules[t];\n\t\t// Ask the rule to get the next match if we've moved past the current one\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex < startPos) {\n\t\t\truleInfo.matchIndex = ruleInfo.rule.findNextMatch(startPos);\n\t\t}\n\t\t// Adopt this match if it's closer than the current best match\n\t\tif(ruleInfo.matchIndex !== undefined && ruleInfo.matchIndex <= matchingRulePos) {\n\t\t\tmatchingRule = ruleInfo;\n\t\t\tmatchingRulePos = ruleInfo.matchIndex;\n\t\t}\n\t}\n\treturn matchingRule;\n};\n\n/*\nParse any pragmas at the beginning of a block of parse text\n*/\nWikiParser.prototype.parsePragmas = function() {\n\tvar currentTreeBranch = this.tree;\n\twhile(true) {\n\t\t// Skip whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check for the end of the text\n\t\tif(this.pos >= this.sourceLength) {\n\t\t\tbreak;\n\t\t}\n\t\t// Check if we've arrived at a pragma rule match\n\t\tvar nextMatch = this.findNextMatch(this.pragmaRules,this.pos);\n\t\t// If not, just exit\n\t\tif(!nextMatch || nextMatch.matchIndex !== this.pos) {\n\t\t\tbreak;\n\t\t}\n\t\t// Process the pragma rule\n\t\tvar subTree = nextMatch.rule.parse();\n\t\tif(subTree.length > 0) {\n\t\t\t// Quick hack; we only cope with a single parse tree node being returned, which is true at the moment\n\t\t\tcurrentTreeBranch.push.apply(currentTreeBranch,subTree);\n\t\t\tsubTree[0].children = [];\n\t\t\tcurrentTreeBranch = subTree[0].children;\n\t\t}\n\t}\n\treturn currentTreeBranch;\n};\n\n/*\nParse a block from the current position\n\tterminatorRegExpString: optional regular expression string that identifies the end of plain paragraphs. Must not include capturing parenthesis\n*/\nWikiParser.prototype.parseBlock = function(terminatorRegExpString) {\n\tvar terminatorRegExp = terminatorRegExpString ? new RegExp(\"(\" + terminatorRegExpString + \"|\\\\r?\\\\n\\\\r?\\\\n)\",\"mg\") : /(\\r?\\n\\r?\\n)/mg;\n\tthis.skipWhitespace();\n\tif(this.pos >= this.sourceLength) {\n\t\treturn [];\n\t}\n\t// Look for a block rule that applies at the current position\n\tvar nextMatch = this.findNextMatch(this.blockRules,this.pos);\n\tif(nextMatch && nextMatch.matchIndex === this.pos) {\n\t\treturn nextMatch.rule.parse();\n\t}\n\t// Treat it as a paragraph if we didn't find a block rule\n\treturn [{type: \"element\", tag: \"p\", children: this.parseInlineRun(terminatorRegExp)}];\n};\n\n/*\nParse a series of blocks of text until a terminating regexp is encountered or the end of the text\n\tterminatorRegExpString: terminating regular expression\n*/\nWikiParser.prototype.parseBlocks = function(terminatorRegExpString) {\n\tif(terminatorRegExpString) {\n\t\treturn this.parseBlocksTerminated(terminatorRegExpString);\n\t} else {\n\t\treturn this.parseBlocksUnterminated();\n\t}\n};\n\n/*\nParse a block from the current position to the end of the text\n*/\nWikiParser.prototype.parseBlocksUnterminated = function() {\n\tvar tree = [];\n\twhile(this.pos < this.sourceLength) {\n\t\ttree.push.apply(tree,this.parseBlock());\n\t}\n\treturn tree;\n};\n\n/*\nParse blocks of text until a terminating regexp is encountered\n*/\nWikiParser.prototype.parseBlocksTerminated = function(terminatorRegExpString) {\n\tvar terminatorRegExp = new RegExp(\"(\" + terminatorRegExpString + \")\",\"mg\"),\n\t\ttree = [];\n\t// Skip any whitespace\n\tthis.skipWhitespace();\n\t// Check if we've got the end marker\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar match = terminatorRegExp.exec(this.source);\n\t// Parse the text into blocks\n\twhile(this.pos < this.sourceLength && !(match && match.index === this.pos)) {\n\t\tvar blocks = this.parseBlock(terminatorRegExpString);\n\t\ttree.push.apply(tree,blocks);\n\t\t// Skip any whitespace\n\t\tthis.skipWhitespace();\n\t\t// Check if we've got the end marker\n\t\tterminatorRegExp.lastIndex = this.pos;\n\t\tmatch = terminatorRegExp.exec(this.source);\n\t}\n\tif(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t}\n\treturn tree;\n};\n\n/*\nParse a run of text at the current position\n\tterminatorRegExp: a regexp at which to stop the run\n\toptions: see below\nOptions available:\n\teatTerminator: move the parse position past any encountered terminator (default false)\n*/\nWikiParser.prototype.parseInlineRun = function(terminatorRegExp,options) {\n\tif(terminatorRegExp) {\n\t\treturn this.parseInlineRunTerminated(terminatorRegExp,options);\n\t} else {\n\t\treturn this.parseInlineRunUnterminated(options);\n\t}\n};\n\nWikiParser.prototype.parseInlineRunUnterminated = function(options) {\n\tvar tree = [];\n\t// Find the next occurrence of an inline rule\n\tvar nextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around the matches until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && nextMatch) {\n\t\t// Process the text preceding the run rule\n\t\tif(nextMatch.matchIndex > this.pos) {\n\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,nextMatch.matchIndex));\n\t\t\tthis.pos = nextMatch.matchIndex;\n\t\t}\n\t\t// Process the run rule\n\t\ttree.push.apply(tree,nextMatch.rule.parse());\n\t\t// Look for the next run rule\n\t\tnextMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\nWikiParser.prototype.parseInlineRunTerminated = function(terminatorRegExp,options) {\n\toptions = options || {};\n\tvar tree = [];\n\t// Find the next occurrence of the terminator\n\tterminatorRegExp.lastIndex = this.pos;\n\tvar terminatorMatch = terminatorRegExp.exec(this.source);\n\t// Find the next occurrence of a inlinerule\n\tvar inlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t// Loop around until we've reached the end of the text\n\twhile(this.pos < this.sourceLength && (terminatorMatch || inlineRuleMatch)) {\n\t\t// Return if we've found the terminator, and it precedes any inline rule match\n\t\tif(terminatorMatch) {\n\t\t\tif(!inlineRuleMatch || inlineRuleMatch.matchIndex >= terminatorMatch.index) {\n\t\t\t\tif(terminatorMatch.index > this.pos) {\n\t\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,terminatorMatch.index));\n\t\t\t\t}\n\t\t\t\tthis.pos = terminatorMatch.index;\n\t\t\t\tif(options.eatTerminator) {\n\t\t\t\t\tthis.pos += terminatorMatch[0].length;\n\t\t\t\t}\n\t\t\t\treturn tree;\n\t\t\t}\n\t\t}\n\t\t// Process any inline rule, along with the text preceding it\n\t\tif(inlineRuleMatch) {\n\t\t\t// Preceding text\n\t\t\tif(inlineRuleMatch.matchIndex > this.pos) {\n\t\t\t\tthis.pushTextWidget(tree,this.source.substring(this.pos,inlineRuleMatch.matchIndex));\n\t\t\t\tthis.pos = inlineRuleMatch.matchIndex;\n\t\t\t}\n\t\t\t// Process the inline rule\n\t\t\ttree.push.apply(tree,inlineRuleMatch.rule.parse());\n\t\t\t// Look for the next inline rule\n\t\t\tinlineRuleMatch = this.findNextMatch(this.inlineRules,this.pos);\n\t\t\t// Look for the next terminator match\n\t\t\tterminatorRegExp.lastIndex = this.pos;\n\t\t\tterminatorMatch = terminatorRegExp.exec(this.source);\n\t\t}\n\t}\n\t// Process the remaining text\n\tif(this.pos < this.sourceLength) {\n\t\tthis.pushTextWidget(tree,this.source.substr(this.pos));\n\t}\n\tthis.pos = this.sourceLength;\n\treturn tree;\n};\n\n/*\nPush a text widget onto an array, respecting the configTrimWhiteSpace setting\n*/\nWikiParser.prototype.pushTextWidget = function(array,text) {\n\tif(this.configTrimWhiteSpace) {\n\t\ttext = $tw.utils.trim(text);\n\t}\n\tif(text) {\n\t\tarray.push({type: \"text\", text: text});\t\t\n\t}\n};\n\n/*\nParse zero or more class specifiers `.classname`\n*/\nWikiParser.prototype.parseClasses = function() {\n\tvar classRegExp = /\\.([^\\s\\.]+)/mg,\n\t\tclassNames = [];\n\tclassRegExp.lastIndex = this.pos;\n\tvar match = classRegExp.exec(this.source);\n\twhile(match && match.index === this.pos) {\n\t\tthis.pos = match.index + match[0].length;\n\t\tclassNames.push(match[1]);\n\t\tmatch = classRegExp.exec(this.source);\n\t}\n\treturn classNames;\n};\n\n/*\nAmend the rules used by this instance of the parser\n\ttype: `only` keeps just the named rules, `except` keeps all but the named rules\n\tnames: array of rule names\n*/\nWikiParser.prototype.amendRules = function(type,names) {\n\tnames = names || [];\n\t// Define the filter function\n\tvar target;\n\tif(type === \"only\") {\n\t\ttarget = true;\n\t} else if(type === \"except\") {\n\t\ttarget = false;\n\t} else {\n\t\treturn;\n\t}\n\t// Define a function to process each of our rule arrays\n\tvar processRuleArray = function(ruleArray) {\n\t\tfor(var t=ruleArray.length-1; t>=0; t--) {\n\t\t\tif((names.indexOf(ruleArray[t].rule.name) === -1) === target) {\n\t\t\t\truleArray.splice(t,1);\n\t\t\t}\n\t\t}\n\t};\n\t// Process each rule array\n\tprocessRuleArray(this.pragmaRules);\n\tprocessRuleArray(this.blockRules);\n\tprocessRuleArray(this.inlineRules);\n};\n\nexports[\"text/vnd.tiddlywiki\"] = WikiParser;\n\n})();\n\n",
"type": "application/javascript",
"module-type": "parser"
},
"$:/core/modules/parsers/wikiparser/rules/wikirulebase.js": {
"title": "$:/core/modules/parsers/wikiparser/rules/wikirulebase.js",
"text": "/*\\\ntitle: $:/core/modules/parsers/wikiparser/rules/wikirulebase.js\ntype: application/javascript\nmodule-type: global\n\nBase class for wiki parser rules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nThis constructor is always overridden with a blank constructor, and so shouldn't be used\n*/\nvar WikiRuleBase = function() {\n};\n\n/*\nTo be overridden by individual rules\n*/\nWikiRuleBase.prototype.init = function(parser) {\n\tthis.parser = parser;\n};\n\n/*\nDefault implementation of findNextMatch uses RegExp matching\n*/\nWikiRuleBase.prototype.findNextMatch = function(startPos) {\n\tthis.matchRegExp.lastIndex = startPos;\n\tthis.match = this.matchRegExp.exec(this.parser.source);\n\treturn this.match ? this.match.index : undefined;\n};\n\nexports.WikiRuleBase = WikiRuleBase;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/pluginswitcher.js": {
"title": "$:/core/modules/pluginswitcher.js",
"text": "/*\\\ntitle: $:/core/modules/pluginswitcher.js\ntype: application/javascript\nmodule-type: global\n\nManages switching plugins for themes and languages.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\noptions:\nwiki: wiki store to be used\npluginType: type of plugin to be switched\ncontrollerTitle: title of tiddler used to control switching of this resource\ndefaultPlugins: array of default plugins to be used if nominated plugin isn't found\nonSwitch: callback when plugin is switched (single parameter is array of plugin titles)\n*/\nfunction PluginSwitcher(options) {\n\tthis.wiki = options.wiki;\n\tthis.pluginType = options.pluginType;\n\tthis.controllerTitle = options.controllerTitle;\n\tthis.defaultPlugins = options.defaultPlugins || [];\n\tthis.onSwitch = options.onSwitch;\n\t// Switch to the current plugin\n\tthis.switchPlugins();\n\t// Listen for changes to the selected plugin\n\tvar self = this;\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,self.controllerTitle)) {\n\t\t\tself.switchPlugins();\n\t\t}\n\t});\n}\n\nPluginSwitcher.prototype.switchPlugins = function() {\n\t// Get the name of the current theme\n\tvar selectedPluginTitle = this.wiki.getTiddlerText(this.controllerTitle);\n\t// If it doesn't exist, then fallback to one of the default themes\n\tvar index = 0;\n\twhile(!this.wiki.getTiddler(selectedPluginTitle) && index < this.defaultPlugins.length) {\n\t\tselectedPluginTitle = this.defaultPlugins[index++];\n\t}\n\t// Accumulate the titles of the plugins that we need to load\n\tvar plugins = [],\n\t\tself = this,\n\t\taccumulatePlugin = function(title) {\n\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\tif(tiddler && tiddler.isPlugin() && plugins.indexOf(title) === -1) {\n\t\t\t\tplugins.push(title);\n\t\t\t\tvar pluginInfo = JSON.parse(self.wiki.getTiddlerText(title)),\n\t\t\t\t\tdependents = $tw.utils.parseStringArray(tiddler.fields.dependents || \"\");\n\t\t\t\t$tw.utils.each(dependents,function(title) {\n\t\t\t\t\taccumulatePlugin(title);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\taccumulatePlugin(selectedPluginTitle);\n\t// Read the plugin info for the incoming plugins\n\tvar changes = $tw.wiki.readPluginInfo(plugins);\n\t// Unregister any existing theme tiddlers\n\tvar unregisteredTiddlers = $tw.wiki.unregisterPluginTiddlers(this.pluginType);\n\t// Register any new theme tiddlers\n\tvar registeredTiddlers = $tw.wiki.registerPluginTiddlers(this.pluginType,plugins);\n\t// Unpack the current theme tiddlers\n\t$tw.wiki.unpackPluginTiddlers();\n\t// Call the switch handler\n\tif(this.onSwitch) {\n\t\tthis.onSwitch(plugins);\n\t}\n};\n\nexports.PluginSwitcher = PluginSwitcher;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/saver-handler.js": {
"title": "$:/core/modules/saver-handler.js",
"text": "/*\\\ntitle: $:/core/modules/saver-handler.js\ntype: application/javascript\nmodule-type: global\n\nThe saver handler tracks changes to the store and handles saving the entire wiki via saver modules.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nInstantiate the saver handler with the following options:\nwiki: wiki to be synced\ndirtyTracking: true if dirty tracking should be performed\n*/\nfunction SaverHandler(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\tthis.dirtyTracking = options.dirtyTracking;\n\tthis.preloadDirty = options.preloadDirty || [];\n\tthis.pendingAutoSave = false;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"saver-handler\");\n\t// Initialise our savers\n\tif($tw.browser) {\n\t\tthis.initSavers();\n\t}\n\t// Only do dirty tracking if required\n\tif($tw.browser && this.dirtyTracking) {\n\t\t// Compile the dirty tiddler filter\n\t\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t\t// Count of changes that have not yet been saved\n\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(self.preloadDirty,function(title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t});\n\t\tthis.numChanges = filteredChanges.length;\n\t\t// Listen out for changes to tiddlers\n\t\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t\t// Filter the changes so that we only count changes to tiddlers that we care about\n\t\t\tvar filteredChanges = self.filterFn.call(self.wiki,function(iterator) {\n\t\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\t\t\t\titerator(tiddler,title);\n\t\t\t\t});\n\t\t\t});\n\t\t\t// Adjust the number of changes\n\t\t\tself.numChanges += filteredChanges.length;\n\t\t\tself.updateDirtyStatus();\n\t\t\t// Do any autosave if one is pending and there's no more change events\n\t\t\tif(self.pendingAutoSave && self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.pendingAutoSave = false;\n\t\t\t}\n\t\t});\n\t\t// Listen for the autosave event\n\t\t$tw.rootWidget.addEventListener(\"tm-auto-save-wiki\",function(event) {\n\t\t\t// Do the autosave unless there are outstanding tiddler change events\n\t\t\tif(self.wiki.getSizeOfTiddlerEventQueue() === 0) {\n\t\t\t\t// Check if we're dirty\n\t\t\t\tif(self.numChanges > 0) {\n\t\t\t\t\tself.saveWiki({\n\t\t\t\t\t\tmethod: \"autosave\",\n\t\t\t\t\t\tdownloadType: \"text/plain\"\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Otherwise put ourselves in the \"pending autosave\" state and wait for the change event before we do the autosave\n\t\t\t\tself.pendingAutoSave = true;\n\t\t\t}\n\t\t});\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t}\n\t// Install the save action handlers\n\tif($tw.browser) {\n\t\t$tw.rootWidget.addEventListener(\"tm-save-wiki\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-download-file\",function(event) {\n\t\t\tself.saveWiki({\n\t\t\t\tmethod: \"download\",\n\t\t\t\ttemplate: event.param,\n\t\t\t\tdownloadType: \"text/plain\",\n\t\t\t\tvariables: event.paramObject\n\t\t\t});\n\t\t});\n\t}\n}\n\nSaverHandler.prototype.titleSyncFilter = \"$:/config/SaverFilter\";\nSaverHandler.prototype.titleAutoSave = \"$:/config/AutoSave\";\nSaverHandler.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\n\n/*\nSelect the appropriate saver modules and set them up\n*/\nSaverHandler.prototype.initSavers = function(moduleType) {\n\tmoduleType = moduleType || \"saver\";\n\t// Instantiate the available savers\n\tthis.savers = [];\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(moduleType,function(title,module) {\n\t\tif(module.canSave(self)) {\n\t\t\tself.savers.push(module.create(self.wiki));\n\t\t}\n\t});\n\t// Sort the savers into priority order\n\tthis.savers.sort(function(a,b) {\n\t\tif(a.info.priority < b.info.priority) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(a.info.priority > b.info.priority) {\n\t\t\t\treturn +1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nSave the wiki contents. Options are:\n\tmethod: \"save\", \"autosave\" or \"download\"\n\ttemplate: the tiddler containing the template to save\n\tdownloadType: the content type for the saved file\n*/\nSaverHandler.prototype.saveWiki = function(options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tmethod = options.method || \"save\";\n\t// Ignore autosave if disabled\n\tif(method === \"autosave\" && ($tw.config.disableAutoSave || this.wiki.getTiddlerText(this.titleAutoSave,\"yes\") !== \"yes\")) {\n\t\treturn false;\n\t}\n\tvar\tvariables = options.variables || {},\n\t\ttemplate = options.template || \"$:/core/save/all\",\n\t\tdownloadType = options.downloadType || \"text/plain\",\n\t\ttext = this.wiki.renderTiddler(downloadType,template,options),\n\t\tcallback = function(err) {\n\t\t\tif(err) {\n\t\t\t\talert($tw.language.getString(\"Error/WhileSaving\") + \":\\n\\n\" + err);\n\t\t\t} else {\n\t\t\t\t// Clear the task queue if we're saving (rather than downloading)\n\t\t\t\tif(method !== \"download\") {\n\t\t\t\t\tself.numChanges = 0;\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t}\n\t\t\t\t$tw.notifier.display(self.titleSavedNotification);\n\t\t\t\tif(options.callback) {\n\t\t\t\t\toptions.callback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t// Call the highest priority saver that supports this method\n\tfor(var t=this.savers.length-1; t>=0; t--) {\n\t\tvar saver = this.savers[t];\n\t\tif(saver.info.capabilities.indexOf(method) !== -1 && saver.save(text,method,callback,{variables: {filename: variables.filename}})) {\n\t\t\tthis.logger.log(\"Saving wiki with method\",method,\"through saver\",saver.info.name);\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSaverHandler.prototype.isDirty = function() {\n\treturn this.numChanges > 0;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSaverHandler.prototype.updateDirtyStatus = function() {\n\tvar self = this;\n\tif($tw.browser) {\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",this.isDirty());\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\t$tw.utils.toggleClass(win.document.body,\"tc-dirty\",self.isDirty());\n\t\t});\n\t}\n};\n\nexports.SaverHandler = SaverHandler;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/savers/andtidwiki.js": {
"title": "$:/core/modules/savers/andtidwiki.js",
"text": "/*\\\ntitle: $:/core/modules/savers/andtidwiki.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the AndTidWiki Android app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar AndTidWiki = function(wiki) {\n};\n\nAndTidWiki.prototype.save = function(text,method,callback,options) {\n\tvar filename = options && options.variables ? options.variables.filename : null;\n\tif (method === \"download\") {\n\t\t// Support download\n\t\tif (window.twi.saveDownload) {\n\t\t\ttry {\n\t\t\t\twindow.twi.saveDownload(text,filename);\n\t\t\t} catch(err) {\n\t\t\t\tif (err.message === \"Method not found\") {\n\t\t\t\t\twindow.twi.saveDownload(text);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tvar link = document.createElement(\"a\");\n\t\t\tlink.setAttribute(\"href\",\"data:text/plain,\" + encodeURIComponent(text));\n\t\t\tif (filename) {\n\t\t\t link.setAttribute(\"download\",filename);\n\t\t\t}\n\t\t\tdocument.body.appendChild(link);\n\t\t\tlink.click();\n\t\t\tdocument.body.removeChild(link);\n\t\t}\n\t} else if (window.twi.saveWiki) {\n\t\t// Direct save in Tiddloid\n\t\twindow.twi.saveWiki(text);\n\t} else {\n\t\t// Get the pathname of this document\n\t\tvar pathname = decodeURIComponent(document.location.toString().split(\"#\")[0]);\n\t\t// Strip the file://\n\t\tif(pathname.indexOf(\"file://\") === 0) {\n\t\t\tpathname = pathname.substr(7);\n\t\t}\n\t\t// Strip any query or location part\n\t\tvar p = pathname.indexOf(\"?\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\tp = pathname.indexOf(\"#\");\n\t\tif(p !== -1) {\n\t\t\tpathname = pathname.substr(0,p);\n\t\t}\n\t\t// Save the file\n\t\twindow.twi.saveFile(pathname,text);\n\t}\n\t// Call the callback\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nAndTidWiki.prototype.info = {\n\tname: \"andtidwiki\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.twi && !!window.twi.saveFile;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new AndTidWiki(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/beaker.js": {
"title": "$:/core/modules/savers/beaker.js",
"text": "/*\\\ntitle: $:/core/modules/savers/beaker.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Beaker browser's (https://beakerbrowser.com) Dat protocol (https://datproject.org/)\nCompatible with beaker >= V0.7.2\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar BeakerSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nBeakerSaver.prototype.save = function(text,method,callback) {\n\tvar dat = new DatArchive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Beaker Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Beaker Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nBeakerSaver.prototype.info = {\n\tname: \"beaker\",\n\tpriority: 3000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.DatArchive && location.protocol===\"dat:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new BeakerSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/custom.js": {
"title": "$:/core/modules/savers/custom.js",
"text": "/*\\\ntitle: $:/core/modules/savers/custom.js\ntype: application/javascript\nmodule-type: saver\n\nLooks for `window.$tw.customSaver` first on the current window, then\non the parent window (of an iframe). If present, the saver must define\n\tsave: function(text,method,callback) { ... }\nand the saver may define\n\tpriority: number\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar findSaver = function(window) {\n\ttry {\n\t\treturn window && window.$tw && window.$tw.customSaver;\n\t} catch (err) {\n\t\t// Catching the exception is the most reliable way to detect cross-origin iframe errors.\n\t\t// For example, instead of saying that `window.parent.$tw` is undefined, Firefox will throw\n\t\t// Uncaught DOMException: Permission denied to access property \"$tw\" on cross-origin object\n\t\tconsole.log({ msg: \"custom saver is disabled\", reason: err });\n\t\treturn null;\n\t}\n}\nvar saver = findSaver(window) || findSaver(window.parent) || {};\n\nvar CustomSaver = function(wiki) {\n};\n\nCustomSaver.prototype.save = function(text,method,callback) {\n\treturn saver.save(text, method, callback);\n};\n\n/*\nInformation about this saver\n*/\nCustomSaver.prototype.info = {\n\tname: \"custom\",\n\tpriority: saver.priority || 4000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!(saver.save);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new CustomSaver(wiki);\n};\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/download.js": {
"title": "$:/core/modules/savers/download.js",
"text": "/*\\\ntitle: $:/core/modules/savers/download.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar DownloadSaver = function(wiki) {\n};\n\nDownloadSaver.prototype.save = function(text,method,callback,options) {\n\toptions = options || {};\n\t// Get the current filename\n\tvar filename = options.variables.filename;\n\tif(!filename) {\n\t\tvar p = document.location.pathname.lastIndexOf(\"/\");\n\t\tif(p !== -1) {\n\t\t\t// We decode the pathname because document.location is URL encoded by the browser\n\t\t\tfilename = decodeURIComponent(document.location.pathname.substr(p+1));\n\t\t}\n\t}\n\tif(!filename) {\n\t\tfilename = \"tiddlywiki.html\";\n\t}\n\t// Set up the link\n\tvar link = document.createElement(\"a\");\n\tif(Blob !== undefined) {\n\t\tvar blob = new Blob([text], {type: \"text/html\"});\n\t\tlink.setAttribute(\"href\", URL.createObjectURL(blob));\n\t} else {\n\t\tlink.setAttribute(\"href\",\"data:text/html,\" + encodeURIComponent(text));\n\t}\n\tlink.setAttribute(\"download\",filename);\n\tdocument.body.appendChild(link);\n\tlink.click();\n\tdocument.body.removeChild(link);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nDownloadSaver.prototype.info = {\n\tname: \"download\",\n\tpriority: 100\n};\n\nObject.defineProperty(DownloadSaver.prototype.info, \"capabilities\", {\n\tget: function() {\n\t\tvar capabilities = [\"save\", \"download\"];\n\t\tif(($tw.wiki.getTextReference(\"$:/config/DownloadSaver/AutoSave\") || \"\").toLowerCase() === \"yes\") {\n\t\t\tcapabilities.push(\"autosave\");\n\t\t}\n\t\treturn capabilities;\n\t}\n});\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn document.createElement(\"a\").download !== undefined;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new DownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/fsosaver.js": {
"title": "$:/core/modules/savers/fsosaver.js",
"text": "/*\\\ntitle: $:/core/modules/savers/fsosaver.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via MS FileSystemObject ActiveXObject\n\nNote: Since TiddlyWiki's markup contains the MOTW, the FileSystemObject normally won't be available. \nHowever, if the wiki is loaded as an .HTA file (Windows HTML Applications) then the FSO can be used.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar FSOSaver = function(wiki) {\n};\n\nFSOSaver.prototype.save = function(text,method,callback) {\n\t// Get the pathname of this document\n\tvar pathname = unescape(document.location.pathname);\n\t// Test for a Windows path of the form /x:\\blah...\n\tif(/^\\/[A-Z]\\:\\\\[^\\\\]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t} else if(document.location.hostname !== \"\" && /^\\/\\\\[^\\\\]+\\\\[^\\\\]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t// Remove the leading slash\n\t\tpathname = pathname.substr(1);\n\t\t// reconstruct UNC path\n\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t} else {\n\t\treturn false;\n\t}\n\t// Save the file (as UTF-16)\n\tvar fso = new ActiveXObject(\"Scripting.FileSystemObject\");\n\tvar file = fso.OpenTextFile(pathname,2,-1,-1);\n\tfile.Write(text);\n\tfile.Close();\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nFSOSaver.prototype.info = {\n\tname: \"FSOSaver\",\n\tpriority: 120,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\ttry {\n\t\treturn (window.location.protocol === \"file:\") && !!(new ActiveXObject(\"Scripting.FileSystemObject\"));\n\t} catch(e) { return false; }\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new FSOSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/gitea.js": {
"title": "$:/core/modules/savers/gitea.js",
"text": "/*\\\ntitle: $:/core/modules/savers/gitea.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the gitea\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GiteaSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGiteaSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/Gitea/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"Gitea\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/Gitea/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/Gitea/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/Gitea/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/Gitea/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/Gitea/ServerURL\") || \"https://gitea\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"token \" + password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar use_put = true;\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(sha === \"\"){\n\t\t\t\t\tuse_put = false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: endpoint + \"/repos/\" + repo + \"/branches/\" + branch,\n\t\t\t\ttype: \"GET\",\n\t\t\t\theaders: headers,\n\t\t\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\t\t\tif(xhr.status === 404) {\n\t\t\t\t\t\tcallback(\"Please ensure the branch in the Gitea repo exists\");\n\t\t\t\t\t}else{\n\t\t\t\t\t\tdata[\"branch\"] = branch;\n\t\t\t\t\t\tself.upload(uri + filename, use_put?\"PUT\":\"POST\", headers, data, callback);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\nGiteaSaver.prototype.upload = function(uri,method,headers,data,callback) {\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: method,\n\t\theaders: headers,\n\t\tdata: JSON.stringify(data),\n\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\tcallback(null);\n\t\t}\n\t});\n};\n\n/*\nInformation about this saver\n*/\nGiteaSaver.prototype.info = {\n\tname: \"Gitea\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GiteaSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/github.js": {
"title": "$:/core/modules/savers/github.js",
"text": "/*\\\ntitle: $:/core/modules/savers/github.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitHub v3 REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitHubSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitHubSaver.prototype.save = function(text,method,callback) {\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitHub/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"github\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitHub/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitHub/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitHub/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitHub/Branch\") || \"main\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitHub/ServerURL\") || \"https://api.github.com\",\n\t\theaders = {\n\t\t\t\"Accept\": \"application/vnd.github.v3+json\",\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Authorization\": \"Basic \" + window.btoa(username + \":\" + password),\n\t\t\t\"If-None-Match\": \"\"\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/repos/\" + repo + \"/contents\" + path;\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tdata: {\n\t\t\tref: branch\n\t\t},\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tmessage: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: $tw.utils.base64Encode(text),\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a PUT request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + filename,\n\t\t\t\ttype: \"PUT\",\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitHubSaver.prototype.info = {\n\tname: \"github\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitHubSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/gitlab.js": {
"title": "$:/core/modules/savers/gitlab.js",
"text": "/*\\\ntitle: $:/core/modules/savers/gitlab.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by pushing a commit to the GitLab REST API\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: true */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar GitLabSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nGitLabSaver.prototype.save = function(text,method,callback) {\n\t/* See https://docs.gitlab.com/ee/api/repository_files.html */\n\tvar self = this,\n\t\tusername = this.wiki.getTiddlerText(\"$:/GitLab/Username\"),\n\t\tpassword = $tw.utils.getPassword(\"gitlab\"),\n\t\trepo = this.wiki.getTiddlerText(\"$:/GitLab/Repo\"),\n\t\tpath = this.wiki.getTiddlerText(\"$:/GitLab/Path\",\"\"),\n\t\tfilename = this.wiki.getTiddlerText(\"$:/GitLab/Filename\"),\n\t\tbranch = this.wiki.getTiddlerText(\"$:/GitLab/Branch\") || \"master\",\n\t\tendpoint = this.wiki.getTiddlerText(\"$:/GitLab/ServerURL\") || \"https://gitlab.com/api/v4\",\n\t\theaders = {\n\t\t\t\"Content-Type\": \"application/json;charset=UTF-8\",\n\t\t\t\"Private-Token\": password\n\t\t};\n\t// Bail if we don't have everything we need\n\tif(!username || !password || !repo || !filename) {\n\t\treturn false;\n\t}\n\t// Make sure the path start and ends with a slash\n\tif(path.substring(0,1) !== \"/\") {\n\t\tpath = \"/\" + path;\n\t}\n\tif(path.substring(path.length - 1) !== \"/\") {\n\t\tpath = path + \"/\";\n\t}\n\t// Compose the base URI\n\tvar uri = endpoint + \"/projects/\" + encodeURIComponent(repo) + \"/repository/\";\n\t// Perform a get request to get the details (inc shas) of files in the same path as our file\n\t$tw.utils.httpRequest({\n\t\turl: uri + \"tree/?path=\" + encodeURIComponent(path.replace(/^\\/+|\\/$/g, '')) + \"&branch=\" + encodeURIComponent(branch.replace(/^\\/+|\\/$/g, '')),\n\t\ttype: \"GET\",\n\t\theaders: headers,\n\t\tcallback: function(err,getResponseDataJson,xhr) {\n\t\t\tvar getResponseData,sha = \"\";\n\t\t\tif(err && xhr.status !== 404) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tvar requestType = \"POST\";\n\t\t\tif(xhr.status !== 404) {\n\t\t\t\tgetResponseData = JSON.parse(getResponseDataJson);\n\t\t\t\t$tw.utils.each(getResponseData,function(details) {\n\t\t\t\t\tif(details.name === filename) {\n\t\t\t\t\t\trequestType = \"PUT\";\n\t\t\t\t\t\tsha = details.sha;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\tvar data = {\n\t\t\t\tcommit_message: $tw.language.getRawString(\"ControlPanel/Saving/GitService/CommitMessage\"),\n\t\t\t\tcontent: text,\n\t\t\t\tbranch: branch,\n\t\t\t\tsha: sha\n\t\t\t};\n\t\t\t// Perform a request to save the file\n\t\t\t$tw.utils.httpRequest({\n\t\t\t\turl: uri + \"files/\" + encodeURIComponent(path.replace(/^\\/+/, '') + filename),\n\t\t\t\ttype: requestType,\n\t\t\t\theaders: headers,\n\t\t\t\tdata: JSON.stringify(data),\n\t\t\t\tcallback: function(err,putResponseDataJson,xhr) {\n\t\t\t\t\tif(err) {\n\t\t\t\t\t\treturn callback(err);\n\t\t\t\t\t}\n\t\t\t\t\tvar putResponseData = JSON.parse(putResponseDataJson);\n\t\t\t\t\tcallback(null);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nGitLabSaver.prototype.info = {\n\tname: \"gitlab\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new GitLabSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/hyperdrive.js": {
"title": "$:/core/modules/savers/hyperdrive.js",
"text": "/*\\\ntitle: $:/core/modules/savers/hyperdrive.js\ntype: application/javascript\nmodule-type: saver\n\nSaves files using the Hyperdrive Protocol (https://hypercore-protocol.org/#hyperdrive) Beaker browser beta-1.0 and later (https://beakerbrowser.com)\nCompatible with beaker >= V1.0.0\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet up the saver\n*/\nvar HyperdriveSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nHyperdriveSaver.prototype.save = function(text,method,callback) {\n\tvar dat = beaker.hyperdrive.drive(\"\" + window.location),\n\t\tpathname = (\"\" + window.location.pathname).split(\"#\")[0];\n\tdat.stat(pathname).then(function(value) {\n\t\tif(value.isDirectory()) {\n\t\t\tpathname = pathname + \"/index.html\";\n\t\t}\n\t\tdat.writeFile(pathname,text,\"utf8\").then(function(value) {\n\t\t\tcallback(null);\n\t\t},function(reason) {\n\t\t\tcallback(\"Hyperdrive Saver Write Error: \" + reason);\n\t\t});\n\t},function(reason) {\n\t\tcallback(\"Hyperdrive Saver Stat Error: \" + reason);\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nHyperdriveSaver.prototype.info = {\n\tname: \"beaker-1.x\",\n\tpriority: 3000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.beaker && !!beaker.hyperdrive && location.protocol===\"hyper:\";\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new HyperdriveSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/manualdownload.js": {
"title": "$:/core/modules/savers/manualdownload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/manualdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via HTML5's download APIs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Title of the tiddler containing the download message\nvar downloadInstructionsTitle = \"$:/language/Modals/Download\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar ManualDownloadSaver = function(wiki) {\n};\n\nManualDownloadSaver.prototype.save = function(text,method,callback) {\n\t$tw.modal.display(downloadInstructionsTitle,{\n\t\tdownloadLink: \"data:text/html,\" + encodeURIComponent(text)\n\t});\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nManualDownloadSaver.prototype.info = {\n\tname: \"manualdownload\",\n\tpriority: 0,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new ManualDownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/msdownload.js": {
"title": "$:/core/modules/savers/msdownload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/msdownload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via window.navigator.msSaveBlob()\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar MsDownloadSaver = function(wiki) {\n};\n\nMsDownloadSaver.prototype.save = function(text,method,callback) {\n\t// Get the current filename\n\tvar filename = \"tiddlywiki.html\",\n\t\tp = document.location.pathname.lastIndexOf(\"/\");\n\tif(p !== -1) {\n\t\tfilename = document.location.pathname.substr(p+1);\n\t}\n\t// Set up the link\n\tvar blob = new Blob([text], {type: \"text/html\"});\n\twindow.navigator.msSaveBlob(blob,filename);\n\t// Callback that we succeeded\n\tcallback(null);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nMsDownloadSaver.prototype.info = {\n\tname: \"msdownload\",\n\tpriority: 110,\n\tcapabilities: [\"save\", \"download\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn !!window.navigator.msSaveBlob;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new MsDownloadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/put.js": {
"title": "$:/core/modules/savers/put.js",
"text": "/*\\\ntitle: $:/core/modules/savers/put.js\ntype: application/javascript\nmodule-type: saver\n\nSaves wiki by performing a PUT request to the server\n\nWorks with any server which accepts a PUT request\nto the current URL, such as a WebDAV server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRetrieve ETag if available\n*/\nvar retrieveETag = function(self) {\n\tvar headers = {\n\t\tAccept: \"*/*;charset=UTF-8\"\n\t};\n\t$tw.utils.httpRequest({\n\t\turl: self.uri(),\n\t\ttype: \"HEAD\",\n\t\theaders: headers,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar etag = xhr.getResponseHeader(\"ETag\");\n\t\t\tif(!etag) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tself.etag = etag.replace(/^W\\//,\"\");\n\t\t}\n\t});\n};\n\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar PutSaver = function(wiki) {\n\tthis.wiki = wiki;\n\tvar self = this;\n\tvar uri = this.uri();\n\t// Async server probe. Until probe finishes, save will fail fast\n\t// See also https://github.com/Jermolene/TiddlyWiki5/issues/2276\n\t$tw.utils.httpRequest({\n\t\turl: uri,\n\t\ttype: \"OPTIONS\",\n\t\tcallback: function(err,data,xhr) {\n\t\t\t// Check DAV header http://www.webdav.org/specs/rfc2518.html#rfc.section.9.1\n\t\t\tif(!err) {\n\t\t\t\tself.serverAcceptsPuts = xhr.status === 200 && !!xhr.getResponseHeader(\"dav\");\n\t\t\t}\n\t\t}\n\t});\n\tretrieveETag(this);\n};\n\nPutSaver.prototype.uri = function() {\n\treturn document.location.toString().split(\"#\")[0];\n};\n\n// TODO: in case of edit conflict\n// Prompt: Do you want to save over this? Y/N\n// Merging would be ideal, and may be possible using future generic merge flow\nPutSaver.prototype.save = function(text,method,callback) {\n\tif(!this.serverAcceptsPuts) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tvar headers = {\n\t\t\"Content-Type\": \"text/html;charset=UTF-8\"\n\t};\n\tif(this.etag) {\n\t\theaders[\"If-Match\"] = this.etag;\n\t}\n\t$tw.utils.httpRequest({\n\t\turl: this.uri(),\n\t\ttype: \"PUT\",\n\t\theaders: headers,\n\t\tdata: text,\n\t\tcallback: function(err,data,xhr) {\n\t\t\tif(err) {\n\t\t\t\t// response is textual: \"XMLHttpRequest error code: 412\"\n\t\t\t\tvar status = Number(err.substring(err.indexOf(':') + 2, err.length))\n\t\t\t\tif(status === 412) { // edit conflict\n\t\t\t\t\tvar message = $tw.language.getString(\"Error/EditConflict\");\n\t\t\t\t\tcallback(message);\n\t\t\t\t} else {\n\t\t\t\t\tcallback(err); // fail\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tself.etag = xhr.getResponseHeader(\"ETag\");\n\t\t\t\tif(self.etag == null) {\n\t\t\t\t\tretrieveETag(self);\n\t\t\t\t}\n\t\t\t\tcallback(null); // success\n\t\t\t}\n\t\t}\n\t});\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nPutSaver.prototype.info = {\n\tname: \"put\",\n\tpriority: 2000,\n\tcapabilities: [\"save\",\"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn /^https?:/.test(location.protocol);\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new PutSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyfox.js": {
"title": "$:/core/modules/savers/tiddlyfox.js",
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyfox.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TiddlyFox file extension\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TiddlyFoxSaver = function(wiki) {\n};\n\nTiddlyFoxSaver.prototype.save = function(text,method,callback) {\n\tvar messageBox = document.getElementById(\"tiddlyfox-message-box\");\n\tif(messageBox) {\n\t\t// Get the pathname of this document\n\t\tvar pathname = document.location.toString().split(\"#\")[0];\n\t\t// Replace file://localhost/ with file:///\n\t\tif(pathname.indexOf(\"file://localhost/\") === 0) {\n\t\t\tpathname = \"file://\" + pathname.substr(16);\n\t\t}\n\t\t// Windows path file:///x:/blah/blah --> x:\\blah\\blah\n\t\tif(/^file\\:\\/\\/\\/[A-Z]\\:\\//i.test(pathname)) {\n\t\t\t// Remove the leading slash and convert slashes to backslashes\n\t\t\tpathname = pathname.substr(8).replace(/\\//g,\"\\\\\");\n\t\t// Firefox Windows network path file://///server/share/blah/blah --> //server/share/blah/blah\n\t\t} else if(pathname.indexOf(\"file://///\") === 0) {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(10)).replace(/\\//g,\"\\\\\");\n\t\t// Mac/Unix local path file:///path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:///\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(7));\n\t\t// Mac/Unix local path file:/path/path --> /path/path\n\t\t} else if(pathname.indexOf(\"file:/\") === 0) {\n\t\t\tpathname = unescape(pathname.substr(5));\n\t\t// Otherwise Windows networth path file://server/share/path/path --> \\\\server\\share\\path\\path\n\t\t} else {\n\t\t\tpathname = \"\\\\\\\\\" + unescape(pathname.substr(7)).replace(new RegExp(\"/\",\"g\"),\"\\\\\");\n\t\t}\n\t\t// Create the message element and put it in the message box\n\t\tvar message = document.createElement(\"div\");\n\t\tmessage.setAttribute(\"data-tiddlyfox-path\",decodeURIComponent(pathname));\n\t\tmessage.setAttribute(\"data-tiddlyfox-content\",text);\n\t\tmessageBox.appendChild(message);\n\t\t// Add an event handler for when the file has been saved\n\t\tmessage.addEventListener(\"tiddlyfox-have-saved-file\",function(event) {\n\t\t\tcallback(null);\n\t\t}, false);\n\t\t// Create and dispatch the custom event to the extension\n\t\tvar event = document.createEvent(\"Events\");\n\t\tevent.initEvent(\"tiddlyfox-save-file\",true,false);\n\t\tmessage.dispatchEvent(event);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyFoxSaver.prototype.info = {\n\tname: \"tiddlyfox\",\n\tpriority: 1500,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyFoxSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/tiddlyie.js": {
"title": "$:/core/modules/savers/tiddlyie.js",
"text": "/*\\\ntitle: $:/core/modules/savers/tiddlyie.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via Internet Explorer BHO extenion (TiddlyIE)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar TiddlyIESaver = function(wiki) {\n};\n\nTiddlyIESaver.prototype.save = function(text,method,callback) {\n\t// Check existence of TiddlyIE BHO extension (note: only works after document is complete)\n\tif(typeof(window.TiddlyIE) != \"undefined\") {\n\t\t// Get the pathname of this document\n\t\tvar pathname = unescape(document.location.pathname);\n\t\t// Test for a Windows path of the form /x:/blah...\n\t\tif(/^\\/[A-Z]\\:\\/[^\\/]+/i.test(pathname)) {\t// ie: ^/[a-z]:/[^/]+ (is this better?: ^/[a-z]:/[^/]+(/[^/]+)*\\.[^/]+ )\n\t\t\t// Remove the leading slash\n\t\t\tpathname = pathname.substr(1);\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t} else if(document.hostname !== \"\" && /^\\/[^\\/]+\\/[^\\/]+/i.test(pathname)) {\t// test for \\\\server\\share\\blah... - ^/[^/]+/[^/]+\n\t\t\t// Convert slashes to backslashes\n\t\t\tpathname = pathname.replace(/\\//g,\"\\\\\");\n\t\t\t// reconstruct UNC path\n\t\t\tpathname = \"\\\\\\\\\" + document.location.hostname + pathname;\n\t\t} else return false;\n\t\t// Prompt the user to save the file\n\t\twindow.TiddlyIE.save(pathname, text);\n\t\t// Callback that we succeeded\n\t\tcallback(null);\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nInformation about this saver\n*/\nTiddlyIESaver.prototype.info = {\n\tname: \"tiddlyiesaver\",\n\tpriority: 1500,\n\tcapabilities: [\"save\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn (window.location.protocol === \"file:\");\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TiddlyIESaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/twedit.js": {
"title": "$:/core/modules/savers/twedit.js",
"text": "/*\\\ntitle: $:/core/modules/savers/twedit.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via the TWEdit iOS app\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false, netscape: false, Components: false */\n\"use strict\";\n\nvar TWEditSaver = function(wiki) {\n};\n\nTWEditSaver.prototype.save = function(text,method,callback) {\n\t// Bail if we're not running under TWEdit\n\tif(typeof DeviceInfo !== \"object\") {\n\t\treturn false;\n\t}\n\t// Get the pathname of this document\n\tvar pathname = decodeURIComponent(document.location.pathname);\n\t// Strip any query or location part\n\tvar p = pathname.indexOf(\"?\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\tp = pathname.indexOf(\"#\");\n\tif(p !== -1) {\n\t\tpathname = pathname.substr(0,p);\n\t}\n\t// Remove the leading \"/Documents\" from path\n\tvar prefix = \"/Documents\";\n\tif(pathname.indexOf(prefix) === 0) {\n\t\tpathname = pathname.substr(prefix.length);\n\t}\n\t// Error handler\n\tvar errorHandler = function(event) {\n\t\t// Error\n\t\tcallback($tw.language.getString(\"Error/SavingToTWEdit\") + \": \" + event.target.error.code);\n\t};\n\t// Get the file system\n\twindow.requestFileSystem(LocalFileSystem.PERSISTENT,0,function(fileSystem) {\n\t\t// Now we've got the filesystem, get the fileEntry\n\t\tfileSystem.root.getFile(pathname, {create: true}, function(fileEntry) {\n\t\t\t// Now we've got the fileEntry, create the writer\n\t\t\tfileEntry.createWriter(function(writer) {\n\t\t\t\twriter.onerror = errorHandler;\n\t\t\t\twriter.onwrite = function() {\n\t\t\t\t\tcallback(null);\n\t\t\t\t};\n\t\t\t\twriter.position = 0;\n\t\t\t\twriter.write(text);\n\t\t\t},errorHandler);\n\t\t}, errorHandler);\n\t}, errorHandler);\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nTWEditSaver.prototype.info = {\n\tname: \"twedit\",\n\tpriority: 1600,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new TWEditSaver(wiki);\n};\n\n/////////////////////////// Hack\n// HACK: This ensures that TWEdit recognises us as a TiddlyWiki document\nif($tw.browser) {\n\twindow.version = {title: \"TiddlyWiki\"};\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/savers/upload.js": {
"title": "$:/core/modules/savers/upload.js",
"text": "/*\\\ntitle: $:/core/modules/savers/upload.js\ntype: application/javascript\nmodule-type: saver\n\nHandles saving changes via upload to a server.\n\nDesigned to be compatible with BidiX's UploadPlugin at http://tiddlywiki.bidix.info/#UploadPlugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSelect the appropriate saver module and set it up\n*/\nvar UploadSaver = function(wiki) {\n\tthis.wiki = wiki;\n};\n\nUploadSaver.prototype.save = function(text,method,callback) {\n\t// Get the various parameters we need\n\tvar backupDir = this.wiki.getTextReference(\"$:/UploadBackupDir\") || \".\",\n\t\tusername = this.wiki.getTextReference(\"$:/UploadName\"),\n\t\tpassword = $tw.utils.getPassword(\"upload\"),\n\t\tuploadDir = this.wiki.getTextReference(\"$:/UploadDir\") || \".\",\n\t\tuploadFilename = this.wiki.getTextReference(\"$:/UploadFilename\") || \"index.html\",\n\t\turl = this.wiki.getTextReference(\"$:/UploadURL\");\n\t// Bail out if we don't have the bits we need\n\tif(!username || username.toString().trim() === \"\" || !password || password.toString().trim() === \"\") {\n\t\treturn false;\n\t}\n\t// Construct the url if not provided\n\tif(!url) {\n\t\turl = \"http://\" + username + \".tiddlyspot.com/store.cgi\";\n\t}\n\t// Assemble the header\n\tvar boundary = \"---------------------------\" + \"AaB03x\";\t\n\tvar uploadFormName = \"UploadPlugin\";\n\tvar head = [];\n\thead.push(\"--\" + boundary + \"\\r\\nContent-disposition: form-data; name=\\\"UploadPlugin\\\"\\r\\n\");\n\thead.push(\"backupDir=\" + backupDir + \";user=\" + username + \";password=\" + password + \";uploaddir=\" + uploadDir + \";;\"); \n\thead.push(\"\\r\\n\" + \"--\" + boundary);\n\thead.push(\"Content-disposition: form-data; name=\\\"userfile\\\"; filename=\\\"\" + uploadFilename + \"\\\"\");\n\thead.push(\"Content-Type: text/html;charset=UTF-8\");\n\thead.push(\"Content-Length: \" + text.length + \"\\r\\n\");\n\thead.push(\"\");\n\t// Assemble the tail and the data itself\n\tvar tail = \"\\r\\n--\" + boundary + \"--\\r\\n\",\n\t\tdata = head.join(\"\\r\\n\") + text + tail;\n\t// Do the HTTP post\n\tvar http = new XMLHttpRequest();\n\thttp.open(\"POST\",url,true,username,password);\n\thttp.setRequestHeader(\"Content-Type\",\"multipart/form-data; charset=UTF-8; boundary=\" + boundary);\n\thttp.onreadystatechange = function() {\n\t\tif(http.readyState == 4 && http.status == 200) {\n\t\t\tif(http.responseText.substr(0,4) === \"0 - \") {\n\t\t\t\tcallback(null);\n\t\t\t} else {\n\t\t\t\tcallback(http.responseText);\n\t\t\t}\n\t\t}\n\t};\n\ttry {\n\t\thttp.send(data);\n\t} catch(ex) {\n\t\treturn callback($tw.language.getString(\"Error/Caption\") + \":\" + ex);\n\t}\n\t$tw.notifier.display(\"$:/language/Notifications/Save/Starting\");\n\treturn true;\n};\n\n/*\nInformation about this saver\n*/\nUploadSaver.prototype.info = {\n\tname: \"upload\",\n\tpriority: 2000,\n\tcapabilities: [\"save\", \"autosave\"]\n};\n\n/*\nStatic method that returns true if this saver is capable of working\n*/\nexports.canSave = function(wiki) {\n\treturn true;\n};\n\n/*\nCreate an instance of this saver\n*/\nexports.create = function(wiki) {\n\treturn new UploadSaver(wiki);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "saver"
},
"$:/core/modules/server/authenticators/basic.js": {
"title": "$:/core/modules/server/authenticators/basic.js",
"text": "/*\\\ntitle: $:/core/modules/server/authenticators/basic.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for WWW basic authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\");\n}\n\nfunction BasicAuthenticator(server) {\n\tthis.server = server;\n\tthis.credentialsData = [];\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nBasicAuthenticator.prototype.init = function() {\n\t// Read the credentials data\n\tthis.credentialsFilepath = this.server.get(\"credentials\");\n\tif(this.credentialsFilepath) {\n\t\tvar resolveCredentialsFilepath = path.resolve(this.server.boot.wikiPath,this.credentialsFilepath);\n\t\tif(fs.existsSync(resolveCredentialsFilepath) && !fs.statSync(resolveCredentialsFilepath).isDirectory()) {\n\t\t\tvar credentialsText = fs.readFileSync(resolveCredentialsFilepath,\"utf8\"),\n\t\t\t\tcredentialsData = $tw.utils.parseCsvStringWithHeader(credentialsText);\n\t\t\tif(typeof credentialsData === \"string\") {\n\t\t\t\treturn \"Error: \" + credentialsData + \" reading credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t\t} else {\n\t\t\t\tthis.credentialsData = credentialsData;\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"Error: Unable to load user credentials from '\" + resolveCredentialsFilepath + \"'\";\n\t\t}\n\t}\n\t// Add the hardcoded username and password if specified\n\tif(this.server.get(\"username\") && this.server.get(\"password\")) {\n\t\tthis.credentialsData = this.credentialsData || [];\n\t\tthis.credentialsData.push({\n\t\t\tusername: this.server.get(\"username\"),\n\t\t\tpassword: this.server.get(\"password\")\n\t\t});\n\t}\n\treturn this.credentialsData.length > 0;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nBasicAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Extract the incoming username and password from the request\n\tvar header = request.headers.authorization || \"\";\n\tif(!header && state.allowAnon) {\n\t\t// If there's no header and anonymous access is allowed then we don't set authenticatedUsername\n\t\treturn true;\n\t}\n\tvar token = header.split(/\\s+/).pop() || \"\",\n\t\tauth = $tw.utils.base64Decode(token),\n\t\tparts = auth.split(/:/),\n\t\tincomingUsername = parts[0],\n\t\tincomingPassword = parts[1];\n\t// Check that at least one of the credentials matches\n\tvar matchingCredentials = this.credentialsData.find(function(credential) {\n\t\treturn credential.username === incomingUsername && credential.password === incomingPassword;\n\t});\n\tif(matchingCredentials) {\n\t\t// If so, add the authenticated username to the request state\n\t\tstate.authenticatedUsername = incomingUsername;\n\t\treturn true;\n\t} else {\n\t\t// If not, return an authentication challenge\n\t\tresponse.writeHead(401,\"Authentication required\",{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\n\t\treturn false;\n\t}\n};\n\nexports.AuthenticatorClass = BasicAuthenticator;\n\n})();\n",
"type": "application/javascript",
"module-type": "authenticator"
},
"$:/core/modules/server/authenticators/header.js": {
"title": "$:/core/modules/server/authenticators/header.js",
"text": "/*\\\ntitle: $:/core/modules/server/authenticators/header.js\ntype: application/javascript\nmodule-type: authenticator\n\nAuthenticator for trusted header authentication\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction HeaderAuthenticator(server) {\n\tthis.server = server;\n\tthis.header = server.get(\"authenticated-user-header\") ? server.get(\"authenticated-user-header\").toLowerCase() : undefined;\n}\n\n/*\nReturns true if the authenticator is active, false if it is inactive, or a string if there is an error\n*/\nHeaderAuthenticator.prototype.init = function() {\n\treturn !!this.header;\n};\n\n/*\nReturns true if the request is authenticated and assigns the \"authenticatedUsername\" state variable.\nReturns false if the request couldn't be authenticated having sent an appropriate response to the browser\n*/\nHeaderAuthenticator.prototype.authenticateRequest = function(request,response,state) {\n\t// Otherwise, authenticate as the username in the specified header\n\tvar username = request.headers[this.header];\n\tif(!username && !state.allowAnon) {\n\t\tresponse.writeHead(401,\"Authorization header required to login to '\" + state.server.servername + \"'\");\n\t\tresponse.end();\n\t\treturn false;\n\t} else {\n\t\t// authenticatedUsername will be undefined for anonymous users\n\t\tstate.authenticatedUsername = username;\n\t\treturn true;\n\t}\n};\n\nexports.AuthenticatorClass = HeaderAuthenticator;\n\n})();\n",
"type": "application/javascript",
"module-type": "authenticator"
},
"$:/core/modules/server/routes/delete-tiddler.js": {
"title": "$:/core/modules/server/routes/delete-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/delete-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nDELETE /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"DELETE\";\n\nexports.path = /^\\/bags\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]);\n\tstate.wiki.deleteTiddler(title);\n\tresponse.writeHead(204, \"OK\", {\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-favicon.js": {
"title": "$:/core/modules/server/routes/get-favicon.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-favicon.js\ntype: application/javascript\nmodule-type: route\n\nGET /favicon.ico\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/favicon.ico$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"image/x-icon\"});\n\tvar buffer = state.wiki.getTiddlerText(\"$:/favicon.ico\",\"\");\n\tresponse.end(buffer,\"base64\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-file.js": {
"title": "$:/core/modules/server/routes/get-file.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-file.js\ntype: application/javascript\nmodule-type: route\n\nGET /files/:filepath\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/files\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar path = require(\"path\"),\n\t\tfs = require(\"fs\"),\n\t\tutil = require(\"util\"),\n\t\tsuppliedFilename = decodeURIComponent(state.params[0]),\n\t\tfilename = path.resolve(state.boot.wikiPath,\"files\",suppliedFilename),\n\t\textension = path.extname(filename);\n\tfs.readFile(filename,function(err,content) {\n\t\tvar status,content,type = \"text/plain\";\n\t\tif(err) {\n\t\t\tconsole.log(\"Error accessing file \" + filename + \": \" + err.toString());\n\t\t\tstatus = 404;\n\t\t\tcontent = \"File '\" + suppliedFilename + \"' not found\";\n\t\t} else {\n\t\t\tstatus = 200;\n\t\t\tcontent = content;\n\t\t\ttype = ($tw.config.fileExtensionInfo[extension] ? $tw.config.fileExtensionInfo[extension].type : \"application/octet-stream\");\n\t\t}\n\t\tresponse.writeHead(status,{\n\t\t\t\"Content-Type\": type\n\t\t});\n\t\tresponse.end(content);\n\t});\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-index.js": {
"title": "$:/core/modules/server/routes/get-index.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-index.js\ntype: application/javascript\nmodule-type: route\n\nGET /\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar zlib = require(\"zlib\");\n\nexports.method = \"GET\";\n\nexports.path = /^\\/$/;\n\nexports.handler = function(request,response,state) {\n\tvar acceptEncoding = request.headers[\"accept-encoding\"];\n\tif(!acceptEncoding) {\n\t\tacceptEncoding = \"\";\n\t}\n\tvar text = state.wiki.renderTiddler(state.server.get(\"root-render-type\"),state.server.get(\"root-tiddler\")),\n\t\tresponseHeaders = {\n\t\t\"Content-Type\": state.server.get(\"root-serve-type\")\n\t};\n\t/*\n\tIf the gzip=yes flag for `listen` is set, check if the user agent permits\n\tcompression. If so, compress our response. Note that we use the synchronous\n\tfunctions from zlib to stay in the imperative style. The current `Server`\n\tdoesn't depend on this, and we may just as well use the async versions.\n\t*/\n\tif(state.server.enableGzip) {\n\t\tif (/\\bdeflate\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"deflate\";\n\t\t\ttext = zlib.deflateSync(text);\n\t\t} else if (/\\bgzip\\b/.test(acceptEncoding)) {\n\t\t\tresponseHeaders[\"Content-Encoding\"] = \"gzip\";\n\t\t\ttext = zlib.gzipSync(text);\n\t\t}\n\t}\n\tresponse.writeHead(200,responseHeaders);\n\tresponse.end(text);\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-login-basic.js": {
"title": "$:/core/modules/server/routes/get-login-basic.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-login-basic.js\ntype: application/javascript\nmodule-type: route\n\nGET /login-basic -- force a Basic Authentication challenge\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/login-basic$/;\n\nexports.handler = function(request,response,state) {\n\tif(!state.authenticatedUsername) {\n\t\t// Challenge if there's no username\n\t\tresponse.writeHead(401,{\n\t\t\t\"WWW-Authenticate\": 'Basic realm=\"Please provide your username and password to login to ' + state.server.servername + '\"'\n\t\t});\n\t\tresponse.end();\t\t\n\t} else {\n\t\t// Redirect to the root wiki if login worked\n\t\tresponse.writeHead(302,{\n\t\t\tLocation: \"/\"\n\t\t});\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-status.js": {
"title": "$:/core/modules/server/routes/get-status.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-status.js\ntype: application/javascript\nmodule-type: route\n\nGET /status\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/status$/;\n\nexports.handler = function(request,response,state) {\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar text = JSON.stringify({\n\t\tusername: state.authenticatedUsername || state.server.get(\"anon-username\") || \"\",\n\t\tanonymous: !state.authenticatedUsername,\n\t\tread_only: !state.server.isAuthorized(\"writers\",state.authenticatedUsername),\n\t\tspace: {\n\t\t\trecipe: \"default\"\n\t\t},\n\t\ttiddlywiki_version: $tw.version\n\t});\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddler-html.js": {
"title": "$:/core/modules/server/routes/get-tiddler-html.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler-html.js\ntype: application/javascript\nmodule-type: route\n\nGET /:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/([^\\/]+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title);\n\tif(tiddler) {\n\t\tvar renderType = tiddler.getFieldString(\"_render_type\"),\n\t\t\trenderTemplate = tiddler.getFieldString(\"_render_template\");\n\t\t// Tiddler fields '_render_type' and '_render_template' overwrite\n\t\t// system wide settings for render type and template\n\t\tif(state.wiki.isSystemTiddler(title)) {\n\t\t\trenderType = renderType || state.server.get(\"system-tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"system-tiddler-render-template\");\n\t\t} else {\n\t\t\trenderType = renderType || state.server.get(\"tiddler-render-type\");\n\t\t\trenderTemplate = renderTemplate || state.server.get(\"tiddler-render-template\");\n\t\t}\n\t\tvar text = state.wiki.renderTiddler(renderType,renderTemplate,{parseAsInline: true, variables: {currentTiddler: title}});\n\t\t// Naughty not to set a content-type, but it's the easiest way to ensure the browser will see HTML pages as HTML, and accept plain text tiddlers as CSS or JS\n\t\tresponse.writeHead(200);\n\t\tresponse.end(text,\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddler.js": {
"title": "$:/core/modules/server/routes/get-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\t\ttiddler = state.wiki.getTiddler(title),\n\t\ttiddlerFields = {},\n\t\tknownFields = [\n\t\t\t\"bag\", \"created\", \"creator\", \"modified\", \"modifier\", \"permissions\", \"recipe\", \"revision\", \"tags\", \"text\", \"title\", \"type\", \"uri\"\n\t\t];\n\tif(tiddler) {\n\t\t$tw.utils.each(tiddler.fields,function(field,name) {\n\t\t\tvar value = tiddler.getFieldString(name);\n\t\t\tif(knownFields.indexOf(name) !== -1) {\n\t\t\t\ttiddlerFields[name] = value;\n\t\t\t} else {\n\t\t\t\ttiddlerFields.fields = tiddlerFields.fields || {};\n\t\t\t\ttiddlerFields.fields[name] = value;\n\t\t\t}\n\t\t});\n\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\ttiddlerFields.bag = \"default\";\n\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\t\tresponse.end(JSON.stringify(tiddlerFields),\"utf8\");\n\t} else {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t}\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/get-tiddlers-json.js": {
"title": "$:/core/modules/server/routes/get-tiddlers-json.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/get-tiddlers-json.js\ntype: application/javascript\nmodule-type: route\n\nGET /recipes/default/tiddlers.json?filter=<filter>\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DEFAULT_FILTER = \"[all[tiddlers]!is[system]sort[title]]\";\n\nexports.method = \"GET\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers.json$/;\n\nexports.handler = function(request,response,state) {\n\tvar filter = state.queryParameters.filter || DEFAULT_FILTER;\n\tif(state.wiki.getTiddlerText(\"$:/config/Server/AllowAllExternalFilters\") !== \"yes\") {\n\t\tif(state.wiki.getTiddlerText(\"$:/config/Server/ExternalFilters/\" + filter) !== \"yes\") {\n\t\t\tconsole.log(\"Blocked attempt to GET /recipes/default/tiddlers.json with filter: \" + filter);\n\t\t\tresponse.writeHead(403);\n\t\t\tresponse.end();\n\t\t\treturn;\n\t\t}\n\t}\n\tif(state.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"no\") {\n\t\tfilter += \"+[!is[system]]\";\n\t}\n\tvar excludeFields = (state.queryParameters.exclude || \"text\").split(\",\"),\n\t\ttitles = state.wiki.filterTiddlers(filter);\n\tresponse.writeHead(200, {\"Content-Type\": \"application/json\"});\n\tvar tiddlers = [];\n\t$tw.utils.each(titles,function(title) {\n\t\tvar tiddler = state.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tvar tiddlerFields = tiddler.getFieldStrings({exclude: excludeFields});\n\t\t\ttiddlerFields.revision = state.wiki.getChangeCount(title);\n\t\t\ttiddlerFields.type = tiddlerFields.type || \"text/vnd.tiddlywiki\";\n\t\t\ttiddlers.push(tiddlerFields);\n\t\t}\n\t});\n\tvar text = JSON.stringify(tiddlers);\n\tresponse.end(text,\"utf8\");\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/routes/put-tiddler.js": {
"title": "$:/core/modules/server/routes/put-tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/server/routes/put-tiddler.js\ntype: application/javascript\nmodule-type: route\n\nPUT /recipes/default/tiddlers/:title\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.method = \"PUT\";\n\nexports.path = /^\\/recipes\\/default\\/tiddlers\\/(.+)$/;\n\nexports.handler = function(request,response,state) {\n\tvar title = decodeURIComponent(state.params[0]),\n\tfields = JSON.parse(state.data);\n\t// Pull up any subfields in the `fields` object\n\tif(fields.fields) {\n\t\t$tw.utils.each(fields.fields,function(field,name) {\n\t\t\tfields[name] = field;\n\t\t});\n\t\tdelete fields.fields;\n\t}\n\t// Remove any revision field\n\tif(fields.revision) {\n\t\tdelete fields.revision;\n\t}\n\tstate.wiki.addTiddler(new $tw.Tiddler(state.wiki.getCreationFields(),fields,{title: title},state.wiki.getModificationFields()));\n\tvar changeCount = state.wiki.getChangeCount(title).toString();\n\tresponse.writeHead(204, \"OK\",{\n\t\tEtag: \"\\\"default/\" + encodeURIComponent(title) + \"/\" + changeCount + \":\\\"\",\n\t\t\"Content-Type\": \"text/plain\"\n\t});\n\tresponse.end();\n};\n\n}());\n",
"type": "application/javascript",
"module-type": "route"
},
"$:/core/modules/server/server.js": {
"title": "$:/core/modules/server/server.js",
"text": "/*\\\ntitle: $:/core/modules/server/server.js\ntype: application/javascript\nmodule-type: library\n\nServe tiddlers over http\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nif($tw.node) {\n\tvar util = require(\"util\"),\n\t\tfs = require(\"fs\"),\n\t\turl = require(\"url\"),\n\t\tpath = require(\"path\"),\n\t\tquerystring = require(\"querystring\");\n}\n\n/*\nA simple HTTP server with regexp-based routes\noptions: variables - optional hashmap of variables to set (a misnomer - they are really constant parameters)\n\t\t routes - optional array of routes to use\n\t\t wiki - reference to wiki object\n*/\nfunction Server(options) {\n\tvar self = this;\n\tthis.routes = options.routes || [];\n\tthis.authenticators = options.authenticators || [];\n\tthis.wiki = options.wiki;\n\tthis.boot = options.boot || $tw.boot;\n\tthis.servername = $tw.utils.transliterateToSafeASCII(this.wiki.getTiddlerText(\"$:/SiteTitle\") || \"TiddlyWiki5\");\n\t// Initialise the variables\n\tthis.variables = $tw.utils.extend({},this.defaultVariables);\n\tif(options.variables) {\n\t\tfor(var variable in options.variables) {\n\t\t\tif(options.variables[variable]) {\n\t\t\t\tthis.variables[variable] = options.variables[variable];\n\t\t\t}\n\t\t}\t\t\n\t}\n\t$tw.utils.extend({},this.defaultVariables,options.variables);\n\t// Initialise CSRF\n\tthis.csrfDisable = this.get(\"csrf-disable\") === \"yes\";\n\t// Initialize Gzip compression\n\tthis.enableGzip = this.get(\"gzip\") === \"yes\";\n\t// Initialise authorization\n\tvar authorizedUserName = (this.get(\"username\") && this.get(\"password\")) ? this.get(\"username\") : \"(anon)\";\n\tthis.authorizationPrincipals = {\n\t\treaders: (this.get(\"readers\") || authorizedUserName).split(\",\").map($tw.utils.trim),\n\t\twriters: (this.get(\"writers\") || authorizedUserName).split(\",\").map($tw.utils.trim)\n\t}\n\t// Load and initialise authenticators\n\t$tw.modules.forEachModuleOfType(\"authenticator\", function(title,authenticatorDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addAuthenticator(authenticatorDefinition.AuthenticatorClass);\n\t});\n\t// Load route handlers\n\t$tw.modules.forEachModuleOfType(\"route\", function(title,routeDefinition) {\n\t\t// console.log(\"Loading server route \" + title);\n\t\tself.addRoute(routeDefinition);\n\t});\n\t// Initialise the http vs https\n\tthis.listenOptions = null;\n\tthis.protocol = \"http\";\n\tvar tlsKeyFilepath = this.get(\"tls-key\"),\n\t\ttlsCertFilepath = this.get(\"tls-cert\");\n\tif(tlsCertFilepath && tlsKeyFilepath) {\n\t\tthis.listenOptions = {\n\t\t\tkey: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsKeyFilepath),\"utf8\"),\n\t\t\tcert: fs.readFileSync(path.resolve(this.boot.wikiPath,tlsCertFilepath),\"utf8\")\n\t\t};\n\t\tthis.protocol = \"https\";\n\t}\n\tthis.transport = require(this.protocol);\n}\n\nServer.prototype.defaultVariables = {\n\tport: \"8080\",\n\thost: \"127.0.0.1\",\n\t\"root-tiddler\": \"$:/core/save/all\",\n\t\"root-render-type\": \"text/plain\",\n\t\"root-serve-type\": \"text/html\",\n\t\"tiddler-render-type\": \"text/html\",\n\t\"tiddler-render-template\": \"$:/core/templates/server/static.tiddler.html\",\n\t\"system-tiddler-render-type\": \"text/plain\",\n\t\"system-tiddler-render-template\": \"$:/core/templates/wikified-tiddler\",\n\t\"debug-level\": \"none\",\n\t\"gzip\": \"no\"\n};\n\nServer.prototype.get = function(name) {\n\treturn this.variables[name];\n};\n\nServer.prototype.addRoute = function(route) {\n\tthis.routes.push(route);\n};\n\nServer.prototype.addAuthenticator = function(AuthenticatorClass) {\n\t// Instantiate and initialise the authenticator\n\tvar authenticator = new AuthenticatorClass(this),\n\t\tresult = authenticator.init();\n\tif(typeof result === \"string\") {\n\t\t$tw.utils.error(\"Error: \" + result);\n\t} else if(result) {\n\t\t// Only use the authenticator if it initialised successfully\n\t\tthis.authenticators.push(authenticator);\n\t}\n};\n\nServer.prototype.findMatchingRoute = function(request,state) {\n\tfor(var t=0; t<this.routes.length; t++) {\n\t\tvar potentialRoute = this.routes[t],\n\t\t\tpathRegExp = potentialRoute.path,\n\t\t\tpathname = state.urlInfo.pathname,\n\t\t\tmatch;\n\t\tif(state.pathPrefix) {\n\t\t\tif(pathname.substr(0,state.pathPrefix.length) === state.pathPrefix) {\n\t\t\t\tpathname = pathname.substr(state.pathPrefix.length) || \"/\";\n\t\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t\t} else {\n\t\t\t\tmatch = false;\n\t\t\t}\n\t\t} else {\n\t\t\tmatch = potentialRoute.path.exec(pathname);\n\t\t}\n\t\tif(match && request.method === potentialRoute.method) {\n\t\t\tstate.params = [];\n\t\t\tfor(var p=1; p<match.length; p++) {\n\t\t\t\tstate.params.push(match[p]);\n\t\t\t}\n\t\t\treturn potentialRoute;\n\t\t}\n\t}\n\treturn null;\n};\n\nServer.prototype.methodMappings = {\n\t\"GET\": \"readers\",\n\t\"OPTIONS\": \"readers\",\n\t\"HEAD\": \"readers\",\n\t\"PUT\": \"writers\",\n\t\"POST\": \"writers\",\n\t\"DELETE\": \"writers\"\n};\n\n/*\nCheck whether a given user is authorized for the specified authorizationType (\"readers\" or \"writers\"). Pass null or undefined as the username to check for anonymous access\n*/\nServer.prototype.isAuthorized = function(authorizationType,username) {\n\tvar principals = this.authorizationPrincipals[authorizationType] || [];\n\treturn principals.indexOf(\"(anon)\") !== -1 || (username && (principals.indexOf(\"(authenticated)\") !== -1 || principals.indexOf(username) !== -1));\n}\n\nServer.prototype.requestHandler = function(request,response,options) {\n\toptions = options || {};\n\t// Compose the state object\n\tvar self = this;\n\tvar state = {};\n\tstate.wiki = options.wiki || self.wiki;\n\tstate.boot = options.boot || self.boot;\n\tstate.server = self;\n\tstate.urlInfo = url.parse(request.url);\n\tstate.queryParameters = querystring.parse(state.urlInfo.query);\n\tstate.pathPrefix = options.pathPrefix || this.get(\"path-prefix\") || \"\";\n\t// Get the principals authorized to access this resource\n\tvar authorizationType = this.methodMappings[request.method] || \"readers\";\n\t// Check for the CSRF header if this is a write\n\tif(!this.csrfDisable && authorizationType === \"writers\" && request.headers[\"x-requested-with\"] !== \"TiddlyWiki\") {\n\t\tresponse.writeHead(403,\"'X-Requested-With' header required to login to '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\t\t\n\t}\n\t// Check whether anonymous access is granted\n\tstate.allowAnon = this.isAuthorized(authorizationType,null);\n\t// Authenticate with the first active authenticator\n\tif(this.authenticators.length > 0) {\n\t\tif(!this.authenticators[0].authenticateRequest(request,response,state)) {\n\t\t\t// Bail if we failed (the authenticator will have sent the response)\n\t\t\treturn;\n\t\t}\t\t\n\t}\n\t// Authorize with the authenticated username\n\tif(!this.isAuthorized(authorizationType,state.authenticatedUsername)) {\n\t\tresponse.writeHead(401,\"'\" + state.authenticatedUsername + \"' is not authorized to access '\" + this.servername + \"'\");\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Find the route that matches this path\n\tvar route = self.findMatchingRoute(request,state);\n\t// Optionally output debug info\n\tif(self.get(\"debug-level\") !== \"none\") {\n\t\tconsole.log(\"Request path:\",JSON.stringify(state.urlInfo));\n\t\tconsole.log(\"Request headers:\",JSON.stringify(request.headers));\n\t\tconsole.log(\"authenticatedUsername:\",state.authenticatedUsername);\n\t}\n\t// Return a 404 if we didn't find a route\n\tif(!route) {\n\t\tresponse.writeHead(404);\n\t\tresponse.end();\n\t\treturn;\n\t}\n\t// Receive the request body if necessary and hand off to the route handler\n\tif(route.bodyFormat === \"stream\" || request.method === \"GET\" || request.method === \"HEAD\") {\n\t\t// Let the route handle the request stream itself\n\t\troute.handler(request,response,state);\n\t} else if(route.bodyFormat === \"string\" || !route.bodyFormat) {\n\t\t// Set the encoding for the incoming request\n\t\trequest.setEncoding(\"utf8\");\n\t\tvar data = \"\";\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata += chunk.toString();\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = data;\n\t\t\troute.handler(request,response,state);\n\t\t});\n\t} else if(route.bodyFormat === \"buffer\") {\n\t\tvar data = [];\n\t\trequest.on(\"data\",function(chunk) {\n\t\t\tdata.push(chunk);\n\t\t});\n\t\trequest.on(\"end\",function() {\n\t\t\tstate.data = Buffer.concat(data);\n\t\t\troute.handler(request,response,state);\n\t\t})\n\t} else {\n\t\tresponse.writeHead(400,\"Invalid bodyFormat \" + route.bodyFormat + \" in route \" + route.method + \" \" + route.path.source);\n\t\tresponse.end();\n\t}\n};\n\n/*\nListen for requests\nport: optional port number (falls back to value of \"port\" variable)\nhost: optional host address (falls back to value of \"host\" variable)\nprefix: optional prefix (falls back to value of \"path-prefix\" variable)\n*/\nServer.prototype.listen = function(port,host,prefix) {\n\tvar self = this;\n\t// Handle defaults for port and host\n\tport = port || this.get(\"port\");\n\thost = host || this.get(\"host\");\n\tprefix = prefix || this.get(\"path-prefix\") || \"\";\n\t// Check for the port being a string and look it up as an environment variable\n\tif(parseInt(port,10).toString() !== port) {\n\t\tport = process.env[port] || 8080;\n\t}\n\t// Warn if required plugins are missing\n\tif(!this.wiki.getTiddler(\"$:/plugins/tiddlywiki/tiddlyweb\") || !this.wiki.getTiddler(\"$:/plugins/tiddlywiki/filesystem\")) {\n\t\t$tw.utils.warning(\"Warning: Plugins required for client-server operation (\\\"tiddlywiki/filesystem\\\" and \\\"tiddlywiki/tiddlyweb\\\") are missing from tiddlywiki.info file\");\n\t}\n\t// Create the server\n\tvar server;\n\tif(this.listenOptions) {\n\t\tserver = this.transport.createServer(this.listenOptions,this.requestHandler.bind(this));\n\t} else {\n\t\tserver = this.transport.createServer(this.requestHandler.bind(this));\n\t}\n\t// Display the port number after we've started listening (the port number might have been specified as zero, in which case we will get an assigned port)\n\tserver.on(\"listening\",function() {\n\t\tvar address = server.address();\n\t\t$tw.utils.log(\"Serving on \" + self.protocol + \"://\" + address.address + \":\" + address.port + prefix,\"brown/orange\");\n\t\t$tw.utils.log(\"(press ctrl-C to exit)\",\"red\");\n\t});\n\t// Listen\n\treturn server.listen(port,host);\n};\n\nexports.Server = Server;\n\n})();\n",
"type": "application/javascript",
"module-type": "library"
},
"$:/core/modules/browser-messaging.js": {
"title": "$:/core/modules/browser-messaging.js",
"text": "/*\\\ntitle: $:/core/modules/browser-messaging.js\ntype: application/javascript\nmodule-type: startup\n\nBrowser message handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"browser-messaging\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*\nLoad a specified url as an iframe and call the callback when it is loaded. If the url is already loaded then the existing iframe instance is used\n*/\nfunction loadIFrame(url,callback) {\n\t// Check if iframe already exists\n\tvar iframeInfo = $tw.browserMessaging.iframeInfoMap[url];\n\tif(iframeInfo) {\n\t\t// We've already got the iframe\n\t\tcallback(null,iframeInfo);\n\t} else {\n\t\t// Create the iframe and save it in the list\n\t\tvar iframe = document.createElement(\"iframe\");\n\t\tiframeInfo = {\n\t\t\turl: url,\n\t\t\tstatus: \"loading\",\n\t\t\tdomNode: iframe\n\t\t};\n\t\t$tw.browserMessaging.iframeInfoMap[url] = iframeInfo;\n\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t// Add the iframe to the DOM and hide it\n\t\tiframe.style.display = \"none\";\n\t\tiframe.setAttribute(\"library\",\"true\");\n\t\tdocument.body.appendChild(iframe);\n\t\t// Set up onload\n\t\tiframe.onload = function() {\n\t\t\tiframeInfo.status = \"loaded\";\n\t\t\tsaveIFrameInfoTiddler(iframeInfo);\n\t\t\tcallback(null,iframeInfo);\n\t\t};\n\t\tiframe.onerror = function() {\n\t\t\tcallback(\"Cannot load iframe\");\n\t\t};\n\t\ttry {\n\t\t\tiframe.src = url;\n\t\t} catch(ex) {\n\t\t\tcallback(ex);\n\t\t}\n\t}\n}\n\n/*\nUnload library iframe for given url\n*/\nfunction unloadIFrame(url){\n\t$tw.utils.each(document.getElementsByTagName('iframe'), function(iframe) {\n\t\tif(iframe.getAttribute(\"library\") === \"true\" &&\n\t\t iframe.getAttribute(\"src\") === url) {\n\t\t\tiframe.parentNode.removeChild(iframe);\n\t\t}\n\t});\n}\n\nfunction saveIFrameInfoTiddler(iframeInfo) {\n\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),{\n\t\ttitle: \"$:/temp/ServerConnection/\" + iframeInfo.url,\n\t\ttext: iframeInfo.status,\n\t\ttags: [\"$:/tags/ServerConnection\"],\n\t\turl: iframeInfo.url\n\t},$tw.wiki.getModificationFields()));\n}\n\nexports.startup = function() {\n\t// Initialise the store of iframes we've created\n\t$tw.browserMessaging = {\n\t\tiframeInfoMap: {} // Hashmap by URL of {url:,status:\"loading/loaded\",domNode:}\n\t};\n\t// Listen for widget messages to control loading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\tif(url) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers.json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-info\",\n\t\t\t\t\t\t\tinfoTitlePrefix: paramObject.infoTitlePrefix || \"$:/temp/RemoteAssetInfo/\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for widget messages to control unloading the plugin library\n\t$tw.rootWidget.addEventListener(\"tm-unload-plugin-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url;\n\t\t$tw.browserMessaging.iframeInfoMap[url] = undefined;\n\t\tif(url) {\n\t\t\tunloadIFrame(url);\n\t\t\t$tw.utils.each(\n\t\t\t\t$tw.wiki.filterTiddlers(\"[[$:/temp/ServerConnection/\" + url + \"]] [prefix[$:/temp/RemoteAssetInfo/\" + url + \"/]]\"),\n\t\t\t\tfunction(title) {\n\t\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-load-plugin-from-library\",function(event) {\n\t\tvar paramObject = event.paramObject || {},\n\t\t\turl = paramObject.url,\n\t\t\ttitle = paramObject.title;\n\t\tif(url && title) {\n\t\t\tloadIFrame(url,function(err,iframeInfo) {\n\t\t\t\tif(err) {\n\t\t\t\t\talert($tw.language.getString(\"Error/LoadingPluginLibrary\") + \": \" + url);\n\t\t\t\t} else {\n\t\t\t\t\tiframeInfo.domNode.contentWindow.postMessage({\n\t\t\t\t\t\tverb: \"GET\",\n\t\t\t\t\t\turl: \"recipes/library/tiddlers/\" + encodeURIComponent(title) + \".json\",\n\t\t\t\t\t\tcookies: {\n\t\t\t\t\t\t\ttype: \"save-tiddler\",\n\t\t\t\t\t\t\turl: url\n\t\t\t\t\t\t}\n\t\t\t\t\t},\"*\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n\t// Listen for window messages from other windows\n\twindow.addEventListener(\"message\",function listener(event){\n\t\t// console.log(\"browser-messaging: \",document.location.toString())\n\t\t// console.log(\"browser-messaging: Received message from\",event.origin);\n\t\t// console.log(\"browser-messaging: Message content\",event.data);\n\t\tswitch(event.data.verb) {\n\t\t\tcase \"GET-RESPONSE\":\n\t\t\t\tif(event.data.status.charAt(0) === \"2\") {\n\t\t\t\t\tif(event.data.cookies) {\n\t\t\t\t\t\tif(event.data.cookies.type === \"save-info\") {\n\t\t\t\t\t\t\tvar tiddlers = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.utils.each(tiddlers,function(tiddler) {\n\t\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler($tw.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\t\t\t\t\ttitle: event.data.cookies.infoTitlePrefix + event.data.cookies.url + \"/\" + tiddler.title,\n\t\t\t\t\t\t\t\t\t\"original-title\": tiddler.title,\n\t\t\t\t\t\t\t\t\ttext: \"\",\n\t\t\t\t\t\t\t\t\ttype: \"text/vnd.tiddlywiki\",\n\t\t\t\t\t\t\t\t\t\"original-type\": tiddler.type,\n\t\t\t\t\t\t\t\t\t\"plugin-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-plugin-type\": tiddler[\"plugin-type\"],\n\t\t\t\t\t\t\t\t\t\"module-type\": undefined,\n\t\t\t\t\t\t\t\t\t\"original-module-type\": tiddler[\"module-type\"],\n\t\t\t\t\t\t\t\t\ttags: [\"$:/tags/RemoteAssetInfo\"],\n\t\t\t\t\t\t\t\t\t\"original-tags\": $tw.utils.stringifyList(tiddler.tags || []),\n\t\t\t\t\t\t\t\t\t\"server-url\": event.data.cookies.url\n\t\t\t\t\t\t\t\t},$tw.wiki.getModificationFields()));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if(event.data.cookies.type === \"save-tiddler\") {\n\t\t\t\t\t\t\tvar tiddler = JSON.parse(event.data.body);\n\t\t\t\t\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(tiddler));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t},false);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/commands.js": {
"title": "$:/core/modules/startup/commands.js",
"text": "/*\\\ntitle: $:/core/modules/startup/commands.js\ntype: application/javascript\nmodule-type: startup\n\nCommand processing\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"commands\";\nexports.platforms = [\"node\"];\nexports.after = [\"story\"];\nexports.synchronous = false;\n\nexports.startup = function(callback) {\n\t// On the server, start a commander with the command line arguments\n\tvar commander = new $tw.Commander(\n\t\t$tw.boot.argv,\n\t\tfunction(err) {\n\t\t\tif(err) {\n\t\t\t\treturn $tw.utils.error(\"Error: \" + err);\n\t\t\t}\n\t\t\tcallback();\n\t\t},\n\t\t$tw.wiki,\n\t\t{output: process.stdout, error: process.stderr}\n\t);\n\tcommander.execute();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/CSSescape.js": {
"title": "$:/core/modules/startup/CSSescape.js",
"text": "/*\\\ntitle: $:/core/modules/startup/CSSescape.js\ntype: application/javascript\nmodule-type: startup\n\nPolyfill for CSS.escape()\n\n\\*/\n(function(root,factory){\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"css-escape\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n/*! https://mths.be/cssescape v1.5.1 by @mathias | MIT license */\n// https://github.com/umdjs/umd/blob/master/returnExports.js\nexports.startup = factory(root);\n}(typeof global != 'undefined' ? global : this, function(root) {\n\n\tif (root.CSS && root.CSS.escape) {\n\t\treturn;\n\t}\n\n\t// https://drafts.csswg.org/cssom/#serialize-an-identifier\n\tvar cssEscape = function(value) {\n\t\tif (arguments.length == 0) {\n\t\t\tthrow new TypeError('`CSS.escape` requires an argument.');\n\t\t}\n\t\tvar string = String(value);\n\t\tvar length = string.length;\n\t\tvar index = -1;\n\t\tvar codeUnit;\n\t\tvar result = '';\n\t\tvar firstCodeUnit = string.charCodeAt(0);\n\t\twhile (++index < length) {\n\t\t\tcodeUnit = string.charCodeAt(index);\n\t\t\t// Note: there’s no need to special-case astral symbols, surrogate\n\t\t\t// pairs, or lone surrogates.\n\n\t\t\t// If the character is NULL (U+0000), then the REPLACEMENT CHARACTER\n\t\t\t// (U+FFFD).\n\t\t\tif (codeUnit == 0x0000) {\n\t\t\t\tresult += '\\uFFFD';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is in the range [\\1-\\1F] (U+0001 to U+001F) or is\n\t\t\t\t// U+007F, […]\n\t\t\t\t(codeUnit >= 0x0001 && codeUnit <= 0x001F) || codeUnit == 0x007F ||\n\t\t\t\t// If the character is the first character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039), […]\n\t\t\t\t(index == 0 && codeUnit >= 0x0030 && codeUnit <= 0x0039) ||\n\t\t\t\t// If the character is the second character and is in the range [0-9]\n\t\t\t\t// (U+0030 to U+0039) and the first character is a `-` (U+002D), […]\n\t\t\t\t(\n\t\t\t\t\tindex == 1 &&\n\t\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 &&\n\t\t\t\t\tfirstCodeUnit == 0x002D\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character-as-code-point\n\t\t\t\tresult += '\\\\' + codeUnit.toString(16) + ' ';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (\n\t\t\t\t// If the character is the first character and is a `-` (U+002D), and\n\t\t\t\t// there is no second character, […]\n\t\t\t\tindex == 0 &&\n\t\t\t\tlength == 1 &&\n\t\t\t\tcodeUnit == 0x002D\n\t\t\t) {\n\t\t\t\tresult += '\\\\' + string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If the character is not handled by one of the above rules and is\n\t\t\t// greater than or equal to U+0080, is `-` (U+002D) or `_` (U+005F), or\n\t\t\t// is in one of the ranges [0-9] (U+0030 to U+0039), [A-Z] (U+0041 to\n\t\t\t// U+005A), or [a-z] (U+0061 to U+007A), […]\n\t\t\tif (\n\t\t\t\tcodeUnit >= 0x0080 ||\n\t\t\t\tcodeUnit == 0x002D ||\n\t\t\t\tcodeUnit == 0x005F ||\n\t\t\t\tcodeUnit >= 0x0030 && codeUnit <= 0x0039 ||\n\t\t\t\tcodeUnit >= 0x0041 && codeUnit <= 0x005A ||\n\t\t\t\tcodeUnit >= 0x0061 && codeUnit <= 0x007A\n\t\t\t) {\n\t\t\t\t// the character itself\n\t\t\t\tresult += string.charAt(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Otherwise, the escaped character.\n\t\t\t// https://drafts.csswg.org/cssom/#escape-a-character\n\t\t\tresult += '\\\\' + string.charAt(index);\n\n\t\t}\n\t\treturn result;\n\t};\n\n\tif (!root.CSS) {\n\t\troot.CSS = {};\n\t}\n\n\troot.CSS.escape = cssEscape;\n\n}));\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/favicon.js": {
"title": "$:/core/modules/startup/favicon.js",
"text": "/*\\\ntitle: $:/core/modules/startup/favicon.js\ntype: application/javascript\nmodule-type: startup\n\nFavicon handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"favicon\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\t\t\n// Favicon tiddler\nvar FAVICON_TITLE = \"$:/favicon.ico\";\n\nexports.startup = function() {\n\t// Set up the favicon\n\tsetFavicon();\n\t// Reset the favicon when the tiddler changes\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,FAVICON_TITLE)) {\n\t\t\tsetFavicon();\n\t\t}\n\t});\n};\n\nfunction setFavicon() {\n\tvar tiddler = $tw.wiki.getTiddler(FAVICON_TITLE);\n\tif(tiddler) {\n\t\tvar faviconLink = document.getElementById(\"faviconLink\");\n\t\tfaviconLink.setAttribute(\"href\",$tw.utils.makeDataUri(tiddler.fields.text,tiddler.fields.type,tiddler.fields._canonical_uri));\n\t}\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/info.js": {
"title": "$:/core/modules/startup/info.js",
"text": "/*\\\ntitle: $:/core/modules/startup/info.js\ntype: application/javascript\nmodule-type: startup\n\nInitialise $:/info tiddlers via $:/temp/info-plugin pseudo-plugin\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"info\";\nexports.before = [\"startup\"];\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_INFO_PLUGIN = \"$:/temp/info-plugin\";\n\nexports.startup = function() {\n\t// Function to bake the info plugin with new tiddlers\n\tvar updateInfoPlugin = function(tiddlerFieldsArray) {\n\t\t// Get the existing tiddlers\n\t\tvar json = $tw.wiki.getTiddlerData(TITLE_INFO_PLUGIN,{tiddlers: {}});\n\t\t// Add the new ones\n\t\t$tw.utils.each(tiddlerFieldsArray,function(fields) {\n\t\t\tif(fields && fields.title) {\n\t\t\t\tjson.tiddlers[fields.title] = fields;\n\t\t\t}\n\t\t});\n\t\t// Bake the info tiddlers into a plugin. We use the non-standard plugin-type \"info\" because ordinary plugins are only registered asynchronously after being loaded dynamically\n\t\tvar fields = {\n\t\t\ttitle: TITLE_INFO_PLUGIN,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"info\",\n\t\t\ttext: JSON.stringify(json,null,$tw.config.preferences.jsonSpaces)\n\t\t};\n\t\t$tw.wiki.addTiddler(new $tw.Tiddler(fields));\n\n\t};\n\t// Collect up the info tiddlers\n\tvar tiddlerFieldsArray = [];\n\t// Give each info module a chance to provide as many info tiddlers as they want as an array, and give them a callback for dynamically updating them\n\t$tw.modules.forEachModuleOfType(\"info\",function(title,moduleExports) {\n\t\tif(moduleExports && moduleExports.getInfoTiddlerFields) {\n\t\t\tArray.prototype.push.apply(tiddlerFieldsArray,moduleExports.getInfoTiddlerFields(updateInfoPlugin));\n\t\t}\n\t});\n\tupdateInfoPlugin(tiddlerFieldsArray);\n\tvar changes = $tw.wiki.readPluginInfo([TITLE_INFO_PLUGIN]);\n\t$tw.wiki.registerPluginTiddlers(\"info\",[TITLE_INFO_PLUGIN]);\n\t$tw.wiki.unpackPluginTiddlers();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/load-modules.js": {
"title": "$:/core/modules/startup/load-modules.js",
"text": "/*\\\ntitle: $:/core/modules/startup/load-modules.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"load-modules\";\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Load modules\n\t$tw.modules.applyMethods(\"utils\",$tw.utils);\n\tif($tw.node) {\n\t\t$tw.modules.applyMethods(\"utils-node\",$tw.utils);\n\t}\n\t$tw.modules.applyMethods(\"global\",$tw);\n\t$tw.modules.applyMethods(\"config\",$tw.config);\n\t$tw.Tiddler.fieldModules = $tw.modules.getModulesByTypeAsHashmap(\"tiddlerfield\");\n\t$tw.modules.applyMethods(\"tiddlermethod\",$tw.Tiddler.prototype);\n\t$tw.modules.applyMethods(\"wikimethod\",$tw.Wiki.prototype);\n\t$tw.wiki.addIndexersToWiki();\n\t$tw.modules.applyMethods(\"tiddlerdeserializer\",$tw.Wiki.tiddlerDeserializerModules);\n\t$tw.macros = $tw.modules.getModulesByTypeAsHashmap(\"macro\");\n\t$tw.wiki.initParsers();\n\t$tw.Commander.initCommands();\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/password.js": {
"title": "$:/core/modules/startup/password.js",
"text": "/*\\\ntitle: $:/core/modules/startup/password.js\ntype: application/javascript\nmodule-type: startup\n\nPassword handling\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"password\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t$tw.rootWidget.addEventListener(\"tm-set-password\",function(event) {\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: $tw.language.getString(\"Encryption/PromptSetPassword\"),\n\t\t\tnoUserName: true,\n\t\t\tsubmitText: $tw.language.getString(\"Encryption/SetPassword\"),\n\t\t\tcanCancel: true,\n\t\t\trepeatPassword: true,\n\t\t\tcallback: function(data) {\n\t\t\t\tif(data) {\n\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t}\n\t\t\t\treturn true; // Get rid of the password prompt\n\t\t\t}\n\t\t});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-clear-password\",function(event) {\n\t\tif($tw.browser) {\n\t\t\tif(!confirm($tw.language.getString(\"Encryption/ConfirmClearPassword\"))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t$tw.crypto.setPassword(null);\n\t});\n\t// Ensure that $:/isEncrypted is maintained properly\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.utils.hop(changes,\"$:/isEncrypted\")) {\n\t\t\t$tw.crypto.updateCryptoStateTiddler();\n\t\t}\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/plugins.js": {
"title": "$:/core/modules/startup/plugins.js",
"text": "/*\\\ntitle: $:/core/modules/startup/plugins.js\ntype: application/javascript\nmodule-type: startup\n\nStartup logic concerned with managing plugins\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"plugins\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\nvar TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE = \"$:/status/RequireReloadDueToPluginChange\";\n\nvar PREFIX_CONFIG_REGISTER_PLUGIN_TYPE = \"$:/config/RegisterPluginType/\";\n\nexports.startup = function() {\n\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"no\"});\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Work out which of the changed tiddlers are plugins that we need to reregister\n\t\tvar changesToProcess = [],\n\t\t\trequireReloadDueToPluginChange = false;\n\t\t$tw.utils.each(Object.keys(changes),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\t\trequiresReload = $tw.wiki.doesPluginRequireReload(title);\n\t\t\tif(requiresReload) {\n\t\t\t\trequireReloadDueToPluginChange = true;\n\t\t\t} else if(tiddler) {\n\t\t\t\tvar pluginType = tiddler.fields[\"plugin-type\"];\n\t\t\t\tif($tw.wiki.getTiddlerText(PREFIX_CONFIG_REGISTER_PLUGIN_TYPE + (tiddler.fields[\"plugin-type\"] || \"\"),\"no\") === \"yes\") {\n\t\t\t\t\tchangesToProcess.push(title);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t// Issue warning if any of the tiddlers require a reload\n\t\tif(requireReloadDueToPluginChange) {\n\t\t\t$tw.wiki.addTiddler({title: TITLE_REQUIRE_RELOAD_DUE_TO_PLUGIN_CHANGE,text: \"yes\"});\n\t\t}\n\t\t// Read or delete the plugin info of the changed tiddlers\n\t\tif(changesToProcess.length > 0) {\n\t\t\tvar changes = $tw.wiki.readPluginInfo(changesToProcess);\n\t\t\tif(changes.modifiedPlugins.length > 0 || changes.deletedPlugins.length > 0) {\n\t\t\t\tvar changedShadowTiddlers = {};\n\t\t\t\t// Collect the shadow tiddlers of any deleted plugins\n\t\t\t\t$tw.utils.each(changes.deletedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = true;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Collect the shadow tiddlers of any modified plugins\n\t\t\t\t$tw.utils.each(changes.modifiedPlugins,function(pluginTitle) {\n\t\t\t\t\tvar pluginInfo = $tw.wiki.getPluginInfo(pluginTitle);\n\t\t\t\t\tif(pluginInfo) {\n\t\t\t\t\t\t$tw.utils.each(Object.keys(pluginInfo.tiddlers),function(title) {\n\t\t\t\t\t\t\tchangedShadowTiddlers[title] = false;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// (Re-)register any modified plugins\n\t\t\t\t$tw.wiki.registerPluginTiddlers(null,changes.modifiedPlugins);\n\t\t\t\t// Unregister any deleted plugins\n\t\t\t\t$tw.wiki.unregisterPluginTiddlers(null,changes.deletedPlugins);\n\t\t\t\t// Unpack the shadow tiddlers\n\t\t\t\t$tw.wiki.unpackPluginTiddlers();\n\t\t\t\t// Queue change events for the changed shadow tiddlers\n\t\t\t\t$tw.utils.each(Object.keys(changedShadowTiddlers),function(title) {\n\t\t\t\t\t$tw.wiki.enqueueTiddlerEvent(title,changedShadowTiddlers[title]);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/render.js": {
"title": "$:/core/modules/startup/render.js",
"text": "/*\\\ntitle: $:/core/modules/startup/render.js\ntype: application/javascript\nmodule-type: startup\n\nTitle, stylesheet and page rendering\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"render\";\nexports.platforms = [\"browser\"];\nexports.after = [\"story\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar PAGE_TITLE_TITLE = \"$:/core/wiki/title\";\nvar PAGE_STYLESHEET_TITLE = \"$:/core/ui/PageStylesheet\";\nvar PAGE_TEMPLATE_TITLE = \"$:/core/ui/RootTemplate\";\n\n// Time (in ms) that we defer refreshing changes to draft tiddlers\nvar DRAFT_TIDDLER_TIMEOUT_TITLE = \"$:/config/Drafts/TypingTimeout\";\nvar THROTTLE_REFRESH_TIMEOUT = 400;\n\nexports.startup = function() {\n\t// Set up the title\n\t$tw.titleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TITLE_TITLE,{document: $tw.fakeDocument, parseAsInline: true});\n\t$tw.titleContainer = $tw.fakeDocument.createElement(\"div\");\n\t$tw.titleWidgetNode.render($tw.titleContainer,null);\n\tdocument.title = $tw.titleContainer.textContent;\n\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\tif($tw.titleWidgetNode.refresh(changes,$tw.titleContainer,null)) {\n\t\t\tdocument.title = $tw.titleContainer.textContent;\n\t\t}\n\t});\n\t// Set up the styles\n\t$tw.styleWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_STYLESHEET_TITLE,{document: $tw.fakeDocument});\n\t$tw.styleContainer = $tw.fakeDocument.createElement(\"style\");\n\t$tw.styleWidgetNode.render($tw.styleContainer,null);\n\t$tw.styleElement = document.createElement(\"style\");\n\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\tdocument.head.insertBefore($tw.styleElement,document.head.firstChild);\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"styleRefresh\",function(changes) {\n\t\tif($tw.styleWidgetNode.refresh(changes,$tw.styleContainer,null)) {\n\t\t\t$tw.styleElement.innerHTML = $tw.styleContainer.textContent;\n\t\t}\n\t}));\n\t// Display the $:/core/ui/PageTemplate tiddler to kick off the display\n\t$tw.perf.report(\"mainRender\",function() {\n\t\t$tw.pageWidgetNode = $tw.wiki.makeTranscludeWidget(PAGE_TEMPLATE_TITLE,{document: document, parentWidget: $tw.rootWidget, recursionMarker: \"no\"});\n\t\t$tw.pageContainer = document.createElement(\"div\");\n\t\t$tw.utils.addClass($tw.pageContainer,\"tc-page-container-wrapper\");\n\t\tdocument.body.insertBefore($tw.pageContainer,document.body.firstChild);\n\t\t$tw.pageWidgetNode.render($tw.pageContainer,null);\n \t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t})();\n\t// Remove any splash screen elements\n\tvar removeList = document.querySelectorAll(\".tc-remove-when-wiki-loaded\");\n\t$tw.utils.each(removeList,function(removeItem) {\n\t\tif(removeItem.parentNode) {\n\t\t\tremoveItem.parentNode.removeChild(removeItem);\n\t\t}\n\t});\n\t// Prepare refresh mechanism\n\tvar deferredChanges = Object.create(null),\n\t\ttimerId;\n\tfunction refresh() {\n\t\t// Process the refresh\n\t\t$tw.hooks.invokeHook(\"th-page-refreshing\");\n\t\t$tw.pageWidgetNode.refresh(deferredChanges);\n\t\tdeferredChanges = Object.create(null);\n\t\t$tw.hooks.invokeHook(\"th-page-refreshed\");\n\t}\n\t// Add the change event handler\n\t$tw.wiki.addEventListener(\"change\",$tw.perf.report(\"mainRefresh\",function(changes) {\n\t\t// Check if only tiddlers that are throttled have changed\n\t\tvar onlyThrottledTiddlersHaveChanged = true;\n\t\tfor(var title in changes) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(!tiddler || !(tiddler.hasField(\"draft.of\") || tiddler.hasField(\"throttle.refresh\"))) {\n\t\t\t\tonlyThrottledTiddlersHaveChanged = false;\n\t\t\t}\n\t\t}\n\t\t// Defer the change if only drafts have changed\n\t\tif(timerId) {\n\t\t\tclearTimeout(timerId);\n\t\t}\n\t\ttimerId = null;\n\t\tif(onlyThrottledTiddlersHaveChanged) {\n\t\t\tvar timeout = parseInt($tw.wiki.getTiddlerText(DRAFT_TIDDLER_TIMEOUT_TITLE,\"\"),10);\n\t\t\tif(isNaN(timeout)) {\n\t\t\t\ttimeout = THROTTLE_REFRESH_TIMEOUT;\n\t\t\t}\n\t\t\ttimerId = setTimeout(refresh,timeout);\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t} else {\n\t\t\t$tw.utils.extend(deferredChanges,changes);\n\t\t\trefresh();\n\t\t}\n\t}));\n\t// Fix up the link between the root widget and the page container\n\t$tw.rootWidget.domNodes = [$tw.pageContainer];\n\t$tw.rootWidget.children = [$tw.pageWidgetNode];\n\t// Run any post-render startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/PostRender\");\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/rootwidget.js": {
"title": "$:/core/modules/startup/rootwidget.js",
"text": "/*\\\ntitle: $:/core/modules/startup/rootwidget.js\ntype: application/javascript\nmodule-type: startup\n\nSetup the root widget and the core root widget handlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"rootwidget\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.before = [\"story\"];\nexports.synchronous = true;\n\nexports.startup = function() {\n\t// Install the modal message mechanism\n\t$tw.modal = new $tw.utils.Modal($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-modal\",function(event) {\n\t\t$tw.modal.display(event.param,{variables: event.paramObject, event: event});\n\t});\n\t$tw.rootWidget.addEventListener(\"tm-show-switcher\",function(event) {\n\t\t$tw.modal.display(\"$:/core/ui/SwitcherModal\",{variables: event.paramObject, event: event});\n\t});\t\n\t// Install the notification mechanism\n\t$tw.notifier = new $tw.utils.Notifier($tw.wiki);\n\t$tw.rootWidget.addEventListener(\"tm-notify\",function(event) {\n\t\t$tw.notifier.display(event.param,{variables: event.paramObject});\n\t});\n\t// Install the copy-to-clipboard mechanism\n\t$tw.rootWidget.addEventListener(\"tm-copy-to-clipboard\",function(event) {\n\t\t$tw.utils.copyToClipboard(event.param);\n\t});\n\t// Install the tm-focus-selector message\n\t$tw.rootWidget.addEventListener(\"tm-focus-selector\",function(event) {\n\t\tvar selector = event.param || \"\",\n\t\t\telement;\n\t\ttry {\n\t\t\telement = document.querySelector(selector);\n\t\t} catch(e) {\n\t\t\tconsole.log(\"Error in selector: \",selector)\n\t\t}\n\t\tif(element && element.focus) {\n\t\t\telement.focus(event.paramObject);\n\t\t}\n\t});\n\t// Install the scroller\n\t$tw.pageScroller = new $tw.utils.PageScroller();\n\t$tw.rootWidget.addEventListener(\"tm-scroll\",function(event) {\n\t\t$tw.pageScroller.handleEvent(event);\n\t});\n\tvar fullscreen = $tw.utils.getFullScreenApis();\n\tif(fullscreen) {\n\t\t$tw.rootWidget.addEventListener(\"tm-full-screen\",function(event) {\n\t\t\tvar fullScreenDocument = event.event ? event.event.target.ownerDocument : document;\n\t\t\tif(event.param === \"enter\") {\n\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t} else if(event.param === \"exit\") {\n\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t} else {\n\t\t\t\tif(fullScreenDocument[fullscreen._fullscreenElement]) {\n\t\t\t\t\tfullScreenDocument[fullscreen._exitFullscreen]();\n\t\t\t\t} else {\n\t\t\t\t\tfullScreenDocument.documentElement[fullscreen._requestFullscreen](Element.ALLOW_KEYBOARD_INPUT);\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t}\n\t// If we're being viewed on a data: URI then give instructions for how to save\n\tif(document.location.protocol === \"data:\") {\n\t\t$tw.rootWidget.dispatchEvent({\n\t\t\ttype: \"tm-modal\",\n\t\t\tparam: \"$:/language/Modals/SaveInstructions\"\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup.js": {
"title": "$:/core/modules/startup.js",
"text": "/*\\\ntitle: $:/core/modules/startup.js\ntype: application/javascript\nmodule-type: startup\n\nMiscellaneous startup logic for both the client and server.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"startup\";\nexports.after = [\"load-modules\"];\nexports.synchronous = true;\n\n// Set to `true` to enable performance instrumentation\nvar PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE = \"$:/config/Performance/Instrumentation\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nexports.startup = function() {\n\tvar modules,n,m,f;\n\t// Minimal browser detection\n\tif($tw.browser) {\n\t\t$tw.browser.isIE = (/msie|trident/i.test(navigator.userAgent));\n\t\t$tw.browser.isFirefox = !!document.mozFullScreenEnabled;\n\t}\n\t// Platform detection\n\t$tw.platform = {};\n\tif($tw.browser) {\n\t\t$tw.platform.isMac = /Mac/.test(navigator.platform);\n\t\t$tw.platform.isWindows = /win/i.test(navigator.platform);\n\t\t$tw.platform.isLinux = /Linux/i.test(navigator.platform);\n\t} else {\n\t\tswitch(require(\"os\").platform()) {\n\t\t\tcase \"darwin\":\n\t\t\t\t$tw.platform.isMac = true;\n\t\t\t\tbreak;\n\t\t\tcase \"win32\":\n\t\t\t\t$tw.platform.isWindows = true;\n\t\t\t\tbreak;\n\t\t\tcase \"freebsd\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t\tcase \"linux\":\n\t\t\t\t$tw.platform.isLinux = true;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\t// Initialise version\n\t$tw.version = $tw.utils.extractVersionInfo();\n\t// Set up the performance framework\n\t$tw.perf = new $tw.Performance($tw.wiki.getTiddlerText(PERFORMANCE_INSTRUMENTATION_CONFIG_TITLE,\"no\") === \"yes\");\n\t// Create a root widget for attaching event handlers. By using it as the parentWidget for another widget tree, one can reuse the event handlers\n\t$tw.rootWidget = new widget.widget({\n\t\ttype: \"widget\",\n\t\tchildren: []\n\t},{\n\t\twiki: $tw.wiki,\n\t\tdocument: $tw.browser ? document : $tw.fakeDocument\n\t});\n\t// Execute any startup actions\n\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction\");\n\tif($tw.browser) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Browser\");\t\t\n\t}\n\tif($tw.node) {\n\t\t$tw.rootWidget.invokeActionsByTag(\"$:/tags/StartupAction/Node\");\t\t\n\t}\n\t// Kick off the language manager and switcher\n\t$tw.language = new $tw.Language();\n\t$tw.languageSwitcher = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"language\",\n\t\tcontrollerTitle: \"$:/language\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/languages/en-GB\"\n\t\t],\n\t\tonSwitch: function(plugins) {\n\t\t\tif($tw.browser) {\n\t\t\t\tvar pluginTiddler = $tw.wiki.getTiddler(plugins[0]);\n\t\t\t\tif(pluginTiddler) {\n\t\t\t\t\tdocument.documentElement.setAttribute(\"dir\",pluginTiddler.getFieldString(\"text-direction\") || \"auto\");\n\t\t\t\t} else {\n\t\t\t\t\tdocument.documentElement.removeAttribute(\"dir\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\t// Kick off the theme manager\n\t$tw.themeManager = new $tw.PluginSwitcher({\n\t\twiki: $tw.wiki,\n\t\tpluginType: \"theme\",\n\t\tcontrollerTitle: \"$:/theme\",\n\t\tdefaultPlugins: [\n\t\t\t\"$:/themes/tiddlywiki/snowwhite\",\n\t\t\t\"$:/themes/tiddlywiki/vanilla\"\n\t\t]\n\t});\n\t// Kick off the keyboard manager\n\t$tw.keyboardManager = new $tw.KeyboardManager();\n\t// Listen for shortcuts\n\tif($tw.browser) {\n\t\t$tw.utils.addEventListeners(document,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t}\n\t// Clear outstanding tiddler store change events to avoid an unnecessary refresh cycle at startup\n\t$tw.wiki.clearTiddlerEventQueue();\n\t// Find a working syncadaptor\n\t$tw.syncadaptor = undefined;\n\t$tw.modules.forEachModuleOfType(\"syncadaptor\",function(title,module) {\n\t\tif(!$tw.syncadaptor && module.adaptorClass) {\n\t\t\t$tw.syncadaptor = new module.adaptorClass({wiki: $tw.wiki});\n\t\t}\n\t});\n\t// Set up the syncer object if we've got a syncadaptor\n\tif($tw.syncadaptor) {\n\t\t$tw.syncer = new $tw.Syncer({wiki: $tw.wiki, syncadaptor: $tw.syncadaptor});\n\t}\n\t// Setup the saver handler\n\t$tw.saverHandler = new $tw.SaverHandler({\n\t\twiki: $tw.wiki,\n\t\tdirtyTracking: !$tw.syncadaptor,\n\t\tpreloadDirty: $tw.boot.preloadDirty || []\n\t});\n\t// Host-specific startup\n\tif($tw.browser) {\n\t\t// Install the popup manager\n\t\t$tw.popup = new $tw.utils.Popup();\n\t\t// Install the animator\n\t\t$tw.anim = new $tw.utils.Animator();\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/story.js": {
"title": "$:/core/modules/startup/story.js",
"text": "/*\\\ntitle: $:/core/modules/startup/story.js\ntype: application/javascript\nmodule-type: startup\n\nLoad core modules\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"story\";\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Default story and history lists\nvar DEFAULT_STORY_TITLE = \"$:/StoryList\";\nvar DEFAULT_HISTORY_TITLE = \"$:/HistoryList\";\n\n// Default tiddlers\nvar DEFAULT_TIDDLERS_TITLE = \"$:/DefaultTiddlers\";\n\n// Config\nvar CONFIG_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/UpdateAddressBar\"; // Can be \"no\", \"permalink\", \"permaview\"\nvar CONFIG_UPDATE_HISTORY = \"$:/config/Navigation/UpdateHistory\"; // Can be \"yes\" or \"no\"\nvar CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD = \"$:/config/Navigation/Permalinkview/CopyToClipboard\"; // Can be \"yes\" (default) or \"no\"\nvar CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR = \"$:/config/Navigation/Permalinkview/UpdateAddressBar\"; // Can be \"yes\" (default) or \"no\"\n\n\n// Links to help, if there is no param\nvar HELP_OPEN_EXTERNAL_WINDOW = \"http://tiddlywiki.com/#WidgetMessage%3A%20tm-open-external-window\";\n\nexports.startup = function() {\n\t// Open startup tiddlers\n\topenStartupTiddlers({\n\t\tdisableHistory: $tw.boot.disableStartupNavigation\n\t});\n\tif($tw.browser) {\n\t\t// Set up location hash update\n\t\t$tw.wiki.addEventListener(\"change\",function(changes) {\n\t\t\tif($tw.utils.hop(changes,DEFAULT_STORY_TITLE) || $tw.utils.hop(changes,DEFAULT_HISTORY_TITLE)) {\n\t\t\t\tupdateLocationHash({\n\t\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_UPDATE_ADDRESS_BAR,\"permaview\").trim(),\n\t\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim()\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t// Listen for changes to the browser location hash\n\t\twindow.addEventListener(\"hashchange\",function() {\n\t\t\tvar hash = $tw.utils.getLocationHash();\n\t\t\tif(hash !== $tw.locationHash) {\n\t\t\t\t$tw.locationHash = hash;\n\t\t\t\topenStartupTiddlers({defaultToCurrentStory: true});\n\t\t\t}\n\t\t},false);\n\t\t// Listen for the tm-browser-refresh message\n\t\t$tw.rootWidget.addEventListener(\"tm-browser-refresh\",function(event) {\n\t\t\twindow.location.reload(true);\n\t\t});\n\t\t// Listen for tm-open-external-window message\n\t\t$tw.rootWidget.addEventListener(\"tm-open-external-window\",function(event) {\n\t\t\tvar paramObject = event.paramObject || {},\n\t\t\t\tstrUrl = event.param || HELP_OPEN_EXTERNAL_WINDOW,\n\t\t\t\tstrWindowName = paramObject.windowName,\n\t\t\t\tstrWindowFeatures = paramObject.windowFeatures;\n\t\t\twindow.open(strUrl, strWindowName, strWindowFeatures);\n\t\t});\n\t\t// Listen for the tm-print message\n\t\t$tw.rootWidget.addEventListener(\"tm-print\",function(event) {\n\t\t\t(event.event.view || window).print();\n\t\t});\n\t\t// Listen for the tm-home message\n\t\t$tw.rootWidget.addEventListener(\"tm-home\",function(event) {\n\t\t\twindow.location.hash = \"\";\n\t\t\tvar storyFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE),\n\t\t\t\tstoryList = $tw.wiki.filterTiddlers(storyFilter);\n\t\t\t//invoke any hooks that might change the default story list\n\t\t\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t\t\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t\t\tif(storyList[0]) {\n\t\t\t\t$tw.wiki.addToHistory(storyList[0]);\n\t\t\t}\n\t\t});\n\t\t// Listen for the tm-permalink message\n\t\t$tw.rootWidget.addEventListener(\"tm-permalink\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permalink\" : \"none\"\n\t\t\t});\n\t\t});\n\t\t// Listen for the tm-permaview message\n\t\t$tw.rootWidget.addEventListener(\"tm-permaview\",function(event) {\n\t\t\tupdateLocationHash({\n\t\t\t\tupdateAddressBar: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_UPDATE_ADDRESS_BAR,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\",\n\t\t\t\tupdateHistory: $tw.wiki.getTiddlerText(CONFIG_UPDATE_HISTORY,\"no\").trim(),\n\t\t\t\ttargetTiddler: event.param || event.tiddlerTitle,\n\t\t\t\tcopyToClipboard: $tw.wiki.getTiddlerText(CONFIG_PERMALINKVIEW_COPY_TO_CLIPBOARD,\"yes\").trim() === \"yes\" ? \"permaview\" : \"none\"\n\t\t\t});\t\t\t\t\n\t\t});\n\t}\n};\n\n/*\nProcess the location hash to open the specified tiddlers. Options:\ndisableHistory: if true $:/History is NOT updated\ndefaultToCurrentStory: If true, the current story is retained as the default, instead of opening the default tiddlers\n*/\nfunction openStartupTiddlers(options) {\n\toptions = options || {};\n\t// Work out the target tiddler and the story filter. \"null\" means \"unspecified\"\n\tvar target = null,\n\t\tstoryFilter = null;\n\tif($tw.locationHash.length > 1) {\n\t\tvar hash = $tw.locationHash.substr(1),\n\t\t\tsplit = hash.indexOf(\":\");\n\t\tif(split === -1) {\n\t\t\ttarget = decodeURIComponent(hash.trim());\n\t\t} else {\n\t\t\ttarget = decodeURIComponent(hash.substr(0,split).trim());\n\t\t\tstoryFilter = decodeURIComponent(hash.substr(split + 1).trim());\n\t\t}\n\t}\n\t// If the story wasn't specified use the current tiddlers or a blank story\n\tif(storyFilter === null) {\n\t\tif(options.defaultToCurrentStory) {\n\t\t\tvar currStoryList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE);\n\t\t\tstoryFilter = $tw.utils.stringifyList(currStoryList);\n\t\t} else {\n\t\t\tif(target && target !== \"\") {\n\t\t\t\tstoryFilter = \"\";\n\t\t\t} else {\n\t\t\t\tstoryFilter = $tw.wiki.getTiddlerText(DEFAULT_TIDDLERS_TITLE);\n\t\t\t}\n\t\t}\n\t}\n\t// Process the story filter to get the story list\n\tvar storyList = $tw.wiki.filterTiddlers(storyFilter);\n\t// Invoke any hooks that want to change the default story list\n\tstoryList = $tw.hooks.invokeHook(\"th-opening-default-tiddlers-list\",storyList);\n\t// If the target tiddler isn't included then splice it in at the top\n\tif(target && storyList.indexOf(target) === -1) {\n\t\tstoryList.unshift(target);\n\t}\n\t// Save the story list\n\t$tw.wiki.addTiddler({title: DEFAULT_STORY_TITLE, text: \"\", list: storyList},$tw.wiki.getModificationFields());\n\t// Update history\n\tvar story = new $tw.Story({\n\t\twiki: $tw.wiki,\n\t\tstoryTitle: DEFAULT_STORY_TITLE,\n\t\thistoryTitle: DEFAULT_HISTORY_TITLE\n\t});\n\tif(!options.disableHistory) {\n\t\t// If a target tiddler was specified add it to the history stack\n\t\tif(target && target !== \"\") {\n\t\t\t// The target tiddler doesn't need double square brackets, but we'll silently remove them if they're present\n\t\t\tif(target.indexOf(\"[[\") === 0 && target.substr(-2) === \"]]\") {\n\t\t\t\ttarget = target.substr(2,target.length - 4);\n\t\t\t}\n\t\t\tstory.addToHistory(target);\n\t\t} else if(storyList.length > 0) {\n\t\t\tstory.addToHistory(storyList[0]);\n\t\t}\t\t\n\t}\n}\n\n/*\noptions: See below\noptions.updateAddressBar: \"permalink\", \"permaview\" or \"no\" (defaults to \"permaview\")\noptions.updateHistory: \"yes\" or \"no\" (defaults to \"no\")\noptions.copyToClipboard: \"permalink\", \"permaview\" or \"no\" (defaults to \"no\")\noptions.targetTiddler: optional title of target tiddler for permalink\n*/\nfunction updateLocationHash(options) {\n\t// Get the story and the history stack\n\tvar storyList = $tw.wiki.getTiddlerList(DEFAULT_STORY_TITLE),\n\t\thistoryList = $tw.wiki.getTiddlerData(DEFAULT_HISTORY_TITLE,[]),\n\t\ttargetTiddler = \"\";\n\tif(options.targetTiddler) {\n\t\ttargetTiddler = options.targetTiddler;\n\t} else {\n\t\t// The target tiddler is the one at the top of the stack\n\t\tif(historyList.length > 0) {\n\t\t\ttargetTiddler = historyList[historyList.length-1].title;\n\t\t}\n\t\t// Blank the target tiddler if it isn't present in the story\n\t\tif(storyList.indexOf(targetTiddler) === -1) {\n\t\t\ttargetTiddler = \"\";\n\t\t}\n\t}\n\t// Assemble the location hash\n\tswitch(options.updateAddressBar) {\n\t\tcase \"permalink\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler);\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.locationHash = \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList));\n\t\t\tbreak;\n\t}\n\t// Copy URL to the clipboard\n\tswitch(options.copyToClipboard) {\n\t\tcase \"permalink\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler));\n\t\t\tbreak;\n\t\tcase \"permaview\":\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getLocationPath() + \"#\" + encodeURIComponent(targetTiddler) + \":\" + encodeURIComponent($tw.utils.stringifyList(storyList)));\n\t\t\tbreak;\n\t}\n\t// Only change the location hash if we must, thus avoiding unnecessary onhashchange events\n\tif($tw.utils.getLocationHash() !== $tw.locationHash) {\n\t\tif(options.updateHistory === \"yes\") {\n\t\t\t// Assign the location hash so that history is updated\n\t\t\twindow.location.hash = $tw.locationHash;\n\t\t} else {\n\t\t\t// We use replace so that browser history isn't affected\n\t\t\twindow.location.replace(window.location.toString().split(\"#\")[0] + $tw.locationHash);\n\t\t}\n\t}\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/startup/windows.js": {
"title": "$:/core/modules/startup/windows.js",
"text": "/*\\\ntitle: $:/core/modules/startup/windows.js\ntype: application/javascript\nmodule-type: startup\n\nSetup root widget handlers for the messages concerned with opening external browser windows\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Export name and synchronous status\nexports.name = \"windows\";\nexports.platforms = [\"browser\"];\nexports.after = [\"startup\"];\nexports.synchronous = true;\n\n// Global to keep track of open windows (hashmap by title)\n$tw.windows = {};\n\nexports.startup = function() {\n\t// Handle open window message\n\t$tw.rootWidget.addEventListener(\"tm-open-window\",function(event) {\n\t\t// Get the parameters\n\t\tvar refreshHandler,\n\t\t\ttitle = event.param || event.tiddlerTitle,\n\t\t\tparamObject = event.paramObject || {},\n\t\t\twindowTitle = paramObject.windowTitle || title,\n\t\t\ttemplate = paramObject.template || \"$:/core/templates/single.tiddler.window\",\n\t\t\twidth = paramObject.width || \"700\",\n\t\t\theight = paramObject.height || \"600\",\n\t\t\tvariables = $tw.utils.extend({},paramObject,{currentTiddler: title});\n\t\t// Open the window\n\t\tvar srcWindow,\n\t\t srcDocument;\n\t\t// In case that popup blockers deny opening a new window\n\t\ttry {\n\t\t\tsrcWindow = window.open(\"\",\"external-\" + title,\"scrollbars,width=\" + width + \",height=\" + height),\n\t\t\tsrcDocument = srcWindow.document;\n\t\t}\n\t\tcatch(e) {\n\t\t\treturn;\n\t\t}\n\t\t$tw.windows[title] = srcWindow;\n\t\t// Check for reopening the same window\n\t\tif(srcWindow.haveInitialisedWindow) {\n\t\t\treturn;\n\t\t}\n\t\t// Initialise the document\n\t\tsrcDocument.write(\"<html><head></head><body class='tc-body tc-single-tiddler-window'></body></html>\");\n\t\tsrcDocument.close();\n\t\tsrcDocument.title = windowTitle;\n\t\tsrcWindow.addEventListener(\"beforeunload\",function(event) {\n\t\t\tdelete $tw.windows[title];\n\t\t\t$tw.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t},false);\n\t\t// Set up the styles\n\t\tvar styleWidgetNode = $tw.wiki.makeTranscludeWidget(\"$:/core/ui/PageStylesheet\",{\n\t\t\t\tdocument: $tw.fakeDocument,\n\t\t\t\tvariables: variables,\n\t\t\t\timportPageMacros: true}),\n\t\t\tstyleContainer = $tw.fakeDocument.createElement(\"style\");\n\t\tstyleWidgetNode.render(styleContainer,null);\n\t\tvar styleElement = srcDocument.createElement(\"style\");\n\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\tsrcDocument.head.insertBefore(styleElement,srcDocument.head.firstChild);\n\t\t// Render the text of the tiddler\n\t\tvar parser = $tw.wiki.parseTiddler(template),\n\t\t\twidgetNode = $tw.wiki.makeWidget(parser,{document: srcDocument, parentWidget: $tw.rootWidget, variables: variables});\n\t\twidgetNode.render(srcDocument.body,srcDocument.body.firstChild);\n\t\t// Function to handle refreshes\n\t\trefreshHandler = function(changes) {\n\t\t\tif(styleWidgetNode.refresh(changes,styleContainer,null)) {\n\t\t\t\tstyleElement.innerHTML = styleContainer.textContent;\n\t\t\t}\n\t\t\twidgetNode.refresh(changes);\n\t\t};\n\t\t$tw.wiki.addEventListener(\"change\",refreshHandler);\n\t\t// Listen for keyboard shortcuts\n\t\t$tw.utils.addEventListeners(srcDocument,[{\n\t\t\tname: \"keydown\",\n\t\t\thandlerObject: $tw.keyboardManager,\n\t\t\thandlerMethod: \"handleKeydownEvent\"\n\t\t}]);\n\t\tsrcWindow.document.documentElement.addEventListener(\"click\",$tw.popup,true);\n\t\tsrcWindow.haveInitialisedWindow = true;\n\t});\n\t// Close open windows when unloading main window\n\t$tw.addUnloadTask(function() {\n\t\t$tw.utils.each($tw.windows,function(win) {\n\t\t\twin.close();\n\t\t});\n\t});\n\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "startup"
},
"$:/core/modules/story.js": {
"title": "$:/core/modules/story.js",
"text": "/*\\\ntitle: $:/core/modules/story.js\ntype: application/javascript\nmodule-type: global\n\nLightweight object for managing interactions with the story and history lists.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nConstruct Story object with options:\nwiki: reference to wiki object to use to resolve tiddler titles\nstoryTitle: title of story list tiddler\nhistoryTitle: title of history list tiddler\n*/\nfunction Story(options) {\n\toptions = options || {};\n\tthis.wiki = options.wiki || $tw.wiki;\n\tthis.storyTitle = options.storyTitle || \"$:/StoryList\";\n\tthis.historyTitle = options.historyTitle || \"$:/HistoryList\";\n};\n\nStory.prototype.navigateTiddler = function(navigateTo,navigateFromTitle,navigateFromClientRect) {\n\tthis.addToStory(navigateTo,navigateFromTitle);\n\tthis.addToHistory(navigateTo,navigateFromClientRect);\n};\n\nStory.prototype.getStoryList = function() {\n\treturn this.wiki.getTiddlerList(this.storyTitle) || [];\n};\n\nStory.prototype.addToStory = function(navigateTo,navigateFromTitle,options) {\n\toptions = options || {};\n\tvar storyList = this.getStoryList();\n\t// See if the tiddler is already there\n\tvar slot = storyList.indexOf(navigateTo);\n\t// Quit if it already exists in the story river\n\tif(slot >= 0) {\n\t\treturn;\n\t}\n\t// First we try to find the position of the story element we navigated from\n\tvar fromIndex = storyList.indexOf(navigateFromTitle);\n\tif(fromIndex >= 0) {\n\t\t// The tiddler is added from inside the river\n\t\t// Determine where to insert the tiddler; Fallback is \"below\"\n\t\tswitch(options.openLinkFromInsideRiver) {\n\t\t\tcase \"top\":\n\t\t\t\tslot = 0;\n\t\t\t\tbreak;\n\t\t\tcase \"bottom\":\n\t\t\t\tslot = storyList.length;\n\t\t\t\tbreak;\n\t\t\tcase \"above\":\n\t\t\t\tslot = fromIndex;\n\t\t\t\tbreak;\n\t\t\tcase \"below\": // Intentional fall-through\n\t\t\tdefault:\n\t\t\t\tslot = fromIndex + 1;\n\t\t\t\tbreak;\n\t\t}\n\t} else {\n\t\t// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is \"top\"\n\t\tif(options.openLinkFromOutsideRiver === \"bottom\") {\n\t\t\t// Insert at bottom\n\t\t\tslot = storyList.length;\n\t\t} else {\n\t\t\t// Insert at top\n\t\t\tslot = 0;\n\t\t}\n\t}\n\t// Add the tiddler\n\tstoryList.splice(slot,0,navigateTo);\n\t// Save the story\n\tthis.saveStoryList(storyList);\n};\n\nStory.prototype.saveStoryList = function(storyList) {\n\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\tthis.wiki.getCreationFields(),\n\t\t{title: this.storyTitle},\n\t\tstoryTiddler,\n\t\t{list: storyList},\n\t\tthis.wiki.getModificationFields()\n\t));\n};\n\nStory.prototype.addToHistory = function(navigateTo,navigateFromClientRect) {\n\tvar titles = $tw.utils.isArray(navigateTo) ? navigateTo : [navigateTo];\n\t// Add a new record to the top of the history stack\n\tvar historyList = this.wiki.getTiddlerData(this.historyTitle,[]);\n\t$tw.utils.each(titles,function(title) {\n\t\thistoryList.push({title: title, fromPageRect: navigateFromClientRect});\n\t});\n\tthis.wiki.setTiddlerData(this.historyTitle,historyList,{\"current-tiddler\": titles[titles.length-1]});\n};\n\nStory.prototype.storyCloseTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCloseAllTiddlers = function() {\n// TBD\n};\n\nStory.prototype.storyCloseOtherTiddlers = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyEditTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyDeleteTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storySaveTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyCancelTiddler = function(targetTitle) {\n// TBD\n};\n\nStory.prototype.storyNewTiddler = function(targetTitle) {\n// TBD\n};\n\nexports.Story = Story;\n\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/storyviews/classic.js": {
"title": "$:/core/modules/storyviews/classic.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/classic.js\ntype: application/javascript\nmodule-type: storyview\n\nViews the story as a linear sequence\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ClassicStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nClassicStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration()\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\tif(duration) {\n\t\t// Scroll the node into view\n\t\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\t\n\t} else {\n\t\ttargetElement.scrollIntoView();\n\t}\n};\n\nClassicStoryView.prototype.insert = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar computedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Reset the margin once the transition is over\n\t\tsetTimeout(function() {\n\t\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t\t{transition: \"none\"},\n\t\t\t\t{marginBottom: \"\"}\n\t\t\t]);\n\t\t},duration);\n\t\t// Set up the initial position of the element\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t// Transition to the final position\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t]);\n\t}\n};\n\nClassicStoryView.prototype.remove = function(widget) {\n\tvar duration = $tw.utils.getAnimationDuration();\n\tif(duration) {\n\t\tvar targetElement = widget.findFirstDomNode(),\n\t\t\tremoveElement = function() {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t};\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(targetElement instanceof Element)) {\n\t\t\tremoveElement();\n\t\t\treturn;\n\t\t}\n\t\t// Get the current height of the tiddler\n\t\tvar currWidth = targetElement.offsetWidth,\n\t\t\tcomputedStyle = window.getComputedStyle(targetElement),\n\t\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\t\tcurrHeight = targetElement.offsetHeight + currMarginTop;\n\t\t// Remove the dom nodes of the widget at the end of the transition\n\t\tsetTimeout(removeElement,duration);\n\t\t// Animate the closure\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"translateX(0px)\"},\n\t\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t\t{opacity: \"1.0\"}\n\t\t]);\n\t\t$tw.utils.forceLayout(targetElement);\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"opacity \" + duration + \"ms \" + easing + \", \" +\n\t\t\t\t\t\t\"margin-bottom \" + duration + \"ms \" + easing},\n\t\t\t{transform: \"translateX(-\" + currWidth + \"px)\"},\n\t\t\t{marginBottom: (-currHeight) + \"px\"},\n\t\t\t{opacity: \"0.0\"}\n\t\t]);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n};\n\nexports.classic = ClassicStoryView;\n\n})();",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/pop.js": {
"title": "$:/core/modules/storyviews/pop.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/pop.js\ntype: application/javascript\nmodule-type: storyview\n\nAnimates list insertions and removals\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar PopStoryView = function(listWidget) {\n\tthis.listWidget = listWidget;\n};\n\nPopStoryView.prototype.navigateTo = function(historyInfo) {\n\tvar listElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Scroll the node into view\n\tthis.listWidget.dispatchEvent({type: \"tm-scroll\", target: targetElement});\n};\n\nPopStoryView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Reset once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(targetElement,[\n\t\t\t{transition: \"none\"},\n\t\t\t{transform: \"none\"}\n\t\t]);\n\t\t$tw.utils.setStyle(widget.document.body,[\n\t\t\t{\"overflow-x\": \"\"}\n\t\t]);\n\t},duration);\n\t// Prevent the page from overscrolling due to the zoom factor\n\t$tw.utils.setStyle(widget.document.body,[\n\t\t{\"overflow-x\": \"hidden\"}\n\t]);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(2)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t// Transition to the final position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n};\n\nPopStoryView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\tif(targetElement && targetElement.parentNode) {\n\t\t\t\twidget.removeChildDomNodes();\n\t\t\t}\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Remove the element at the end of the transition\n\tsetTimeout(removeElement,duration);\n\t// Animate the closure\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: \"none\"},\n\t\t{transform: \"scale(1)\"},\n\t\t{opacity: \"1.0\"}\n\t]);\n\t$tw.utils.forceLayout(targetElement);\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{transform: \"scale(0.1)\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n};\n\nexports.pop = PopStoryView;\n\n})();\n",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/storyviews/zoomin.js": {
"title": "$:/core/modules/storyviews/zoomin.js",
"text": "/*\\\ntitle: $:/core/modules/storyviews/zoomin.js\ntype: application/javascript\nmodule-type: storyview\n\nZooms between individual tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar easing = \"cubic-bezier(0.645, 0.045, 0.355, 1)\"; // From http://easings.net/#easeInOutCubic\n\nvar ZoominListView = function(listWidget) {\n\tvar self = this;\n\tthis.listWidget = listWidget;\n\t// Get the index of the tiddler that is at the top of the history\n\tvar history = this.listWidget.wiki.getTiddlerDataCached(this.listWidget.historyTitle,[]),\n\t\ttargetTiddler;\n\tif(history.length > 0) {\n\t\ttargetTiddler = history[history.length-1].title;\n\t}\n\t// Make all the tiddlers position absolute, and hide all but the top (or first) one\n\t$tw.utils.each(this.listWidget.children,function(itemWidget,index) {\n\t\tvar domNode = itemWidget.findFirstDomNode();\n\t\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\t\tif(!(domNode instanceof Element)) {\n\t\t\treturn;\n\t\t}\n\t\tif((targetTiddler && targetTiddler !== itemWidget.parseTreeNode.itemTitle) || (!targetTiddler && index)) {\n\t\t\tdomNode.style.display = \"none\";\n\t\t} else {\n\t\t\tself.currentTiddlerDomNode = domNode;\n\t\t}\n\t\t$tw.utils.addClass(domNode,\"tc-storyview-zoomin-tiddler\");\n\t});\n};\n\nZoominListView.prototype.navigateTo = function(historyInfo) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\t\tlistElementIndex = this.listWidget.findListItem(0,historyInfo.title);\n\tif(listElementIndex === undefined) {\n\t\treturn;\n\t}\n\tvar listItemWidget = this.listWidget.children[listElementIndex],\n\t\ttargetElement = listItemWidget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the new tiddler be position absolute and visible so that we can measure it\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"0 0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{opacity: \"0.0\"}\n\t]);\n\t// Get the position of the source node, or use the centre of the window as the source position\n\tvar sourceBounds = historyInfo.fromPageRect || {\n\t\t\tleft: window.innerWidth/2 - 2,\n\t\t\ttop: window.innerHeight/2 - 2,\n\t\t\twidth: window.innerWidth/8,\n\t\t\theight: window.innerHeight/8\n\t\t};\n\t// Try to find the title node in the target tiddler\n\tvar titleDomNode = findTitleDomNode(listItemWidget) || listItemWidget.findFirstDomNode(),\n\t\tzoomBounds = titleDomNode.getBoundingClientRect();\n\t// Compute the transform for the target tiddler to make the title lie over the source rectange\n\tvar targetBounds = targetElement.getBoundingClientRect(),\n\t\tscale = sourceBounds.width / zoomBounds.width,\n\t\tx = sourceBounds.left - targetBounds.left - (zoomBounds.left - targetBounds.left) * scale,\n\t\ty = sourceBounds.top - targetBounds.top - (zoomBounds.top - targetBounds.top) * scale;\n\t// Transform the target tiddler to its starting position\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(targetElement);\n\t// Apply the ending transitions with a timeout to ensure that the previously applied transformations are applied first\n\tvar self = this,\n\t\tprevCurrentTiddler = this.currentTiddlerDomNode;\n\tthis.currentTiddlerDomNode = targetElement;\n\t// Transform the target tiddler to its natural size\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{zIndex: \"500\"},\n\t]);\n\t// Transform the previous tiddler out of the way and then hide it\n\tif(prevCurrentTiddler && prevCurrentTiddler !== targetElement) {\n\t\tscale = zoomBounds.width / sourceBounds.width;\n\t\tx = zoomBounds.left - targetBounds.left - (sourceBounds.left - targetBounds.left) * scale;\n\t\ty = zoomBounds.top - targetBounds.top - (sourceBounds.top - targetBounds.top) * scale;\n\t\t$tw.utils.setStyle(prevCurrentTiddler,[\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transformOrigin: \"0 0\"},\n\t\t\t{transform: \"translateX(\" + x + \"px) translateY(\" + y + \"px) scale(\" + scale + \")\"},\n\t\t\t{zIndex: \"0\"}\n\t\t]);\n\t\t// Hide the tiddler when the transition has finished\n\t\tsetTimeout(function() {\n\t\t\tif(self.currentTiddlerDomNode !== prevCurrentTiddler) {\n\t\t\t\tprevCurrentTiddler.style.display = \"none\";\n\t\t\t}\n\t\t},duration);\n\t}\n\t// Scroll the target into view\n//\t$tw.pageScroller.scrollIntoView(targetElement);\n};\n\n/*\nFind the first child DOM node of a widget that has the class \"tc-title\"\n*/\nfunction findTitleDomNode(widget,targetClass) {\n\ttargetClass = targetClass || \"tc-title\";\n\tvar domNode = widget.findFirstDomNode();\n\tif(domNode && domNode.querySelector) {\n\t\treturn domNode.querySelector(\".\" + targetClass);\n\t}\n\treturn null;\n}\n\nZoominListView.prototype.insert = function(widget) {\n\tvar targetElement = widget.findFirstDomNode();\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\treturn;\n\t}\n\t// Make the newly inserted node position absolute and hidden\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"none\"}\n\t]);\n};\n\nZoominListView.prototype.remove = function(widget) {\n\tvar targetElement = widget.findFirstDomNode(),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\tremoveElement = function() {\n\t\t\twidget.removeChildDomNodes();\n\t\t};\n\t// Abandon if the list entry isn't a DOM element (it might be a text node)\n\tif(!(targetElement instanceof Element)) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Abandon if hidden\n\tif(targetElement.style.display != \"block\" ) {\n\t\tremoveElement();\n\t\treturn;\n\t}\n\t// Set up the tiddler that is being closed\n\t$tw.utils.addClass(targetElement,\"tc-storyview-zoomin-tiddler\");\n\t$tw.utils.setStyle(targetElement,[\n\t\t{display: \"block\"},\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t{transition: \"none\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\t// We'll move back to the previous or next element in the story\n\tvar toWidget = widget.previousSibling();\n\tif(!toWidget) {\n\t\ttoWidget = widget.nextSibling();\n\t}\n\tvar toWidgetDomNode = toWidget && toWidget.findFirstDomNode();\n\t// Set up the tiddler we're moving back in\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.addClass(toWidgetDomNode,\"tc-storyview-zoomin-tiddler\");\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{display: \"block\"},\n\t\t\t{transformOrigin: \"50% 50%\"},\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(10)\"},\n\t\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t\t{opacity: \"0\"},\n\t\t\t{zIndex: \"500\"}\n\t\t]);\n\t\tthis.currentTiddlerDomNode = toWidgetDomNode;\n\t}\n\t// Animate them both\n\t// Force layout\n\t$tw.utils.forceLayout(this.listWidget.parentDomNode);\n\t// First, the tiddler we're closing\n\t$tw.utils.setStyle(targetElement,[\n\t\t{transformOrigin: \"50% 50%\"},\n\t\t{transform: \"translateX(0px) translateY(0px) scale(0.1)\"},\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms \" + easing + \", opacity \" + duration + \"ms \" + easing},\n\t\t{opacity: \"0\"},\n\t\t{zIndex: \"0\"}\n\t]);\n\tsetTimeout(removeElement,duration);\n\t// Now the tiddler we're going back to\n\tif(toWidgetDomNode) {\n\t\t$tw.utils.setStyle(toWidgetDomNode,[\n\t\t\t{transform: \"translateX(0px) translateY(0px) scale(1)\"},\n\t\t\t{opacity: \"1\"}\n\t\t]);\n\t}\n\treturn true; // Indicate that we'll delete the DOM node\n};\n\nexports.zoomin = ZoominListView;\n\n})();\n",
"type": "application/javascript",
"module-type": "storyview"
},
"$:/core/modules/syncer.js": {
"title": "$:/core/modules/syncer.js",
"text": "/*\\\ntitle: $:/core/modules/syncer.js\ntype: application/javascript\nmodule-type: global\n\nThe syncer tracks changes to the store and synchronises them to a remote data store represented as a \"sync adaptor\"\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDefaults\n*/\nSyncer.prototype.titleIsLoggedIn = \"$:/status/IsLoggedIn\";\nSyncer.prototype.titleIsAnonymous = \"$:/status/IsAnonymous\";\nSyncer.prototype.titleIsReadOnly = \"$:/status/IsReadOnly\";\nSyncer.prototype.titleUserName = \"$:/status/UserName\";\nSyncer.prototype.titleSyncFilter = \"$:/config/SyncFilter\";\nSyncer.prototype.titleSyncPollingInterval = \"$:/config/SyncPollingInterval\";\nSyncer.prototype.titleSyncDisableLazyLoading = \"$:/config/SyncDisableLazyLoading\";\nSyncer.prototype.titleSavedNotification = \"$:/language/Notifications/Save/Done\";\nSyncer.prototype.titleSyncThrottleInterval = \"$:/config/SyncThrottleInterval\";\nSyncer.prototype.taskTimerInterval = 1 * 1000; // Interval for sync timer\nSyncer.prototype.throttleInterval = 1 * 1000; // Defer saving tiddlers if they've changed in the last 1s...\nSyncer.prototype.errorRetryInterval = 5 * 1000; // Interval to retry after an error\nSyncer.prototype.fallbackInterval = 10 * 1000; // Unless the task is older than 10s\nSyncer.prototype.pollTimerInterval = 60 * 1000; // Interval for polling for changes from the adaptor\n\n/*\nInstantiate the syncer with the following options:\nsyncadaptor: reference to syncadaptor to be used\nwiki: wiki to be synced\n*/\nfunction Syncer(options) {\n\tvar self = this;\n\tthis.wiki = options.wiki;\n\t// Save parameters\n\tthis.syncadaptor = options.syncadaptor;\n\tthis.disableUI = !!options.disableUI;\n\tthis.titleIsLoggedIn = options.titleIsLoggedIn || this.titleIsLoggedIn;\n\tthis.titleUserName = options.titleUserName || this.titleUserName;\n\tthis.titleSyncFilter = options.titleSyncFilter || this.titleSyncFilter;\n\tthis.titleSavedNotification = options.titleSavedNotification || this.titleSavedNotification;\n\tthis.taskTimerInterval = options.taskTimerInterval || this.taskTimerInterval;\n\tthis.throttleInterval = options.throttleInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncThrottleInterval,\"\"),10) || this.throttleInterval;\n\tthis.errorRetryInterval = options.errorRetryInterval || this.errorRetryInterval;\n\tthis.fallbackInterval = options.fallbackInterval || this.fallbackInterval;\n\tthis.pollTimerInterval = options.pollTimerInterval || parseInt(this.wiki.getTiddlerText(this.titleSyncPollingInterval,\"\"),10) || this.pollTimerInterval;\n\tthis.logging = \"logging\" in options ? options.logging : true;\n\t// Make a logger\n\tthis.logger = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\") + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\"),{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging,\n\t\tsaveHistory: true\n\t});\n\t// Make another logger for connection errors\n\tthis.loggerConnection = new $tw.utils.Logger(\"syncer\" + ($tw.browser ? \"-browser\" : \"\") + ($tw.node ? \"-server\" : \"\") + (this.syncadaptor.name ? (\"-\" + this.syncadaptor.name) : \"\") + \"-connection\",{\n\t\tcolour: \"cyan\",\n\t\tenable: this.logging\n\t});\n\t// Ask the syncadaptor to use the main logger\n\tif(this.syncadaptor.setLoggerSaveBuffer) {\n\t\tthis.syncadaptor.setLoggerSaveBuffer(this.logger);\n\t}\n\t// Compile the dirty tiddler filter\n\tthis.filterFn = this.wiki.compileFilter(this.wiki.getTiddlerText(this.titleSyncFilter));\n\t// Record information for known tiddlers\n\tthis.readTiddlerInfo();\n\tthis.titlesToBeLoaded = {}; // Hashmap of titles of tiddlers that need loading from the server\n\tthis.titlesHaveBeenLazyLoaded = {}; // Hashmap of titles of tiddlers that have already been lazily loaded from the server\n\t// Timers\n\tthis.taskTimerId = null; // Timer for task dispatch\n\tthis.pollTimerId = null; // Timer for polling server\n\t// Number of outstanding requests\n\tthis.numTasksInProgress = 0;\n\t// Listen out for changes to tiddlers\n\tthis.wiki.addEventListener(\"change\",function(changes) {\n\t\t// Filter the changes to just include ones that are being synced\n\t\tvar filteredChanges = self.getSyncedTiddlers(function(callback) {\n\t\t\t$tw.utils.each(changes,function(change,title) {\n\t\t\t\tvar tiddler = self.wiki.tiddlerExists(title) && self.wiki.getTiddler(title);\n\t\t\t\tcallback(tiddler,title);\n\t\t\t});\n\t\t});\n\t\tif(filteredChanges.length > 0) {\n\t\t\tself.processTaskQueue();\n\t\t} else {\n\t\t\t// Look for deletions of tiddlers we're already syncing\t\n\t\t\tvar outstandingDeletion = false\n\t\t\t$tw.utils.each(changes,function(change,title,object) {\n\t\t\t\tif(change.deleted && $tw.utils.hop(self.tiddlerInfo,title)) {\n\t\t\t\t\toutstandingDeletion = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(outstandingDeletion) {\n\t\t\t\tself.processTaskQueue();\n\t\t\t}\n\t\t}\n\t});\n\t// Browser event handlers\n\tif($tw.browser && !this.disableUI) {\n\t\t// Set up our beforeunload handler\n\t\t$tw.addUnloadTask(function(event) {\n\t\t\tvar confirmationMessage;\n\t\t\tif(self.isDirty()) {\n\t\t\t\tconfirmationMessage = $tw.language.getString(\"UnsavedChangesWarning\");\n\t\t\t\tevent.returnValue = confirmationMessage; // Gecko\n\t\t\t}\n\t\t\treturn confirmationMessage;\n\t\t});\n\t\t// Listen out for login/logout/refresh events in the browser\n\t\t$tw.rootWidget.addEventListener(\"tm-login\",function(event) {\n\t\t\tvar username = event && event.paramObject && event.paramObject.username,\n\t\t\t\tpassword = event && event.paramObject && event.paramObject.password;\n\t\t\tif(username && password) {\n\t\t\t\t// Login with username and password\n\t\t\t\tself.login(username,password,function() {});\n\t\t\t} else {\n\t\t\t\t// No username and password, so we display a prompt\n\t\t\t\tself.handleLoginEvent();\t\t\t\t\n\t\t\t}\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-logout\",function() {\n\t\t\tself.handleLogoutEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-server-refresh\",function() {\n\t\t\tself.handleRefreshEvent();\n\t\t});\n\t\t$tw.rootWidget.addEventListener(\"tm-copy-syncer-logs-to-clipboard\",function() {\n\t\t\t$tw.utils.copyToClipboard($tw.utils.getSystemInfo() + \"\\n\\nLog:\\n\" + self.logger.getBuffer());\n\t\t});\n\t}\n\t// Listen out for lazyLoad events\n\tif(!this.disableUI && this.wiki.getTiddlerText(this.titleSyncDisableLazyLoading) !== \"yes\") {\n\t\tthis.wiki.addEventListener(\"lazyLoad\",function(title) {\n\t\t\tself.handleLazyLoadEvent(title);\n\t\t});\t\t\n\t}\n\t// Get the login status\n\tthis.getStatus(function(err,isLoggedIn) {\n\t\t// Do a sync from the server\n\t\tself.syncFromServer();\n\t});\n}\n\n/*\nShow a generic network error alert\n*/\nSyncer.prototype.displayError = function(msg,err) {\n\tif(err === ($tw.language.getString(\"Error/XMLHttpRequest\") + \": 0\")) {\n\t\tthis.loggerConnection.alert($tw.language.getString(\"Error/NetworkErrorAlert\"));\n\t\tthis.logger.log(msg + \":\",err);\n\t} else {\n\t\tthis.logger.alert(msg + \":\",err);\n\t}\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getSyncedTiddlers = function(source) {\n\treturn this.filterFn.call(this.wiki,source);\n};\n\n/*\nReturn an array of the tiddler titles that are subjected to syncing\n*/\nSyncer.prototype.getTiddlerRevision = function(title) {\n\tif(this.syncadaptor && this.syncadaptor.getTiddlerRevision) {\n\t\treturn this.syncadaptor.getTiddlerRevision(title);\n\t} else {\n\t\treturn this.wiki.getTiddler(title).fields.revision;\t\n\t} \n};\n\n/*\nRead (or re-read) the latest tiddler info from the store\n*/\nSyncer.prototype.readTiddlerInfo = function() {\n\t// Hashmap by title of {revision:,changeCount:,adaptorInfo:}\n\t// \"revision\" is the revision of the tiddler last seen on the server, and \"changecount\" is the corresponding local changecount\n\tthis.tiddlerInfo = {};\n\t// Record information for known tiddlers\n\tvar self = this,\n\t\ttiddlers = this.getSyncedTiddlers();\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title);\n\t\tif(tiddler) {\n\t\t\tself.tiddlerInfo[title] = {\n\t\t\t\trevision: self.getTiddlerRevision(title),\n\t\t\t\tadaptorInfo: self.syncadaptor && self.syncadaptor.getTiddlerInfo(tiddler),\n\t\t\t\tchangeCount: self.wiki.getChangeCount(title)\n\t\t\t};\n\t\t}\n\t});\n};\n\n/*\nChecks whether the wiki is dirty (ie the window shouldn't be closed)\n*/\nSyncer.prototype.isDirty = function() {\n\tthis.logger.log(\"Checking dirty status\");\n\t// Check tiddlers that are in the store and included in the filter function\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(this.wiki.tiddlerExists(title)) {\n\t\t\tif(tiddlerInfo) {\n\t\t\t\t// If the tiddler is known on the server and has been modified locally then it needs to be saved to the server\n\t\t\t\tif(this.wiki.getChangeCount(title) > tiddlerInfo.changeCount) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// If the tiddler isn't known on the server then it needs to be saved to the server\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t}\n\t// Check tiddlers that are known from the server but not currently in the store\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\tif(!this.wiki.tiddlerExists(titles[index])) {\n\t\t\t// There must be a pending delete\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nUpdate the document body with the class \"tc-dirty\" if the wiki has unsaved/unsynced changes\n*/\nSyncer.prototype.updateDirtyStatus = function() {\n\tif($tw.browser && !this.disableUI) {\n\t\tvar dirty = this.isDirty();\n\t\t$tw.utils.toggleClass(document.body,\"tc-dirty\",dirty);\n\t\tif(!dirty) {\n\t\t\tthis.loggerConnection.clearAlerts();\n\t\t}\n\t}\n};\n\n/*\nSave an incoming tiddler in the store, and updates the associated tiddlerInfo\n*/\nSyncer.prototype.storeTiddler = function(tiddlerFields) {\n\t// Save the tiddler\n\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\tthis.wiki.addTiddler(tiddler);\n\t// Save the tiddler revision and changeCount details\n\tthis.tiddlerInfo[tiddlerFields.title] = {\n\t\trevision: this.getTiddlerRevision(tiddlerFields.title),\n\t\tadaptorInfo: this.syncadaptor.getTiddlerInfo(tiddler),\n\t\tchangeCount: this.wiki.getChangeCount(tiddlerFields.title)\n\t};\n};\n\nSyncer.prototype.getStatus = function(callback) {\n\tvar self = this;\n\t// Check if the adaptor supports getStatus()\n\tif(this.syncadaptor && this.syncadaptor.getStatus) {\n\t\t// Mark us as not logged in\n\t\tthis.wiki.addTiddler({title: this.titleIsLoggedIn,text: \"no\"});\n\t\t// Get login status\n\t\tthis.syncadaptor.getStatus(function(err,isLoggedIn,username,isReadOnly,isAnonymous) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\t// Set the various status tiddlers\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsReadOnly,text: isReadOnly ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsAnonymous,text: isAnonymous ? \"yes\" : \"no\"});\n\t\t\t\tself.wiki.addTiddler({title: self.titleIsLoggedIn,text: isLoggedIn ? \"yes\" : \"no\"});\n\t\t\t\tif(isLoggedIn) {\n\t\t\t\t\tself.wiki.addTiddler({title: self.titleUserName,text: username || \"\"});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Invoke the callback\n\t\t\tif(callback) {\n\t\t\t\tcallback(err,isLoggedIn,username);\n\t\t\t}\n\t\t});\n\t} else {\n\t\tcallback(null,true,\"UNAUTHENTICATED\");\n\t}\n};\n\n/*\nSynchronise from the server by reading the skinny tiddler list and queuing up loads for any tiddlers that we don't already have up to date\n*/\nSyncer.prototype.syncFromServer = function() {\n\tvar self = this,\n\t\tcancelNextSync = function() {\n\t\t\tif(self.pollTimerId) {\n\t\t\t\tclearTimeout(self.pollTimerId);\n\t\t\t\tself.pollTimerId = null;\n\t\t\t}\n\t\t},\n\t\ttriggerNextSync = function() {\n\t\t\tself.pollTimerId = setTimeout(function() {\n\t\t\t\tself.pollTimerId = null;\n\t\t\t\tself.syncFromServer.call(self);\n\t\t\t},self.pollTimerInterval);\n\t\t},\n\t\tsyncSystemFromServer = (self.wiki.getTiddlerText(\"$:/config/SyncSystemTiddlersFromServer\") === \"yes\" ? true : false);\n\tif(this.syncadaptor && this.syncadaptor.getUpdatedTiddlers) {\n\t\tthis.logger.log(\"Retrieving updated tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getUpdatedTiddlers(self,function(err,updates) {\n\t\t\ttriggerNextSync();\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(updates) {\n\t\t\t\t$tw.utils.each(updates.modifications,function(title) {\n\t\t\t\t\tself.titlesToBeLoaded[title] = true;\n\t\t\t\t});\n\t\t\t\t$tw.utils.each(updates.deletions,function(title) {\n\t\t\t\t\tif(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) {\n\t\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(updates.modifications.length > 0 || updates.deletions.length > 0) {\n\t\t\t\t\tself.processTaskQueue();\n\t\t\t\t}\t\t\t\t\n\t\t\t}\n\t\t});\n\t} else if(this.syncadaptor && this.syncadaptor.getSkinnyTiddlers) {\n\t\tthis.logger.log(\"Retrieving skinny tiddler list\");\n\t\tcancelNextSync();\n\t\tthis.syncadaptor.getSkinnyTiddlers(function(err,tiddlers) {\n\t\t\ttriggerNextSync();\n\t\t\t// Check for errors\n\t\t\tif(err) {\n\t\t\t\tself.displayError($tw.language.getString(\"Error/RetrievingSkinny\"),err);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// Keep track of which tiddlers we already know about have been reported this time\n\t\t\tvar previousTitles = Object.keys(self.tiddlerInfo);\n\t\t\t// Process each incoming tiddler\n\t\t\tfor(var t=0; t<tiddlers.length; t++) {\n\t\t\t\t// Get the incoming tiddler fields, and the existing tiddler\n\t\t\t\tvar tiddlerFields = tiddlers[t],\n\t\t\t\t\tincomingRevision = tiddlerFields.revision + \"\",\n\t\t\t\t\ttiddler = self.wiki.tiddlerExists(tiddlerFields.title) && self.wiki.getTiddler(tiddlerFields.title),\n\t\t\t\t\ttiddlerInfo = self.tiddlerInfo[tiddlerFields.title],\n\t\t\t\t\tcurrRevision = tiddlerInfo ? tiddlerInfo.revision : null,\n\t\t\t\t\tindexInPreviousTitles = previousTitles.indexOf(tiddlerFields.title);\n\t\t\t\tif(indexInPreviousTitles !== -1) {\n\t\t\t\t\tpreviousTitles.splice(indexInPreviousTitles,1);\n\t\t\t\t}\n\t\t\t\t// Ignore the incoming tiddler if it's the same as the revision we've already got\n\t\t\t\tif(currRevision !== incomingRevision) {\n\t\t\t\t\t// Only load the skinny version if we don't already have a fat version of the tiddler\n\t\t\t\t\tif(!tiddler || tiddler.fields.text === undefined) {\n\t\t\t\t\t\tself.storeTiddler(tiddlerFields);\n\t\t\t\t\t}\n\t\t\t\t\t// Do a full load of this tiddler\n\t\t\t\t\tself.titlesToBeLoaded[tiddlerFields.title] = true;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Delete any tiddlers that were previously reported but missing this time\n\t\t\t$tw.utils.each(previousTitles,function(title) {\n\t\t\t\tif(syncSystemFromServer || !self.wiki.isSystemTiddler(title)) {\n\t\t\t\t\tdelete self.tiddlerInfo[title];\n\t\t\t\t\tself.logger.log(\"Deleting tiddler missing from server:\",title);\n\t\t\t\t\tself.wiki.deleteTiddler(title);\n\t\t\t\t}\n\t\t\t});\n\t\t\tself.processTaskQueue();\n\t\t});\n\t}\n};\n\n/*\nForce load a tiddler from the server\n*/\nSyncer.prototype.enqueueLoadTiddler = function(title) {\n\tthis.titlesToBeLoaded[title] = true;\n\tthis.processTaskQueue();\n};\n\n/*\nLazily load a skinny tiddler if we can\n*/\nSyncer.prototype.handleLazyLoadEvent = function(title) {\n\t// Ignore if the syncadaptor doesn't handle it\n\tif(!this.syncadaptor.supportsLazyLoading) {\n\t\treturn;\n\t}\n\t// Don't lazy load the same tiddler twice\n\tif(!this.titlesHaveBeenLazyLoaded[title]) {\n\t\t// Don't lazy load if the tiddler isn't included in the sync filter\n\t\tif(this.getSyncedTiddlers().indexOf(title) !== -1) {\n\t\t\t// Mark the tiddler as needing loading, and having already been lazily loaded\n\t\t\tthis.titlesToBeLoaded[title] = true;\n\t\t\tthis.titlesHaveBeenLazyLoaded[title] = true;\n\t\t}\n\t}\n};\n\n/*\nDispay a password prompt and allow the user to login\n*/\nSyncer.prototype.handleLoginEvent = function() {\n\tvar self = this;\n\tthis.getStatus(function(err,isLoggedIn,username) {\n\t\tif(!err && !isLoggedIn) {\n\t\t\tif(self.syncadaptor && self.syncadaptor.displayLoginPrompt) {\n\t\t\t\tself.syncadaptor.displayLoginPrompt(self);\n\t\t\t} else {\n\t\t\t\tself.displayLoginPrompt();\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nDispay a password prompt\n*/\nSyncer.prototype.displayLoginPrompt = function() {\n\tvar self = this;\n\tvar promptInfo = $tw.passwordPrompt.createPrompt({\n\t\tserviceName: $tw.language.getString(\"LoginToTiddlySpace\"),\n\t\tcallback: function(data) {\n\t\t\tself.login(data.username,data.password,function(err,isLoggedIn) {\n\t\t\t\tself.syncFromServer();\n\t\t\t});\n\t\t\treturn true; // Get rid of the password prompt\n\t\t}\n\t});\n};\n\n/*\nAttempt to login to TiddlyWeb.\n\tusername: username\n\tpassword: password\n\tcallback: invoked with arguments (err,isLoggedIn)\n*/\nSyncer.prototype.login = function(username,password,callback) {\n\tthis.logger.log(\"Attempting to login as\",username);\n\tvar self = this;\n\tif(this.syncadaptor.login) {\n\t\tthis.syncadaptor.login(username,password,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.getStatus(function(err,isLoggedIn,username) {\n\t\t\t\tif(callback) {\n\t\t\t\t\tcallback(err,isLoggedIn);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t} else {\n\t\tcallback(null,true);\n\t}\n};\n\n/*\nAttempt to log out of TiddlyWeb\n*/\nSyncer.prototype.handleLogoutEvent = function() {\n\tthis.logger.log(\"Attempting to logout\");\n\tvar self = this;\n\tif(this.syncadaptor.logout) {\n\t\tthis.syncadaptor.logout(function(err) {\n\t\t\tif(err) {\n\t\t\t\tself.logger.alert(err);\n\t\t\t} else {\n\t\t\t\tself.getStatus();\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nImmediately refresh from the server\n*/\nSyncer.prototype.handleRefreshEvent = function() {\n\tthis.syncFromServer();\n};\n\n/*\nProcess the next task\n*/\nSyncer.prototype.processTaskQueue = function() {\n\tvar self = this;\n\t// Only process a task if the sync adaptor is fully initialised and we're not already performing\n\t// a task. If we are already performing a task then we'll dispatch the next one when it completes\n\tif((!this.syncadaptor.isReady || this.syncadaptor.isReady()) && this.numTasksInProgress === 0) {\n\t\t// Choose the next task to perform\n\t\tvar task = this.chooseNextTask();\n\t\t// Perform the task if we had one\n\t\tif(typeof task === \"object\" && task !== null) {\n\t\t\tthis.numTasksInProgress += 1;\n\t\t\ttask.run(function(err) {\n\t\t\t\tself.numTasksInProgress -= 1;\n\t\t\t\tif(err) {\n\t\t\t\t\tself.displayError(\"Sync error while processing \" + task.type + \" of '\" + task.title + \"'\",err);\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\tself.triggerTimeout(self.errorRetryInterval);\n\t\t\t\t} else {\n\t\t\t\t\tself.updateDirtyStatus();\n\t\t\t\t\t// Process the next task\n\t\t\t\t\tself.processTaskQueue.call(self);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// No task is ready so update the status\n\t\t\tthis.updateDirtyStatus();\n\t\t\t// And trigger a timeout if there is a pending task\n\t\t\tif(task === true) {\n\t\t\t\tthis.triggerTimeout();\t\t\t\t\n\t\t\t}\n\t\t}\n\t} else {\n\t\tthis.updateDirtyStatus();\t\t\n\t}\n};\n\nSyncer.prototype.triggerTimeout = function(interval) {\n\tvar self = this;\n\tif(!this.taskTimerId) {\n\t\tthis.taskTimerId = setTimeout(function() {\n\t\t\tself.taskTimerId = null;\n\t\t\tself.processTaskQueue.call(self);\n\t\t},interval || self.taskTimerInterval);\n\t}\n};\n\n/*\nChoose the next sync task. We prioritise saves, then deletes, then loads from the server\n\nReturns either a task object, null if there's no upcoming tasks, or the boolean true if there are pending tasks that aren't yet due\n*/\nSyncer.prototype.chooseNextTask = function() {\n\tvar thresholdLastSaved = (new Date()) - this.throttleInterval,\n\t\thavePending = null;\n\t// First we look for tiddlers that have been modified locally and need saving back to the server\n\tvar titles = this.getSyncedTiddlers();\n\tfor(var index=0; index<titles.length; index++) {\n\t\tvar title = titles[index],\n\t\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title),\n\t\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\tif(tiddler) {\n\t\t\t// If the tiddler is not known on the server, or has been modified locally no more recently than the threshold then it needs to be saved to the server\n\t\t\tvar hasChanged = !tiddlerInfo || this.wiki.getChangeCount(title) > tiddlerInfo.changeCount,\n\t\t\t\tisReadyToSave = !tiddlerInfo || !tiddlerInfo.timestampLastSaved || tiddlerInfo.timestampLastSaved < thresholdLastSaved;\n\t\t\tif(hasChanged) {\n\t\t\t\tif(isReadyToSave) {\n\t\t\t\t\treturn new SaveTiddlerTask(this,title); \t\t\t\t\t\n\t\t\t\t} else {\n\t\t\t\t\thavePending = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Second, we check tiddlers that are known from the server but not currently in the store, and so need deleting on the server\n\ttitles = Object.keys(this.tiddlerInfo);\n\tfor(index=0; index<titles.length; index++) {\n\t\ttitle = titles[index];\n\t\ttiddlerInfo = this.tiddlerInfo[title];\n\t\ttiddler = this.wiki.tiddlerExists(title) && this.wiki.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\treturn new DeleteTiddlerTask(this,title);\n\t\t}\n\t}\n\t// Check for tiddlers that need loading\n\ttitle = Object.keys(this.titlesToBeLoaded)[0];\n\tif(title) {\n\t\tdelete this.titlesToBeLoaded[title];\n\t\treturn new LoadTiddlerTask(this,title);\n\t}\n\t// No tasks are ready\n\treturn havePending;\n};\n\nfunction SaveTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"save\";\n}\n\nSaveTiddlerTask.prototype.run = function(callback) {\n\tvar self = this,\n\t\tchangeCount = this.syncer.wiki.getChangeCount(this.title),\n\t\ttiddler = this.syncer.wiki.tiddlerExists(this.title) && this.syncer.wiki.getTiddler(this.title);\n\tthis.syncer.logger.log(\"Dispatching 'save' task:\",this.title);\n\tif(tiddler) {\n\t\tthis.syncer.syncadaptor.saveTiddler(tiddler,function(err,adaptorInfo,revision) {\n\t\t\t// If there's an error, exit without changing any internal state\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\t// Adjust the info stored about this tiddler\n\t\t\tself.syncer.tiddlerInfo[self.title] = {\n\t\t\t\tchangeCount: changeCount,\n\t\t\t\tadaptorInfo: adaptorInfo,\n\t\t\t\trevision: revision,\n\t\t\t\ttimestampLastSaved: new Date()\n\t\t\t};\n\t\t\t// Invoke the callback\n\t\t\tcallback(null);\n\t\t},{\n\t\t\ttiddlerInfo: self.syncer.tiddlerInfo[self.title]\n\t\t});\n\t} else {\n\t\tthis.syncer.logger.log(\" Not Dispatching 'save' task:\",this.title,\"tiddler does not exist\");\n\t\t$tw.utils.nextTick(callback(null));\n\t}\n};\n\nfunction DeleteTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"delete\";\n}\n\nDeleteTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'delete' task:\",this.title);\n\tthis.syncer.syncadaptor.deleteTiddler(this.title,function(err) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Remove the info stored about this tiddler\n\t\tdelete self.syncer.tiddlerInfo[self.title];\n\t\tif($tw.boot.files){\n\t\t\t// Remove the tiddler from $tw.boot.files\n\t\t\tdelete $tw.boot.files[self.title];\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t},{\n\t\ttiddlerInfo: self.syncer.tiddlerInfo[this.title]\n\t});\n};\n\nfunction LoadTiddlerTask(syncer,title) {\n\tthis.syncer = syncer;\n\tthis.title = title;\n\tthis.type = \"load\";\n}\n\nLoadTiddlerTask.prototype.run = function(callback) {\n\tvar self = this;\n\tthis.syncer.logger.log(\"Dispatching 'load' task:\",this.title);\n\tthis.syncer.syncadaptor.loadTiddler(this.title,function(err,tiddlerFields) {\n\t\t// If there's an error, exit without changing any internal state\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\t// Update the info stored about this tiddler\n\t\tif(tiddlerFields) {\n\t\t\tself.syncer.storeTiddler(tiddlerFields);\n\t\t}\n\t\t// Invoke the callback\n\t\tcallback(null);\n\t});\n};\n\nexports.Syncer = Syncer;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/tiddler.js": {
"title": "$:/core/modules/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/tiddler.js\ntype: application/javascript\nmodule-type: tiddlermethod\n\nExtension methods for the $tw.Tiddler object (constructor and methods required at boot time are in boot/boot.js)\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.hasTag = function(tag) {\n\treturn this.fields.tags && this.fields.tags.indexOf(tag) !== -1;\n};\n\nexports.isPlugin = function() {\n\treturn this.fields.type === \"application/json\" && this.hasField(\"plugin-type\");\n};\n\nexports.isDraft = function() {\n\treturn this.hasField(\"draft.of\");\n};\n\nexports.getFieldString = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn \"\";\n\t}\n\t// Parse the field with the associated module (if any)\n\tvar fieldModule = $tw.Tiddler.fieldModules[field];\n\tif(fieldModule && fieldModule.stringify) {\n\t\treturn fieldModule.stringify.call(this,value);\n\t} else {\n\t\treturn value.toString();\n\t}\n};\n\n/*\nGet the value of a field as a list\n*/\nexports.getFieldList = function(field) {\n\tvar value = this.fields[field];\n\t// Check for a missing field\n\tif(value === undefined || value === null) {\n\t\treturn [];\n\t}\n\treturn $tw.utils.parseStringArray(value);\n};\n\n/*\nGet all the fields as a hashmap of strings. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStrings = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [];\n\tvar fields = {};\n\tfor(var field in this.fields) {\n\t\tif($tw.utils.hop(this.fields,field)) {\n\t\t\tif(exclude.indexOf(field) === -1) {\n\t\t\t\tfields[field] = this.getFieldString(field);\n\t\t\t}\n\t\t}\n\t}\n\treturn fields;\n};\n\n/*\nGet all the fields as a name:value block. Options:\n\texclude: an array of field names to exclude\n*/\nexports.getFieldStringBlock = function(options) {\n\toptions = options || {};\n\tvar exclude = options.exclude || [],\n\t\tfields = Object.keys(this.fields).sort(),\n\t\tresult = [];\n\tfor(var t=0; t<fields.length; t++) {\n\t\tvar field = fields[t];\n\t\tif(exclude.indexOf(field) === -1) {\n\t\t\tresult.push(field + \": \" + this.getFieldString(field));\n\t\t}\n\t}\n\treturn result.join(\"\\n\");\n};\n\nexports.getFieldDay = function(field) {\n\tif(this.cache && this.cache.day && $tw.utils.hop(this.cache.day,field) ) {\n\t\treturn this.cache.day[field];\n\t}\n\tvar day = \"\";\n\tif(this.fields[field]) {\n\t\tday = (new Date($tw.utils.parseDate(this.fields[field]))).setHours(0,0,0,0);\n\t}\n\tthis.cache.day = this.cache.day || {};\n\tthis.cache.day[field] = day;\n\treturn day;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "tiddlermethod"
},
"$:/core/modules/upgraders/plugins.js": {
"title": "$:/core/modules/upgraders/plugins.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/plugins.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that checks that plugins are newer than any already installed version\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar UPGRADE_LIBRARY_TITLE = \"$:/UpgradeLibrary\";\n\nvar BLOCKED_PLUGINS = {\n\t\"$:/themes/tiddlywiki/stickytitles\": {\n\t\tversions: [\"*\"]\n\t},\n\t\"$:/plugins/tiddlywiki/fullscreen\": {\n\t\tversions: [\"*\"]\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tupgradeLibrary,\n\t\tgetLibraryTiddler = function(title) {\n\t\t\tif(!upgradeLibrary) {\n\t\t\t\tupgradeLibrary = wiki.getTiddlerData(UPGRADE_LIBRARY_TITLE,{});\n\t\t\t\tupgradeLibrary.tiddlers = upgradeLibrary.tiddlers || {};\n\t\t\t}\n\t\t\treturn upgradeLibrary.tiddlers[title];\n\t\t};\n\n\t// Go through all the incoming tiddlers\n\t$tw.utils.each(titles,function(title) {\n\t\tvar incomingTiddler = tiddlers[title];\n\t\t// Check if we're dealing with a plugin\n\t\tif(incomingTiddler && incomingTiddler[\"plugin-type\"]) {\n\t\t\t// Check whether the plugin contains JS modules\n\t\t\tvar requiresReload = wiki.doesPluginInfoRequireReload(JSON.parse(incomingTiddler.text)) ? (wiki.getTiddlerText(\"$:/language/ControlPanel/Plugins/PluginWillRequireReload\") + \" \") : \"\";\n\t\t\tmessages[title] = requiresReload;\n\t\t\tif(incomingTiddler.version) {\n\t\t\t\t// Upgrade the incoming plugin if it is in the upgrade library\n\t\t\t\tvar libraryTiddler = getLibraryTiddler(title);\n\t\t\t\tif(libraryTiddler && libraryTiddler[\"plugin-type\"] && libraryTiddler.version) {\n\t\t\t\t\ttiddlers[title] = libraryTiddler;\n\t\t\t\t\tmessages[title] = requiresReload + $tw.language.getString(\"Import/Upgrader/Plugins/Upgraded\",{variables: {incoming: incomingTiddler.version, upgraded: libraryTiddler.version}});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// Suppress the incoming plugin if it is older than the currently installed one\n\t\t\t\tvar existingTiddler = wiki.getTiddler(title);\n\t\t\t\tif(existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t\t\t\t// Reject the incoming plugin by blanking all its fields\n\t\t\t\t\tif($tw.utils.checkVersions(existingTiddler.fields.version,incomingTiddler.version)) {\n\t\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Version\",{variables: {incoming: incomingTiddler.version, existing: existingTiddler.fields.version}});\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Check whether the plugin is on the blocked list\n\t\t\tvar blockInfo = BLOCKED_PLUGINS[title];\n\t\t\tif(blockInfo) {\n\t\t\t\tif(blockInfo.versions.indexOf(\"*\") !== -1 || (incomingTiddler.version && blockInfo.versions.indexOf(incomingTiddler.version) !== -1)) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/Plugins/Suppressed/Incompatible\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/system.js": {
"title": "$:/core/modules/upgraders/system.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/system.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that suppresses certain system tiddlers that shouldn't be imported\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar DONT_IMPORT_LIST = [\"$:/StoryList\",\"$:/HistoryList\"],\n\tDONT_IMPORT_PREFIX_LIST = [\"$:/temp/\",\"$:/state/\",\"$:/Import\"],\n\tWARN_IMPORT_PREFIX_LIST = [\"$:/core/modules/\"];\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {},\n\t\tshowAlert = false;\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tif(DONT_IMPORT_LIST.indexOf(title) !== -1) {\n\t\t\ttiddlers[title] = Object.create(null);\n\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Suppressed\");\n\t\t} else {\n\t\t\tfor(var t=0; t<DONT_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = DONT_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix) {\n\t\t\t\t\ttiddlers[title] = Object.create(null);\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/State/Suppressed\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor(var t=0; t<WARN_IMPORT_PREFIX_LIST.length; t++) {\n\t\t\t\tvar prefix = WARN_IMPORT_PREFIX_LIST[t];\n\t\t\t\tif(title.substr(0,prefix.length) === prefix && wiki.isShadowTiddler(title)) {\n\t\t\t\t\tshowAlert = true;\n\t\t\t\t\tmessages[title] = $tw.language.getString(\"Import/Upgrader/System/Warning\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\tif(showAlert) {\n\t\tvar logger = new $tw.utils.Logger(\"import\");\n\t\tlogger.alert($tw.language.getString(\"Import/Upgrader/System/Alert\"));\n\t}\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/upgraders/themetweaks.js": {
"title": "$:/core/modules/upgraders/themetweaks.js",
"text": "/*\\\ntitle: $:/core/modules/upgraders/themetweaks.js\ntype: application/javascript\nmodule-type: upgrader\n\nUpgrader module that handles the change in theme tweak storage introduced in 5.0.14-beta.\n\nPreviously, theme tweaks were stored in two data tiddlers:\n\n* $:/themes/tiddlywiki/vanilla/metrics\n* $:/themes/tiddlywiki/vanilla/settings\n\nNow, each tweak is stored in its own separate tiddler.\n\nThis upgrader copies any values from the old format to the new. The old data tiddlers are not deleted in case they have been used to store additional indexes.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar MAPPINGS = {\n\t\"$:/themes/tiddlywiki/vanilla/metrics\": {\n\t\t\"fontsize\": \"$:/themes/tiddlywiki/vanilla/metrics/fontsize\",\n\t\t\"lineheight\": \"$:/themes/tiddlywiki/vanilla/metrics/lineheight\",\n\t\t\"storyleft\": \"$:/themes/tiddlywiki/vanilla/metrics/storyleft\",\n\t\t\"storytop\": \"$:/themes/tiddlywiki/vanilla/metrics/storytop\",\n\t\t\"storyright\": \"$:/themes/tiddlywiki/vanilla/metrics/storyright\",\n\t\t\"storywidth\": \"$:/themes/tiddlywiki/vanilla/metrics/storywidth\",\n\t\t\"tiddlerwidth\": \"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"\n\t},\n\t\"$:/themes/tiddlywiki/vanilla/settings\": {\n\t\t\"fontfamily\": \"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"\n\t}\n};\n\nexports.upgrade = function(wiki,titles,tiddlers) {\n\tvar self = this,\n\t\tmessages = {};\n\t// Check for tiddlers on our list\n\t$tw.utils.each(titles,function(title) {\n\t\tvar mapping = MAPPINGS[title];\n\t\tif(mapping) {\n\t\t\tvar tiddler = new $tw.Tiddler(tiddlers[title]),\n\t\t\t\ttiddlerData = wiki.getTiddlerDataCached(tiddler,{});\n\t\t\tfor(var index in mapping) {\n\t\t\t\tvar mappedTitle = mapping[index];\n\t\t\t\tif(!tiddlers[mappedTitle] || tiddlers[mappedTitle].title !== mappedTitle) {\n\t\t\t\t\ttiddlers[mappedTitle] = {\n\t\t\t\t\t\ttitle: mappedTitle,\n\t\t\t\t\t\ttext: tiddlerData[index]\n\t\t\t\t\t};\n\t\t\t\t\tmessages[mappedTitle] = $tw.language.getString(\"Import/Upgrader/ThemeTweaks/Created\",{variables: {\n\t\t\t\t\t\tfrom: title + \"##\" + index\n\t\t\t\t\t}});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t});\n\treturn messages;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "upgrader"
},
"$:/core/modules/utils/base64-utf8/base64-utf8.module.js": {
"text": "(function(){// From https://gist.github.com/Nijikokun/5192472\n//\n// UTF8 Module\n//\n// Cleaner and modularized utf-8 encoding and decoding library for javascript.\n//\n// copyright: MIT\n// author: Nijiko Yonskai, @nijikokun, nijikokun@gmail.com\n!function(r,e,o,t){void 0!==o.module&&o.module.exports?o.module.exports=e.apply(o):void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"utf8\",[],e):o.utf8=e.apply(o)}(0,function(){return{encode:function(r){if(\"string\"!=typeof r)return r;r=r.replace(/\\r\\n/g,\"\\n\");for(var e,o=\"\",t=0;t<r.length;t++)if((e=r.charCodeAt(t))<128)o+=String.fromCharCode(e);else if(e>127&&e<2048)o+=String.fromCharCode(e>>6|192),o+=String.fromCharCode(63&e|128);else if(e>55295&&e<57344&&r.length>t+1){var i=e,n=r.charCodeAt(t+1);t++;var d=65536+(i-55296<<10|n-56320);o+=String.fromCharCode(d>>18|240),o+=String.fromCharCode(d>>12&63|128),o+=String.fromCharCode(d>>6&63|128),o+=String.fromCharCode(63&d|128)}else o+=String.fromCharCode(e>>12|224),o+=String.fromCharCode(e>>6&63|128),o+=String.fromCharCode(63&e|128);return o},decode:function(r){if(\"string\"!=typeof r)return r;for(var e=\"\",o=0,t=0;o<r.length;)if((t=r.charCodeAt(o))<128)e+=String.fromCharCode(t),o++;else if(t>191&&t<224)e+=String.fromCharCode((31&t)<<6|63&r.charCodeAt(o+1)),o+=2;else if(t>223&&t<240)e+=String.fromCharCode((15&t)<<12|(63&r.charCodeAt(o+1))<<6|63&r.charCodeAt(o+2)),o+=3;else{var i=(7&t)<<18|(63&r.charCodeAt(o+1))<<12|(63&r.charCodeAt(o+2))<<6|63&r.charCodeAt(o+3);e+=String.fromCharCode(55296+(i-65536>>10))+String.fromCharCode(56320+(i-65536&1023)),o+=4}return e}}},this),function(r,e,o,t){if(void 0!==o.module&&o.module.exports){if(t&&o.require)for(var i=0;i<t.length;i++)o[t[i]]=o.require(t[i]);o.module.exports=e.apply(o)}else void 0!==o.define&&\"function\"===o.define&&o.define.amd?define(\"base64\",t||[],e):o.base64=e.apply(o)}(0,function(r){var e=r||this.utf8,o=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";return{encode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=e.encode(r);for(var t,i,n,d,f,a,h,C=\"\",c=0;c<r.length;)d=(t=r.charCodeAt(c++))>>2,f=(3&t)<<4|(i=r.charCodeAt(c++))>>4,a=(15&i)<<2|(n=r.charCodeAt(c++))>>6,h=63&n,isNaN(i)?a=h=64:isNaN(n)&&(h=64),C+=o.charAt(d)+o.charAt(f)+o.charAt(a)+o.charAt(h);return C},decode:function(r){if(void 0===e)throw{error:\"MissingMethod\",message:\"UTF8 Module is missing.\"};if(\"string\"!=typeof r)return r;r=r.replace(/[^A-Za-z0-9\\+\\/\\=]/g,\"\");for(var t,i,n,d,f,a,h=\"\",C=0;C<r.length;)t=o.indexOf(r.charAt(C++))<<2|(d=o.indexOf(r.charAt(C++)))>>4,i=(15&d)<<4|(f=o.indexOf(r.charAt(C++)))>>2,n=(3&f)<<6|(a=o.indexOf(r.charAt(C++))),h+=String.fromCharCode(t),64!=f&&(h+=String.fromCharCode(i)),64!=a&&(h+=String.fromCharCode(n));return e.decode(h)}}},this,[\"utf8\"]);}).call(exports);",
"type": "application/javascript",
"title": "$:/core/modules/utils/base64-utf8/base64-utf8.module.js",
"module-type": "library"
},
"$:/core/modules/utils/crypto.js": {
"title": "$:/core/modules/utils/crypto.js",
"text": "/*\\\ntitle: $:/core/modules/utils/crypto.js\ntype: application/javascript\nmodule-type: utils\n\nUtility functions related to crypto.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nLook for an encrypted store area in the text of a TiddlyWiki file\n*/\nexports.extractEncryptedStoreArea = function(text) {\n\tvar encryptedStoreAreaStartMarker = \"<pre id=\\\"encryptedStoreArea\\\" type=\\\"text/plain\\\" style=\\\"display:none;\\\">\",\n\t\tencryptedStoreAreaStart = text.indexOf(encryptedStoreAreaStartMarker);\n\tif(encryptedStoreAreaStart !== -1) {\n\t\tvar encryptedStoreAreaEnd = text.indexOf(\"</pre>\",encryptedStoreAreaStart);\n\t\tif(encryptedStoreAreaEnd !== -1) {\n\t\t\treturn $tw.utils.htmlDecode(text.substring(encryptedStoreAreaStart + encryptedStoreAreaStartMarker.length,encryptedStoreAreaEnd-1));\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If the password is not provided then the password in the password store will be used\n*/\nexports.decryptStoreArea = function(encryptedStoreArea,password) {\n\tvar decryptedText = $tw.crypto.decrypt(encryptedStoreArea,password);\n\tif(decryptedText) {\n\t\tvar json = JSON.parse(decryptedText),\n\t\t\ttiddlers = [];\n\t\tfor(var title in json) {\n\t\t\tif(title !== \"$:/isEncrypted\") {\n\t\t\t\ttiddlers.push(json[title]);\n\t\t\t}\n\t\t}\n\t\treturn tiddlers;\n\t} else {\n\t\treturn null;\n\t}\n};\n\n\n/*\nAttempt to extract the tiddlers from an encrypted store area using the current password. If that fails, the user is prompted for a password.\nencryptedStoreArea: text of the TiddlyWiki encrypted store area\ncallback: function(tiddlers) called with the array of decrypted tiddlers\n\nThe following configuration settings are supported:\n\n$tw.config.usePasswordVault: causes any password entered by the user to also be put into the system password vault\n*/\nexports.decryptStoreAreaInteractive = function(encryptedStoreArea,callback,options) {\n\t// Try to decrypt with the current password\n\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea);\n\tif(tiddlers) {\n\t\tcallback(tiddlers);\n\t} else {\n\t\t// Prompt for a new password and keep trying\n\t\t$tw.passwordPrompt.createPrompt({\n\t\t\tserviceName: \"Enter a password to decrypt the imported TiddlyWiki\",\n\t\t\tnoUserName: true,\n\t\t\tcanCancel: true,\n\t\t\tsubmitText: \"Decrypt\",\n\t\t\tcallback: function(data) {\n\t\t\t\t// Exit if the user cancelled\n\t\t\t\tif(!data) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Attempt to decrypt the tiddlers\n\t\t\t\tvar tiddlers = $tw.utils.decryptStoreArea(encryptedStoreArea,data.password);\n\t\t\t\tif(tiddlers) {\n\t\t\t\t\tif($tw.config.usePasswordVault) {\n\t\t\t\t\t\t$tw.crypto.setPassword(data.password);\n\t\t\t\t\t}\n\t\t\t\t\tcallback(tiddlers);\n\t\t\t\t\t// Exit and remove the password prompt\n\t\t\t\t\treturn true;\n\t\t\t\t} else {\n\t\t\t\t\t// We didn't decrypt everything, so continue to prompt for password\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/csv.js": {
"title": "$:/core/modules/utils/csv.js",
"text": "/*\\\ntitle: $:/core/modules/utils/csv.js\ntype: application/javascript\nmodule-type: utils\n\nA barebones CSV parser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nParse a CSV string with a header row and return an array of hashmaps.\n*/\nexports.parseCsvStringWithHeader = function(text,options) {\n\toptions = options || {};\n\tvar separator = options.separator || \",\",\n\t\trows = text.split(/\\r?\\n/mg).map(function(row) {\n\t\t\treturn $tw.utils.trim(row);\n\t\t}).filter(function(row) {\n\t\t\treturn row !== \"\";\n\t\t});\n\tif(rows.length < 1) {\n\t\treturn \"Missing header row\";\n\t}\n\tvar headings = rows[0].split(separator),\n\t\tresults = [];\n\tfor(var row=1; row<rows.length; row++) {\n\t\tvar columns = rows[row].split(separator),\n\t\t\tcolumnResult = Object.create(null);\n\t\tif(columns.length !== headings.length) {\n\t\t\treturn \"Malformed CSV row '\" + rows[row] + \"'\";\n\t\t}\n\t\tfor(var column=0; column<columns.length; column++) {\n\t\t\tvar columnName = headings[column];\n\t\t\tcolumnResult[columnName] = $tw.utils.trim(columns[column] || \"\");\n\t\t}\n\t\tresults.push(columnResult);\t\t\t\n\t}\n\treturn results;\n}\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/diff-match-patch/diff_match_patch.js": {
"text": "(function(){function diff_match_patch(){this.Diff_Timeout=1;this.Diff_EditCost=4;this.Match_Threshold=.5;this.Match_Distance=1E3;this.Patch_DeleteThreshold=.5;this.Patch_Margin=4;this.Match_MaxBits=32}var DIFF_DELETE=-1,DIFF_INSERT=1,DIFF_EQUAL=0;\ndiff_match_patch.prototype.diff_main=function(a,b,c,d){\"undefined\"==typeof d&&(d=0>=this.Diff_Timeout?Number.MAX_VALUE:(new Date).getTime()+1E3*this.Diff_Timeout);if(null==a||null==b)throw Error(\"Null input. (diff_main)\");if(a==b)return a?[[DIFF_EQUAL,a]]:[];\"undefined\"==typeof c&&(c=!0);var e=c,f=this.diff_commonPrefix(a,b);c=a.substring(0,f);a=a.substring(f);b=b.substring(f);f=this.diff_commonSuffix(a,b);var g=a.substring(a.length-f);a=a.substring(0,a.length-f);b=b.substring(0,b.length-f);a=this.diff_compute_(a,\nb,e,d);c&&a.unshift([DIFF_EQUAL,c]);g&&a.push([DIFF_EQUAL,g]);this.diff_cleanupMerge(a);return a};\ndiff_match_patch.prototype.diff_compute_=function(a,b,c,d){if(!a)return[[DIFF_INSERT,b]];if(!b)return[[DIFF_DELETE,a]];var e=a.length>b.length?a:b,f=a.length>b.length?b:a,g=e.indexOf(f);return-1!=g?(c=[[DIFF_INSERT,e.substring(0,g)],[DIFF_EQUAL,f],[DIFF_INSERT,e.substring(g+f.length)]],a.length>b.length&&(c[0][0]=c[2][0]=DIFF_DELETE),c):1==f.length?[[DIFF_DELETE,a],[DIFF_INSERT,b]]:(e=this.diff_halfMatch_(a,b))?(b=e[1],f=e[3],a=e[4],e=this.diff_main(e[0],e[2],c,d),c=this.diff_main(b,f,c,d),e.concat([[DIFF_EQUAL,\na]],c)):c&&100<a.length&&100<b.length?this.diff_lineMode_(a,b,d):this.diff_bisect_(a,b,d)};\ndiff_match_patch.prototype.diff_lineMode_=function(a,b,c){var d=this.diff_linesToChars_(a,b);a=d.chars1;b=d.chars2;d=d.lineArray;a=this.diff_main(a,b,!1,c);this.diff_charsToLines_(a,d);this.diff_cleanupSemantic(a);a.push([DIFF_EQUAL,\"\"]);for(var e=d=b=0,f=\"\",g=\"\";b<a.length;){switch(a[b][0]){case DIFF_INSERT:e++;g+=a[b][1];break;case DIFF_DELETE:d++;f+=a[b][1];break;case DIFF_EQUAL:if(1<=d&&1<=e){a.splice(b-d-e,d+e);b=b-d-e;d=this.diff_main(f,g,!1,c);for(e=d.length-1;0<=e;e--)a.splice(b,0,d[e]);b+=\nd.length}d=e=0;g=f=\"\"}b++}a.pop();return a};\ndiff_match_patch.prototype.diff_bisect_=function(a,b,c){for(var d=a.length,e=b.length,f=Math.ceil((d+e)/2),g=2*f,h=Array(g),l=Array(g),k=0;k<g;k++)h[k]=-1,l[k]=-1;h[f+1]=0;l[f+1]=0;k=d-e;for(var m=0!=k%2,p=0,x=0,w=0,q=0,t=0;t<f&&!((new Date).getTime()>c);t++){for(var v=-t+p;v<=t-x;v+=2){var n=f+v;var r=v==-t||v!=t&&h[n-1]<h[n+1]?h[n+1]:h[n-1]+1;for(var y=r-v;r<d&&y<e&&a.charAt(r)==b.charAt(y);)r++,y++;h[n]=r;if(r>d)x+=2;else if(y>e)p+=2;else if(m&&(n=f+k-v,0<=n&&n<g&&-1!=l[n])){var u=d-l[n];if(r>=\nu)return this.diff_bisectSplit_(a,b,r,y,c)}}for(v=-t+w;v<=t-q;v+=2){n=f+v;u=v==-t||v!=t&&l[n-1]<l[n+1]?l[n+1]:l[n-1]+1;for(r=u-v;u<d&&r<e&&a.charAt(d-u-1)==b.charAt(e-r-1);)u++,r++;l[n]=u;if(u>d)q+=2;else if(r>e)w+=2;else if(!m&&(n=f+k-v,0<=n&&n<g&&-1!=h[n]&&(r=h[n],y=f+r-n,u=d-u,r>=u)))return this.diff_bisectSplit_(a,b,r,y,c)}}return[[DIFF_DELETE,a],[DIFF_INSERT,b]]};\ndiff_match_patch.prototype.diff_bisectSplit_=function(a,b,c,d,e){var f=a.substring(0,c),g=b.substring(0,d);a=a.substring(c);b=b.substring(d);f=this.diff_main(f,g,!1,e);e=this.diff_main(a,b,!1,e);return f.concat(e)};\ndiff_match_patch.prototype.diff_linesToChars_=function(a,b){function c(a){for(var b=\"\",c=0,f=-1,g=d.length;f<a.length-1;){f=a.indexOf(\"\\n\",c);-1==f&&(f=a.length-1);var h=a.substring(c,f+1);c=f+1;(e.hasOwnProperty?e.hasOwnProperty(h):void 0!==e[h])?b+=String.fromCharCode(e[h]):(b+=String.fromCharCode(g),e[h]=g,d[g++]=h)}return b}var d=[],e={};d[0]=\"\";var f=c(a),g=c(b);return{chars1:f,chars2:g,lineArray:d}};\ndiff_match_patch.prototype.diff_charsToLines_=function(a,b){for(var c=0;c<a.length;c++){for(var d=a[c][1],e=[],f=0;f<d.length;f++)e[f]=b[d.charCodeAt(f)];a[c][1]=e.join(\"\")}};diff_match_patch.prototype.diff_commonPrefix=function(a,b){if(!a||!b||a.charAt(0)!=b.charAt(0))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(f,e)==b.substring(f,e)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonSuffix=function(a,b){if(!a||!b||a.charAt(a.length-1)!=b.charAt(b.length-1))return 0;for(var c=0,d=Math.min(a.length,b.length),e=d,f=0;c<e;)a.substring(a.length-e,a.length-f)==b.substring(b.length-e,b.length-f)?f=c=e:d=e,e=Math.floor((d-c)/2+c);return e};\ndiff_match_patch.prototype.diff_commonOverlap_=function(a,b){var c=a.length,d=b.length;if(0==c||0==d)return 0;c>d?a=a.substring(c-d):c<d&&(b=b.substring(0,c));c=Math.min(c,d);if(a==b)return c;d=0;for(var e=1;;){var f=a.substring(c-e);f=b.indexOf(f);if(-1==f)return d;e+=f;if(0==f||a.substring(c-e)==b.substring(0,e))d=e,e++}};\ndiff_match_patch.prototype.diff_halfMatch_=function(a,b){function c(a,b,c){for(var d=a.substring(c,c+Math.floor(a.length/4)),e=-1,g=\"\",h,k,l,m;-1!=(e=b.indexOf(d,e+1));){var p=f.diff_commonPrefix(a.substring(c),b.substring(e)),u=f.diff_commonSuffix(a.substring(0,c),b.substring(0,e));g.length<u+p&&(g=b.substring(e-u,e)+b.substring(e,e+p),h=a.substring(0,c-u),k=a.substring(c+p),l=b.substring(0,e-u),m=b.substring(e+p))}return 2*g.length>=a.length?[h,k,l,m,g]:null}if(0>=this.Diff_Timeout)return null;\nvar d=a.length>b.length?a:b,e=a.length>b.length?b:a;if(4>d.length||2*e.length<d.length)return null;var f=this,g=c(d,e,Math.ceil(d.length/4));d=c(d,e,Math.ceil(d.length/2));if(g||d)g=d?g?g[4].length>d[4].length?g:d:d:g;else return null;if(a.length>b.length){d=g[0];e=g[1];var h=g[2];var l=g[3]}else h=g[0],l=g[1],d=g[2],e=g[3];return[d,e,h,l,g[4]]};\ndiff_match_patch.prototype.diff_cleanupSemantic=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=0,h=0,l=0,k=0;f<a.length;)a[f][0]==DIFF_EQUAL?(c[d++]=f,g=l,h=k,k=l=0,e=a[f][1]):(a[f][0]==DIFF_INSERT?l+=a[f][1].length:k+=a[f][1].length,e&&e.length<=Math.max(g,h)&&e.length<=Math.max(l,k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,d--,f=0<d?c[d-1]:-1,k=l=h=g=0,e=null,b=!0)),f++;b&&this.diff_cleanupMerge(a);this.diff_cleanupSemanticLossless(a);for(f=1;f<a.length;){if(a[f-1][0]==\nDIFF_DELETE&&a[f][0]==DIFF_INSERT){b=a[f-1][1];c=a[f][1];d=this.diff_commonOverlap_(b,c);e=this.diff_commonOverlap_(c,b);if(d>=e){if(d>=b.length/2||d>=c.length/2)a.splice(f,0,[DIFF_EQUAL,c.substring(0,d)]),a[f-1][1]=b.substring(0,b.length-d),a[f+1][1]=c.substring(d),f++}else if(e>=b.length/2||e>=c.length/2)a.splice(f,0,[DIFF_EQUAL,b.substring(0,e)]),a[f-1][0]=DIFF_INSERT,a[f-1][1]=c.substring(0,c.length-e),a[f+1][0]=DIFF_DELETE,a[f+1][1]=b.substring(e),f++;f++}f++}};\ndiff_match_patch.prototype.diff_cleanupSemanticLossless=function(a){function b(a,b){if(!a||!b)return 6;var c=a.charAt(a.length-1),d=b.charAt(0),e=c.match(diff_match_patch.nonAlphaNumericRegex_),f=d.match(diff_match_patch.nonAlphaNumericRegex_),g=e&&c.match(diff_match_patch.whitespaceRegex_),h=f&&d.match(diff_match_patch.whitespaceRegex_);c=g&&c.match(diff_match_patch.linebreakRegex_);d=h&&d.match(diff_match_patch.linebreakRegex_);var k=c&&a.match(diff_match_patch.blanklineEndRegex_),l=d&&b.match(diff_match_patch.blanklineStartRegex_);\nreturn k||l?5:c||d?4:e&&!g&&h?3:g||h?2:e||f?1:0}for(var c=1;c<a.length-1;){if(a[c-1][0]==DIFF_EQUAL&&a[c+1][0]==DIFF_EQUAL){var d=a[c-1][1],e=a[c][1],f=a[c+1][1],g=this.diff_commonSuffix(d,e);if(g){var h=e.substring(e.length-g);d=d.substring(0,d.length-g);e=h+e.substring(0,e.length-g);f=h+f}g=d;h=e;for(var l=f,k=b(d,e)+b(e,f);e.charAt(0)===f.charAt(0);){d+=e.charAt(0);e=e.substring(1)+f.charAt(0);f=f.substring(1);var m=b(d,e)+b(e,f);m>=k&&(k=m,g=d,h=e,l=f)}a[c-1][1]!=g&&(g?a[c-1][1]=g:(a.splice(c-\n1,1),c--),a[c][1]=h,l?a[c+1][1]=l:(a.splice(c+1,1),c--))}c++}};diff_match_patch.nonAlphaNumericRegex_=/[^a-zA-Z0-9]/;diff_match_patch.whitespaceRegex_=/\\s/;diff_match_patch.linebreakRegex_=/[\\r\\n]/;diff_match_patch.blanklineEndRegex_=/\\n\\r?\\n$/;diff_match_patch.blanklineStartRegex_=/^\\r?\\n\\r?\\n/;\ndiff_match_patch.prototype.diff_cleanupEfficiency=function(a){for(var b=!1,c=[],d=0,e=null,f=0,g=!1,h=!1,l=!1,k=!1;f<a.length;)a[f][0]==DIFF_EQUAL?(a[f][1].length<this.Diff_EditCost&&(l||k)?(c[d++]=f,g=l,h=k,e=a[f][1]):(d=0,e=null),l=k=!1):(a[f][0]==DIFF_DELETE?k=!0:l=!0,e&&(g&&h&&l&&k||e.length<this.Diff_EditCost/2&&3==g+h+l+k)&&(a.splice(c[d-1],0,[DIFF_DELETE,e]),a[c[d-1]+1][0]=DIFF_INSERT,d--,e=null,g&&h?(l=k=!0,d=0):(d--,f=0<d?c[d-1]:-1,l=k=!1),b=!0)),f++;b&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_cleanupMerge=function(a){a.push([DIFF_EQUAL,\"\"]);for(var b=0,c=0,d=0,e=\"\",f=\"\",g;b<a.length;)switch(a[b][0]){case DIFF_INSERT:d++;f+=a[b][1];b++;break;case DIFF_DELETE:c++;e+=a[b][1];b++;break;case DIFF_EQUAL:1<c+d?(0!==c&&0!==d&&(g=this.diff_commonPrefix(f,e),0!==g&&(0<b-c-d&&a[b-c-d-1][0]==DIFF_EQUAL?a[b-c-d-1][1]+=f.substring(0,g):(a.splice(0,0,[DIFF_EQUAL,f.substring(0,g)]),b++),f=f.substring(g),e=e.substring(g)),g=this.diff_commonSuffix(f,e),0!==g&&(a[b][1]=f.substring(f.length-\ng)+a[b][1],f=f.substring(0,f.length-g),e=e.substring(0,e.length-g))),0===c?a.splice(b-d,c+d,[DIFF_INSERT,f]):0===d?a.splice(b-c,c+d,[DIFF_DELETE,e]):a.splice(b-c-d,c+d,[DIFF_DELETE,e],[DIFF_INSERT,f]),b=b-c-d+(c?1:0)+(d?1:0)+1):0!==b&&a[b-1][0]==DIFF_EQUAL?(a[b-1][1]+=a[b][1],a.splice(b,1)):b++,c=d=0,f=e=\"\"}\"\"===a[a.length-1][1]&&a.pop();c=!1;for(b=1;b<a.length-1;)a[b-1][0]==DIFF_EQUAL&&a[b+1][0]==DIFF_EQUAL&&(a[b][1].substring(a[b][1].length-a[b-1][1].length)==a[b-1][1]?(a[b][1]=a[b-1][1]+a[b][1].substring(0,\na[b][1].length-a[b-1][1].length),a[b+1][1]=a[b-1][1]+a[b+1][1],a.splice(b-1,1),c=!0):a[b][1].substring(0,a[b+1][1].length)==a[b+1][1]&&(a[b-1][1]+=a[b+1][1],a[b][1]=a[b][1].substring(a[b+1][1].length)+a[b+1][1],a.splice(b+1,1),c=!0)),b++;c&&this.diff_cleanupMerge(a)};\ndiff_match_patch.prototype.diff_xIndex=function(a,b){var c=0,d=0,e=0,f=0,g;for(g=0;g<a.length;g++){a[g][0]!==DIFF_INSERT&&(c+=a[g][1].length);a[g][0]!==DIFF_DELETE&&(d+=a[g][1].length);if(c>b)break;e=c;f=d}return a.length!=g&&a[g][0]===DIFF_DELETE?f:f+(b-e)};\ndiff_match_patch.prototype.diff_prettyHtml=function(a){for(var b=[],c=/&/g,d=/</g,e=/>/g,f=/\\n/g,g=0;g<a.length;g++){var h=a[g][0],l=a[g][1].replace(c,\"&\").replace(d,\"<\").replace(e,\">\").replace(f,\"¶<br>\");switch(h){case DIFF_INSERT:b[g]='<ins style=\"background:#e6ffe6;\">'+l+\"</ins>\";break;case DIFF_DELETE:b[g]='<del style=\"background:#ffe6e6;\">'+l+\"</del>\";break;case DIFF_EQUAL:b[g]=\"<span>\"+l+\"</span>\"}}return b.join(\"\")};\ndiff_match_patch.prototype.diff_text1=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_INSERT&&(b[c]=a[c][1]);return b.join(\"\")};diff_match_patch.prototype.diff_text2=function(a){for(var b=[],c=0;c<a.length;c++)a[c][0]!==DIFF_DELETE&&(b[c]=a[c][1]);return b.join(\"\")};\ndiff_match_patch.prototype.diff_levenshtein=function(a){for(var b=0,c=0,d=0,e=0;e<a.length;e++){var f=a[e][1];switch(a[e][0]){case DIFF_INSERT:c+=f.length;break;case DIFF_DELETE:d+=f.length;break;case DIFF_EQUAL:b+=Math.max(c,d),d=c=0}}return b+=Math.max(c,d)};\ndiff_match_patch.prototype.diff_toDelta=function(a){for(var b=[],c=0;c<a.length;c++)switch(a[c][0]){case DIFF_INSERT:b[c]=\"+\"+encodeURI(a[c][1]);break;case DIFF_DELETE:b[c]=\"-\"+a[c][1].length;break;case DIFF_EQUAL:b[c]=\"=\"+a[c][1].length}return b.join(\"\\t\").replace(/%20/g,\" \")};\ndiff_match_patch.prototype.diff_fromDelta=function(a,b){for(var c=[],d=0,e=0,f=b.split(/\\t/g),g=0;g<f.length;g++){var h=f[g].substring(1);switch(f[g].charAt(0)){case \"+\":try{c[d++]=[DIFF_INSERT,decodeURI(h)]}catch(k){throw Error(\"Illegal escape in diff_fromDelta: \"+h);}break;case \"-\":case \"=\":var l=parseInt(h,10);if(isNaN(l)||0>l)throw Error(\"Invalid number in diff_fromDelta: \"+h);h=a.substring(e,e+=l);\"=\"==f[g].charAt(0)?c[d++]=[DIFF_EQUAL,h]:c[d++]=[DIFF_DELETE,h];break;default:if(f[g])throw Error(\"Invalid diff operation in diff_fromDelta: \"+\nf[g]);}}if(e!=a.length)throw Error(\"Delta length (\"+e+\") does not equal source text length (\"+a.length+\").\");return c};diff_match_patch.prototype.match_main=function(a,b,c){if(null==a||null==b||null==c)throw Error(\"Null input. (match_main)\");c=Math.max(0,Math.min(c,a.length));return a==b?0:a.length?a.substring(c,c+b.length)==b?c:this.match_bitap_(a,b,c):-1};\ndiff_match_patch.prototype.match_bitap_=function(a,b,c){function d(a,d){var e=a/b.length,g=Math.abs(c-d);return f.Match_Distance?e+g/f.Match_Distance:g?1:e}if(b.length>this.Match_MaxBits)throw Error(\"Pattern too long for this browser.\");var e=this.match_alphabet_(b),f=this,g=this.Match_Threshold,h=a.indexOf(b,c);-1!=h&&(g=Math.min(d(0,h),g),h=a.lastIndexOf(b,c+b.length),-1!=h&&(g=Math.min(d(0,h),g)));var l=1<<b.length-1;h=-1;for(var k,m,p=b.length+a.length,x,w=0;w<b.length;w++){k=0;for(m=p;k<m;)d(w,\nc+m)<=g?k=m:p=m,m=Math.floor((p-k)/2+k);p=m;k=Math.max(1,c-m+1);var q=Math.min(c+m,a.length)+b.length;m=Array(q+2);for(m[q+1]=(1<<w)-1;q>=k;q--){var t=e[a.charAt(q-1)];m[q]=0===w?(m[q+1]<<1|1)&t:(m[q+1]<<1|1)&t|(x[q+1]|x[q])<<1|1|x[q+1];if(m[q]&l&&(t=d(w,q-1),t<=g))if(g=t,h=q-1,h>c)k=Math.max(1,2*c-h);else break}if(d(w+1,c)>g)break;x=m}return h};\ndiff_match_patch.prototype.match_alphabet_=function(a){for(var b={},c=0;c<a.length;c++)b[a.charAt(c)]=0;for(c=0;c<a.length;c++)b[a.charAt(c)]|=1<<a.length-c-1;return b};\ndiff_match_patch.prototype.patch_addContext_=function(a,b){if(0!=b.length){for(var c=b.substring(a.start2,a.start2+a.length1),d=0;b.indexOf(c)!=b.lastIndexOf(c)&&c.length<this.Match_MaxBits-this.Patch_Margin-this.Patch_Margin;)d+=this.Patch_Margin,c=b.substring(a.start2-d,a.start2+a.length1+d);d+=this.Patch_Margin;(c=b.substring(a.start2-d,a.start2))&&a.diffs.unshift([DIFF_EQUAL,c]);(d=b.substring(a.start2+a.length1,a.start2+a.length1+d))&&a.diffs.push([DIFF_EQUAL,d]);a.start1-=c.length;a.start2-=\nc.length;a.length1+=c.length+d.length;a.length2+=c.length+d.length}};\ndiff_match_patch.prototype.patch_make=function(a,b,c){if(\"string\"==typeof a&&\"string\"==typeof b&&\"undefined\"==typeof c){var d=a;b=this.diff_main(d,b,!0);2<b.length&&(this.diff_cleanupSemantic(b),this.diff_cleanupEfficiency(b))}else if(a&&\"object\"==typeof a&&\"undefined\"==typeof b&&\"undefined\"==typeof c)b=a,d=this.diff_text1(b);else if(\"string\"==typeof a&&b&&\"object\"==typeof b&&\"undefined\"==typeof c)d=a;else if(\"string\"==typeof a&&\"string\"==typeof b&&c&&\"object\"==typeof c)d=a,b=c;else throw Error(\"Unknown call format to patch_make.\");\nif(0===b.length)return[];c=[];a=new diff_match_patch.patch_obj;for(var e=0,f=0,g=0,h=d,l=0;l<b.length;l++){var k=b[l][0],m=b[l][1];e||k===DIFF_EQUAL||(a.start1=f,a.start2=g);switch(k){case DIFF_INSERT:a.diffs[e++]=b[l];a.length2+=m.length;d=d.substring(0,g)+m+d.substring(g);break;case DIFF_DELETE:a.length1+=m.length;a.diffs[e++]=b[l];d=d.substring(0,g)+d.substring(g+m.length);break;case DIFF_EQUAL:m.length<=2*this.Patch_Margin&&e&&b.length!=l+1?(a.diffs[e++]=b[l],a.length1+=m.length,a.length2+=m.length):\nm.length>=2*this.Patch_Margin&&e&&(this.patch_addContext_(a,h),c.push(a),a=new diff_match_patch.patch_obj,e=0,h=d,f=g)}k!==DIFF_INSERT&&(f+=m.length);k!==DIFF_DELETE&&(g+=m.length)}e&&(this.patch_addContext_(a,h),c.push(a));return c};\ndiff_match_patch.prototype.patch_deepCopy=function(a){for(var b=[],c=0;c<a.length;c++){var d=a[c],e=new diff_match_patch.patch_obj;e.diffs=[];for(var f=0;f<d.diffs.length;f++)e.diffs[f]=d.diffs[f].slice();e.start1=d.start1;e.start2=d.start2;e.length1=d.length1;e.length2=d.length2;b[c]=e}return b};\ndiff_match_patch.prototype.patch_apply=function(a,b){if(0==a.length)return[b,[]];a=this.patch_deepCopy(a);var c=this.patch_addPadding(a);b=c+b+c;this.patch_splitMax(a);for(var d=0,e=[],f=0;f<a.length;f++){var g=a[f].start2+d,h=this.diff_text1(a[f].diffs),l=-1;if(h.length>this.Match_MaxBits){var k=this.match_main(b,h.substring(0,this.Match_MaxBits),g);-1!=k&&(l=this.match_main(b,h.substring(h.length-this.Match_MaxBits),g+h.length-this.Match_MaxBits),-1==l||k>=l)&&(k=-1)}else k=this.match_main(b,h,\ng);if(-1==k)e[f]=!1,d-=a[f].length2-a[f].length1;else if(e[f]=!0,d=k-g,g=-1==l?b.substring(k,k+h.length):b.substring(k,l+this.Match_MaxBits),h==g)b=b.substring(0,k)+this.diff_text2(a[f].diffs)+b.substring(k+h.length);else if(g=this.diff_main(h,g,!1),h.length>this.Match_MaxBits&&this.diff_levenshtein(g)/h.length>this.Patch_DeleteThreshold)e[f]=!1;else{this.diff_cleanupSemanticLossless(g);h=0;var m;for(l=0;l<a[f].diffs.length;l++){var p=a[f].diffs[l];p[0]!==DIFF_EQUAL&&(m=this.diff_xIndex(g,h));p[0]===\nDIFF_INSERT?b=b.substring(0,k+m)+p[1]+b.substring(k+m):p[0]===DIFF_DELETE&&(b=b.substring(0,k+m)+b.substring(k+this.diff_xIndex(g,h+p[1].length)));p[0]!==DIFF_DELETE&&(h+=p[1].length)}}}b=b.substring(c.length,b.length-c.length);return[b,e]};\ndiff_match_patch.prototype.patch_addPadding=function(a){for(var b=this.Patch_Margin,c=\"\",d=1;d<=b;d++)c+=String.fromCharCode(d);for(d=0;d<a.length;d++)a[d].start1+=b,a[d].start2+=b;d=a[0];var e=d.diffs;if(0==e.length||e[0][0]!=DIFF_EQUAL)e.unshift([DIFF_EQUAL,c]),d.start1-=b,d.start2-=b,d.length1+=b,d.length2+=b;else if(b>e[0][1].length){var f=b-e[0][1].length;e[0][1]=c.substring(e[0][1].length)+e[0][1];d.start1-=f;d.start2-=f;d.length1+=f;d.length2+=f}d=a[a.length-1];e=d.diffs;0==e.length||e[e.length-\n1][0]!=DIFF_EQUAL?(e.push([DIFF_EQUAL,c]),d.length1+=b,d.length2+=b):b>e[e.length-1][1].length&&(f=b-e[e.length-1][1].length,e[e.length-1][1]+=c.substring(0,f),d.length1+=f,d.length2+=f);return c};\ndiff_match_patch.prototype.patch_splitMax=function(a){for(var b=this.Match_MaxBits,c=0;c<a.length;c++)if(!(a[c].length1<=b)){var d=a[c];a.splice(c--,1);for(var e=d.start1,f=d.start2,g=\"\";0!==d.diffs.length;){var h=new diff_match_patch.patch_obj,l=!0;h.start1=e-g.length;h.start2=f-g.length;\"\"!==g&&(h.length1=h.length2=g.length,h.diffs.push([DIFF_EQUAL,g]));for(;0!==d.diffs.length&&h.length1<b-this.Patch_Margin;){g=d.diffs[0][0];var k=d.diffs[0][1];g===DIFF_INSERT?(h.length2+=k.length,f+=k.length,h.diffs.push(d.diffs.shift()),\nl=!1):g===DIFF_DELETE&&1==h.diffs.length&&h.diffs[0][0]==DIFF_EQUAL&&k.length>2*b?(h.length1+=k.length,e+=k.length,l=!1,h.diffs.push([g,k]),d.diffs.shift()):(k=k.substring(0,b-h.length1-this.Patch_Margin),h.length1+=k.length,e+=k.length,g===DIFF_EQUAL?(h.length2+=k.length,f+=k.length):l=!1,h.diffs.push([g,k]),k==d.diffs[0][1]?d.diffs.shift():d.diffs[0][1]=d.diffs[0][1].substring(k.length))}g=this.diff_text2(h.diffs);g=g.substring(g.length-this.Patch_Margin);k=this.diff_text1(d.diffs).substring(0,\nthis.Patch_Margin);\"\"!==k&&(h.length1+=k.length,h.length2+=k.length,0!==h.diffs.length&&h.diffs[h.diffs.length-1][0]===DIFF_EQUAL?h.diffs[h.diffs.length-1][1]+=k:h.diffs.push([DIFF_EQUAL,k]));l||a.splice(++c,0,h)}}};diff_match_patch.prototype.patch_toText=function(a){for(var b=[],c=0;c<a.length;c++)b[c]=a[c];return b.join(\"\")};\ndiff_match_patch.prototype.patch_fromText=function(a){var b=[];if(!a)return b;a=a.split(\"\\n\");for(var c=0,d=/^@@ -(\\d+),?(\\d*) \\+(\\d+),?(\\d*) @@$/;c<a.length;){var e=a[c].match(d);if(!e)throw Error(\"Invalid patch string: \"+a[c]);var f=new diff_match_patch.patch_obj;b.push(f);f.start1=parseInt(e[1],10);\"\"===e[2]?(f.start1--,f.length1=1):\"0\"==e[2]?f.length1=0:(f.start1--,f.length1=parseInt(e[2],10));f.start2=parseInt(e[3],10);\"\"===e[4]?(f.start2--,f.length2=1):\"0\"==e[4]?f.length2=0:(f.start2--,f.length2=\nparseInt(e[4],10));for(c++;c<a.length;){e=a[c].charAt(0);try{var g=decodeURI(a[c].substring(1))}catch(h){throw Error(\"Illegal escape in patch_fromText: \"+g);}if(\"-\"==e)f.diffs.push([DIFF_DELETE,g]);else if(\"+\"==e)f.diffs.push([DIFF_INSERT,g]);else if(\" \"==e)f.diffs.push([DIFF_EQUAL,g]);else if(\"@\"==e)break;else if(\"\"!==e)throw Error('Invalid patch mode \"'+e+'\" in: '+g);c++}}return b};diff_match_patch.patch_obj=function(){this.diffs=[];this.start2=this.start1=null;this.length2=this.length1=0};\ndiff_match_patch.patch_obj.prototype.toString=function(){for(var a=[\"@@ -\"+(0===this.length1?this.start1+\",0\":1==this.length1?this.start1+1:this.start1+1+\",\"+this.length1)+\" +\"+(0===this.length2?this.start2+\",0\":1==this.length2?this.start2+1:this.start2+1+\",\"+this.length2)+\" @@\\n\"],b,c=0;c<this.diffs.length;c++){switch(this.diffs[c][0]){case DIFF_INSERT:b=\"+\";break;case DIFF_DELETE:b=\"-\";break;case DIFF_EQUAL:b=\" \"}a[c+1]=b+encodeURI(this.diffs[c][1])+\"\\n\"}return a.join(\"\").replace(/%20/g,\" \")};\nthis.diff_match_patch=diff_match_patch;this.DIFF_DELETE=DIFF_DELETE;this.DIFF_INSERT=DIFF_INSERT;this.DIFF_EQUAL=DIFF_EQUAL;\n}).call(exports);",
"type": "application/javascript",
"title": "$:/core/modules/utils/diff-match-patch/diff_match_patch.js",
"module-type": "library"
},
"$:/core/modules/utils/dom/animations/slide.js": {
"title": "$:/core/modules/utils/dom/animations/slide.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animations/slide.js\ntype: application/javascript\nmodule-type: animation\n\nA simple slide animation that varies the height of the element\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction slideOpen(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration();\n\t// Get the current height of the domNode\n\tvar computedStyle = window.getComputedStyle(domNode),\n\t\tcurrMarginBottom = parseInt(computedStyle.marginBottom,10),\n\t\tcurrMarginTop = parseInt(computedStyle.marginTop,10),\n\t\tcurrPaddingBottom = parseInt(computedStyle.paddingBottom,10),\n\t\tcurrPaddingTop = parseInt(computedStyle.paddingTop,10),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Reset the margin once the transition is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"none\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginBottom: currMarginBottom + \"px\"},\n\t\t{marginTop: currMarginTop + \"px\"},\n\t\t{paddingBottom: currPaddingBottom + \"px\"},\n\t\t{paddingTop: currPaddingTop + \"px\"},\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n}\n\nfunction slideClosed(domNode,options) {\n\toptions = options || {};\n\tvar duration = options.duration || $tw.utils.getAnimationDuration(),\n\t\tcurrHeight = domNode.offsetHeight;\n\t// Clear the properties we've set when the animation is over\n\tsetTimeout(function() {\n\t\t$tw.utils.setStyle(domNode,[\n\t\t\t{transition: \"none\"},\n\t\t\t{marginBottom: \"\"},\n\t\t\t{marginTop: \"\"},\n\t\t\t{paddingBottom: \"\"},\n\t\t\t{paddingTop: \"\"},\n\t\t\t{height: \"auto\"},\n\t\t\t{opacity: \"\"}\n\t\t]);\n\t\tif(options.callback) {\n\t\t\toptions.callback();\n\t\t}\n\t},duration);\n\t// Set up the initial position of the element\n\t$tw.utils.setStyle(domNode,[\n\t\t{height: currHeight + \"px\"},\n\t\t{opacity: \"1\"}\n\t]);\n\t$tw.utils.forceLayout(domNode);\n\t// Transition to the final position\n\t$tw.utils.setStyle(domNode,[\n\t\t{transition: \"margin-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"margin-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-top \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"padding-bottom \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"height \" + duration + \"ms ease-in-out, \" +\n\t\t\t\t\t\"opacity \" + duration + \"ms ease-in-out\"},\n\t\t{marginTop: \"0px\"},\n\t\t{marginBottom: \"0px\"},\n\t\t{paddingTop: \"0px\"},\n\t\t{paddingBottom: \"0px\"},\n\t\t{height: \"0px\"},\n\t\t{opacity: \"0\"}\n\t]);\n}\n\nexports.slide = {\n\topen: slideOpen,\n\tclose: slideClosed\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "animation"
},
"$:/core/modules/utils/dom/animator.js": {
"title": "$:/core/modules/utils/dom/animator.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/animator.js\ntype: application/javascript\nmodule-type: utils\n\nOrchestrates animations and transitions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Animator() {\n\t// Get the registered animation modules\n\tthis.animations = {};\n\t$tw.modules.applyMethods(\"animation\",this.animations);\n}\n\nAnimator.prototype.perform = function(type,domNode,options) {\n\toptions = options || {};\n\t// Find an animation that can handle this type\n\tvar chosenAnimation;\n\t$tw.utils.each(this.animations,function(animation,name) {\n\t\tif($tw.utils.hop(animation,type)) {\n\t\t\tchosenAnimation = animation[type];\n\t\t}\n\t});\n\tif(!chosenAnimation) {\n\t\tchosenAnimation = function(domNode,options) {\n\t\t\tif(options.callback) {\n\t\t\t\toptions.callback();\n\t\t\t}\n\t\t};\n\t}\n\t// Call the animation\n\tchosenAnimation(domNode,options);\n};\n\nexports.Animator = Animator;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/browser.js": {
"title": "$:/core/modules/utils/dom/browser.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/browser.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser feature detection\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nSet style properties of an element\n\telement: dom node\n\tstyles: ordered array of {name: value} pairs\n*/\nexports.setStyle = function(element,styles) {\n\tif(element.nodeType === 1) { // Element.ELEMENT_NODE\n\t\tfor(var t=0; t<styles.length; t++) {\n\t\t\tfor(var styleName in styles[t]) {\n\t\t\t\telement.style[$tw.utils.convertStyleNameToPropertyName(styleName)] = styles[t][styleName];\n\t\t\t}\n\t\t}\n\t}\n};\n\n/*\nConverts a standard CSS property name into the local browser-specific equivalent. For example:\n\t\"background-color\" --> \"backgroundColor\"\n\t\"transition\" --> \"webkitTransition\"\n*/\n\nvar styleNameCache = {}; // We'll cache the style name conversions\n\nexports.convertStyleNameToPropertyName = function(styleName) {\n\t// Return from the cache if we can\n\tif(styleNameCache[styleName]) {\n\t\treturn styleNameCache[styleName];\n\t}\n\t// Convert it by first removing any hyphens\n\tvar propertyName = $tw.utils.unHyphenateCss(styleName);\n\t// Then check if it needs a prefix\n\tif($tw.browser && document.body.style[propertyName] === undefined) {\n\t\tvar prefixes = [\"O\",\"MS\",\"Moz\",\"webkit\"];\n\t\tfor(var t=0; t<prefixes.length; t++) {\n\t\t\tvar prefixedName = prefixes[t] + propertyName.substr(0,1).toUpperCase() + propertyName.substr(1);\n\t\t\tif(document.body.style[prefixedName] !== undefined) {\n\t\t\t\tpropertyName = prefixedName;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\t// Put it in the cache too\n\tstyleNameCache[styleName] = propertyName;\n\treturn propertyName;\n};\n\n/*\nConverts a JS format CSS property name back into the dashed form used in CSS declarations. For example:\n\t\"backgroundColor\" --> \"background-color\"\n\t\"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.convertPropertyNameToStyleName = function(propertyName) {\n\t// Rehyphenate the name\n\tvar styleName = $tw.utils.hyphenateCss(propertyName);\n\t// If there's a webkit prefix, add a dash (other browsers have uppercase prefixes, and so get the dash automatically)\n\tif(styleName.indexOf(\"webkit\") === 0) {\n\t\tstyleName = \"-\" + styleName;\n\t} else if(styleName.indexOf(\"-m-s\") === 0) {\n\t\tstyleName = \"-ms\" + styleName.substr(4);\n\t}\n\treturn styleName;\n};\n\n/*\nRound trip a stylename to a property name and back again. For example:\n\t\"transform\" --> \"webkitTransform\" --> \"-webkit-transform\"\n*/\nexports.roundTripPropertyName = function(propertyName) {\n\treturn $tw.utils.convertPropertyNameToStyleName($tw.utils.convertStyleNameToPropertyName(propertyName));\n};\n\n/*\nConverts a standard event name into the local browser specific equivalent. For example:\n\t\"animationEnd\" --> \"webkitAnimationEnd\"\n*/\n\nvar eventNameCache = {}; // We'll cache the conversions\n\nvar eventNameMappings = {\n\t\"transitionEnd\": {\n\t\tcorrespondingCssProperty: \"transition\",\n\t\tmappings: {\n\t\t\ttransition: \"transitionend\",\n\t\t\tOTransition: \"oTransitionEnd\",\n\t\t\tMSTransition: \"msTransitionEnd\",\n\t\t\tMozTransition: \"transitionend\",\n\t\t\twebkitTransition: \"webkitTransitionEnd\"\n\t\t}\n\t},\n\t\"animationEnd\": {\n\t\tcorrespondingCssProperty: \"animation\",\n\t\tmappings: {\n\t\t\tanimation: \"animationend\",\n\t\t\tOAnimation: \"oAnimationEnd\",\n\t\t\tMSAnimation: \"msAnimationEnd\",\n\t\t\tMozAnimation: \"animationend\",\n\t\t\twebkitAnimation: \"webkitAnimationEnd\"\n\t\t}\n\t}\n};\n\nexports.convertEventName = function(eventName) {\n\tif(eventNameCache[eventName]) {\n\t\treturn eventNameCache[eventName];\n\t}\n\tvar newEventName = eventName,\n\t\tmappings = eventNameMappings[eventName];\n\tif(mappings) {\n\t\tvar convertedProperty = $tw.utils.convertStyleNameToPropertyName(mappings.correspondingCssProperty);\n\t\tif(mappings.mappings[convertedProperty]) {\n\t\t\tnewEventName = mappings.mappings[convertedProperty];\n\t\t}\n\t}\n\t// Put it in the cache too\n\teventNameCache[eventName] = newEventName;\n\treturn newEventName;\n};\n\n/*\nReturn the names of the fullscreen APIs\n*/\nexports.getFullScreenApis = function() {\n\tvar d = document,\n\t\tdb = d.body,\n\t\tresult = {\n\t\t\"_requestFullscreen\": db.webkitRequestFullscreen !== undefined ? \"webkitRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.mozRequestFullScreen !== undefined ? \"mozRequestFullScreen\" :\n\t\t\t\t\t\t\tdb.msRequestFullscreen !== undefined ? \"msRequestFullscreen\" :\n\t\t\t\t\t\t\tdb.requestFullscreen !== undefined ? \"requestFullscreen\" : \"\",\n\t\t\"_exitFullscreen\": d.webkitExitFullscreen !== undefined ? \"webkitExitFullscreen\" :\n\t\t\t\t\t\t\td.mozCancelFullScreen !== undefined ? \"mozCancelFullScreen\" :\n\t\t\t\t\t\t\td.msExitFullscreen !== undefined ? \"msExitFullscreen\" :\n\t\t\t\t\t\t\td.exitFullscreen !== undefined ? \"exitFullscreen\" : \"\",\n\t\t\"_fullscreenElement\": d.webkitFullscreenElement !== undefined ? \"webkitFullscreenElement\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozFullScreenElement\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"msFullscreenElement\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenElement\" : \"\",\n\t\t\"_fullscreenChange\": d.webkitFullscreenElement !== undefined ? \"webkitfullscreenchange\" :\n\t\t\t\t\t\t\td.mozFullScreenElement !== undefined ? \"mozfullscreenchange\" :\n\t\t\t\t\t\t\td.msFullscreenElement !== undefined ? \"MSFullscreenChange\" :\n\t\t\t\t\t\t\td.fullscreenElement !== undefined ? \"fullscreenchange\" : \"\"\n\t};\n\tif(!result._requestFullscreen || !result._exitFullscreen || !result._fullscreenElement || !result._fullscreenChange) {\n\t\treturn null;\n\t} else {\n\t\treturn result;\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/csscolorparser.js": {
"title": "$:/core/modules/utils/dom/csscolorparser.js",
"text": "// (c) Dean McNamee <dean@gmail.com>, 2012.\n//\n// https://github.com/deanm/css-color-parser-js\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n// http://www.w3.org/TR/css3-color/\nvar kCSSColorTable = {\n \"transparent\": [0,0,0,0], \"aliceblue\": [240,248,255,1],\n \"antiquewhite\": [250,235,215,1], \"aqua\": [0,255,255,1],\n \"aquamarine\": [127,255,212,1], \"azure\": [240,255,255,1],\n \"beige\": [245,245,220,1], \"bisque\": [255,228,196,1],\n \"black\": [0,0,0,1], \"blanchedalmond\": [255,235,205,1],\n \"blue\": [0,0,255,1], \"blueviolet\": [138,43,226,1],\n \"brown\": [165,42,42,1], \"burlywood\": [222,184,135,1],\n \"cadetblue\": [95,158,160,1], \"chartreuse\": [127,255,0,1],\n \"chocolate\": [210,105,30,1], \"coral\": [255,127,80,1],\n \"cornflowerblue\": [100,149,237,1], \"cornsilk\": [255,248,220,1],\n \"crimson\": [220,20,60,1], \"cyan\": [0,255,255,1],\n \"darkblue\": [0,0,139,1], \"darkcyan\": [0,139,139,1],\n \"darkgoldenrod\": [184,134,11,1], \"darkgray\": [169,169,169,1],\n \"darkgreen\": [0,100,0,1], \"darkgrey\": [169,169,169,1],\n \"darkkhaki\": [189,183,107,1], \"darkmagenta\": [139,0,139,1],\n \"darkolivegreen\": [85,107,47,1], \"darkorange\": [255,140,0,1],\n \"darkorchid\": [153,50,204,1], \"darkred\": [139,0,0,1],\n \"darksalmon\": [233,150,122,1], \"darkseagreen\": [143,188,143,1],\n \"darkslateblue\": [72,61,139,1], \"darkslategray\": [47,79,79,1],\n \"darkslategrey\": [47,79,79,1], \"darkturquoise\": [0,206,209,1],\n \"darkviolet\": [148,0,211,1], \"deeppink\": [255,20,147,1],\n \"deepskyblue\": [0,191,255,1], \"dimgray\": [105,105,105,1],\n \"dimgrey\": [105,105,105,1], \"dodgerblue\": [30,144,255,1],\n \"firebrick\": [178,34,34,1], \"floralwhite\": [255,250,240,1],\n \"forestgreen\": [34,139,34,1], \"fuchsia\": [255,0,255,1],\n \"gainsboro\": [220,220,220,1], \"ghostwhite\": [248,248,255,1],\n \"gold\": [255,215,0,1], \"goldenrod\": [218,165,32,1],\n \"gray\": [128,128,128,1], \"green\": [0,128,0,1],\n \"greenyellow\": [173,255,47,1], \"grey\": [128,128,128,1],\n \"honeydew\": [240,255,240,1], \"hotpink\": [255,105,180,1],\n \"indianred\": [205,92,92,1], \"indigo\": [75,0,130,1],\n \"ivory\": [255,255,240,1], \"khaki\": [240,230,140,1],\n \"lavender\": [230,230,250,1], \"lavenderblush\": [255,240,245,1],\n \"lawngreen\": [124,252,0,1], \"lemonchiffon\": [255,250,205,1],\n \"lightblue\": [173,216,230,1], \"lightcoral\": [240,128,128,1],\n \"lightcyan\": [224,255,255,1], \"lightgoldenrodyellow\": [250,250,210,1],\n \"lightgray\": [211,211,211,1], \"lightgreen\": [144,238,144,1],\n \"lightgrey\": [211,211,211,1], \"lightpink\": [255,182,193,1],\n \"lightsalmon\": [255,160,122,1], \"lightseagreen\": [32,178,170,1],\n \"lightskyblue\": [135,206,250,1], \"lightslategray\": [119,136,153,1],\n \"lightslategrey\": [119,136,153,1], \"lightsteelblue\": [176,196,222,1],\n \"lightyellow\": [255,255,224,1], \"lime\": [0,255,0,1],\n \"limegreen\": [50,205,50,1], \"linen\": [250,240,230,1],\n \"magenta\": [255,0,255,1], \"maroon\": [128,0,0,1],\n \"mediumaquamarine\": [102,205,170,1], \"mediumblue\": [0,0,205,1],\n \"mediumorchid\": [186,85,211,1], \"mediumpurple\": [147,112,219,1],\n \"mediumseagreen\": [60,179,113,1], \"mediumslateblue\": [123,104,238,1],\n \"mediumspringgreen\": [0,250,154,1], \"mediumturquoise\": [72,209,204,1],\n \"mediumvioletred\": [199,21,133,1], \"midnightblue\": [25,25,112,1],\n \"mintcream\": [245,255,250,1], \"mistyrose\": [255,228,225,1],\n \"moccasin\": [255,228,181,1], \"navajowhite\": [255,222,173,1],\n \"navy\": [0,0,128,1], \"oldlace\": [253,245,230,1],\n \"olive\": [128,128,0,1], \"olivedrab\": [107,142,35,1],\n \"orange\": [255,165,0,1], \"orangered\": [255,69,0,1],\n \"orchid\": [218,112,214,1], \"palegoldenrod\": [238,232,170,1],\n \"palegreen\": [152,251,152,1], \"paleturquoise\": [175,238,238,1],\n \"palevioletred\": [219,112,147,1], \"papayawhip\": [255,239,213,1],\n \"peachpuff\": [255,218,185,1], \"peru\": [205,133,63,1],\n \"pink\": [255,192,203,1], \"plum\": [221,160,221,1],\n \"powderblue\": [176,224,230,1], \"purple\": [128,0,128,1],\n \"red\": [255,0,0,1], \"rosybrown\": [188,143,143,1],\n \"royalblue\": [65,105,225,1], \"saddlebrown\": [139,69,19,1],\n \"salmon\": [250,128,114,1], \"sandybrown\": [244,164,96,1],\n \"seagreen\": [46,139,87,1], \"seashell\": [255,245,238,1],\n \"sienna\": [160,82,45,1], \"silver\": [192,192,192,1],\n \"skyblue\": [135,206,235,1], \"slateblue\": [106,90,205,1],\n \"slategray\": [112,128,144,1], \"slategrey\": [112,128,144,1],\n \"snow\": [255,250,250,1], \"springgreen\": [0,255,127,1],\n \"steelblue\": [70,130,180,1], \"tan\": [210,180,140,1],\n \"teal\": [0,128,128,1], \"thistle\": [216,191,216,1],\n \"tomato\": [255,99,71,1], \"turquoise\": [64,224,208,1],\n \"violet\": [238,130,238,1], \"wheat\": [245,222,179,1],\n \"white\": [255,255,255,1], \"whitesmoke\": [245,245,245,1],\n \"yellow\": [255,255,0,1], \"yellowgreen\": [154,205,50,1]}\n\nfunction clamp_css_byte(i) { // Clamp to integer 0 .. 255.\n i = Math.round(i); // Seems to be what Chrome does (vs truncation).\n return i < 0 ? 0 : i > 255 ? 255 : i;\n}\n\nfunction clamp_css_float(f) { // Clamp to float 0.0 .. 1.0.\n return f < 0 ? 0 : f > 1 ? 1 : f;\n}\n\nfunction parse_css_int(str) { // int or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_byte(parseFloat(str) / 100 * 255);\n return clamp_css_byte(parseInt(str));\n}\n\nfunction parse_css_float(str) { // float or percentage.\n if (str[str.length - 1] === '%')\n return clamp_css_float(parseFloat(str) / 100);\n return clamp_css_float(parseFloat(str));\n}\n\nfunction css_hue_to_rgb(m1, m2, h) {\n if (h < 0) h += 1;\n else if (h > 1) h -= 1;\n\n if (h * 6 < 1) return m1 + (m2 - m1) * h * 6;\n if (h * 2 < 1) return m2;\n if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6;\n return m1;\n}\n\nfunction parseCSSColor(css_str) {\n // Remove all whitespace, not compliant, but should just be more accepting.\n var str = css_str.replace(/ /g, '').toLowerCase();\n\n // Color keywords (and transparent) lookup.\n if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup.\n\n // #abc and #abc123 syntax.\n if (str[0] === '#') {\n if (str.length === 4) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN.\n return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8),\n (iv & 0xf0) | ((iv & 0xf0) >> 4),\n (iv & 0xf) | ((iv & 0xf) << 4),\n 1];\n } else if (str.length === 7) {\n var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing.\n if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN.\n return [(iv & 0xff0000) >> 16,\n (iv & 0xff00) >> 8,\n iv & 0xff,\n 1];\n }\n\n return null;\n }\n\n var op = str.indexOf('('), ep = str.indexOf(')');\n if (op !== -1 && ep + 1 === str.length) {\n var fname = str.substr(0, op);\n var params = str.substr(op+1, ep-(op+1)).split(',');\n var alpha = 1; // To allow case fallthrough.\n switch (fname) {\n case 'rgba':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'rgb':\n if (params.length !== 3) return null;\n return [parse_css_int(params[0]),\n parse_css_int(params[1]),\n parse_css_int(params[2]),\n alpha];\n case 'hsla':\n if (params.length !== 4) return null;\n alpha = parse_css_float(params.pop());\n // Fall through.\n case 'hsl':\n if (params.length !== 3) return null;\n var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1\n // NOTE(deanm): According to the CSS spec s/l should only be\n // percentages, but we don't bother and let float or percentage.\n var s = parse_css_float(params[1]);\n var l = parse_css_float(params[2]);\n var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var m1 = l * 2 - m2;\n return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255),\n clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255),\n alpha];\n default:\n return null;\n }\n }\n\n return null;\n}\n\ntry { exports.parseCSSColor = parseCSSColor } catch(e) { }\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom.js": {
"title": "$:/core/modules/utils/dom.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static DOM-related utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nDetermines whether element 'a' contains element 'b'\nCode thanks to John Resig, http://ejohn.org/blog/comparing-document-position/\n*/\nexports.domContains = function(a,b) {\n\treturn a.contains ?\n\t\ta !== b && a.contains(b) :\n\t\t!!(a.compareDocumentPosition(b) & 16);\n};\n\nexports.removeChildren = function(node) {\n\twhile(node.hasChildNodes()) {\n\t\tnode.removeChild(node.firstChild);\n\t}\n};\n\nexports.hasClass = function(el,className) {\n\treturn el && el.hasAttribute && el.hasAttribute(\"class\") && el.getAttribute(\"class\").split(\" \").indexOf(className) !== -1;\n};\n\nexports.addClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \");\n\tif(c.indexOf(className) === -1) {\n\t\tc.push(className);\n\t\tel.setAttribute(\"class\",c.join(\" \"));\n\t}\n};\n\nexports.removeClass = function(el,className) {\n\tvar c = (el.getAttribute(\"class\") || \"\").split(\" \"),\n\t\tp = c.indexOf(className);\n\tif(p !== -1) {\n\t\tc.splice(p,1);\n\t\tel.setAttribute(\"class\",c.join(\" \"));\n\t}\n};\n\nexports.toggleClass = function(el,className,status) {\n\tif(status === undefined) {\n\t\tstatus = !exports.hasClass(el,className);\n\t}\n\tif(status) {\n\t\texports.addClass(el,className);\n\t} else {\n\t\texports.removeClass(el,className);\n\t}\n};\n\n/*\nGet the first parent element that has scrollbars or use the body as fallback.\n*/\nexports.getScrollContainer = function(el) {\n\tvar doc = el.ownerDocument;\n\twhile(el.parentNode) {\t\n\t\tel = el.parentNode;\n\t\tif(el.scrollTop) {\n\t\t\treturn el;\n\t\t}\n\t}\n\treturn doc.body;\n};\n\n/*\nGet the scroll position of the viewport\nReturns:\n\t{\n\t\tx: horizontal scroll position in pixels,\n\t\ty: vertical scroll position in pixels\n\t}\n*/\nexports.getScrollPosition = function(srcWindow) {\n\tvar scrollWindow = srcWindow || window;\n\tif(\"scrollX\" in scrollWindow) {\n\t\treturn {x: scrollWindow.scrollX, y: scrollWindow.scrollY};\n\t} else {\n\t\treturn {x: scrollWindow.document.documentElement.scrollLeft, y: scrollWindow.document.documentElement.scrollTop};\n\t}\n};\n\n/*\nAdjust the height of a textarea to fit its content, preserving scroll position, and return the height\n*/\nexports.resizeTextAreaToFit = function(domNode,minHeight) {\n\t// Get the scroll container and register the current scroll position\n\tvar container = $tw.utils.getScrollContainer(domNode),\n\t\tscrollTop = container.scrollTop;\n // Measure the specified minimum height\n\tdomNode.style.height = minHeight;\n\tvar measuredHeight = domNode.offsetHeight || parseInt(minHeight,10);\n\t// Set its height to auto so that it snaps to the correct height\n\tdomNode.style.height = \"auto\";\n\t// Calculate the revised height\n\tvar newHeight = Math.max(domNode.scrollHeight + domNode.offsetHeight - domNode.clientHeight,measuredHeight);\n\t// Only try to change the height if it has changed\n\tif(newHeight !== domNode.offsetHeight) {\n\t\tdomNode.style.height = newHeight + \"px\";\n\t\t// Make sure that the dimensions of the textarea are recalculated\n\t\t$tw.utils.forceLayout(domNode);\n\t\t// Set the container to the position we registered at the beginning\n\t\tcontainer.scrollTop = scrollTop;\n\t}\n\treturn newHeight;\n};\n\n/*\nGets the bounding rectangle of an element in absolute page coordinates\n*/\nexports.getBoundingPageRect = function(element) {\n\tvar scrollPos = $tw.utils.getScrollPosition(element.ownerDocument.defaultView),\n\t\tclientRect = element.getBoundingClientRect();\n\treturn {\n\t\tleft: clientRect.left + scrollPos.x,\n\t\twidth: clientRect.width,\n\t\tright: clientRect.right + scrollPos.x,\n\t\ttop: clientRect.top + scrollPos.y,\n\t\theight: clientRect.height,\n\t\tbottom: clientRect.bottom + scrollPos.y\n\t};\n};\n\n/*\nSaves a named password in the browser\n*/\nexports.savePassword = function(name,password) {\n\tvar done = false;\n\ttry {\n\t\twindow.localStorage.setItem(\"tw5-password-\" + name,password);\n\t\tdone = true;\n\t} catch(e) {\n\t}\n\tif(!done) {\n\t\t$tw.savedPasswords = $tw.savedPasswords || Object.create(null);\n\t\t$tw.savedPasswords[name] = password;\n\t}\n};\n\n/*\nRetrieve a named password from the browser\n*/\nexports.getPassword = function(name) {\n\tvar value;\n\ttry {\n\t\tvalue = window.localStorage.getItem(\"tw5-password-\" + name);\n\t} catch(e) {\n\t}\n\tif(value !== undefined) {\n\t\treturn value;\n\t} else {\n\t\treturn ($tw.savedPasswords || Object.create(null))[name] || \"\";\n\t}\n};\n\n/*\nForce layout of a dom node and its descendents\n*/\nexports.forceLayout = function(element) {\n\tvar dummy = element.offsetWidth;\n};\n\n/*\nPulse an element for debugging purposes\n*/\nexports.pulseElement = function(element) {\n\t// Event handler to remove the class at the end\n\telement.addEventListener($tw.browser.animationEnd,function handler(event) {\n\t\telement.removeEventListener($tw.browser.animationEnd,handler,false);\n\t\t$tw.utils.removeClass(element,\"pulse\");\n\t},false);\n\t// Apply the pulse class\n\t$tw.utils.removeClass(element,\"pulse\");\n\t$tw.utils.forceLayout(element);\n\t$tw.utils.addClass(element,\"pulse\");\n};\n\n/*\nAttach specified event handlers to a DOM node\ndomNode: where to attach the event handlers\nevents: array of event handlers to be added (see below)\nEach entry in the events array is an object with these properties:\nhandlerFunction: optional event handler function\nhandlerObject: optional event handler object\nhandlerMethod: optionally specifies object handler method name (defaults to `handleEvent`)\n*/\nexports.addEventListeners = function(domNode,events) {\n\t$tw.utils.each(events,function(eventInfo) {\n\t\tvar handler;\n\t\tif(eventInfo.handlerFunction) {\n\t\t\thandler = eventInfo.handlerFunction;\n\t\t} else if(eventInfo.handlerObject) {\n\t\t\tif(eventInfo.handlerMethod) {\n\t\t\t\thandler = function(event) {\n\t\t\t\t\teventInfo.handlerObject[eventInfo.handlerMethod].call(eventInfo.handlerObject,event);\n\t\t\t\t};\t\n\t\t\t} else {\n\t\t\t\thandler = eventInfo.handlerObject;\n\t\t\t}\n\t\t}\n\t\tdomNode.addEventListener(eventInfo.name,handler,false);\n\t});\n};\n\n/*\nGet the computed styles applied to an element as an array of strings of individual CSS properties\n*/\nexports.getComputedStyles = function(domNode) {\n\tvar textAreaStyles = window.getComputedStyle(domNode,null),\n\t\tstyleDefs = [],\n\t\tname;\n\tfor(var t=0; t<textAreaStyles.length; t++) {\n\t\tname = textAreaStyles[t];\n\t\tstyleDefs.push(name + \": \" + textAreaStyles.getPropertyValue(name) + \";\");\n\t}\n\treturn styleDefs;\n};\n\n/*\nApply a set of styles passed as an array of strings of individual CSS properties\n*/\nexports.setStyles = function(domNode,styleDefs) {\n\tdomNode.style.cssText = styleDefs.join(\"\");\n};\n\n/*\nCopy the computed styles from a source element to a destination element\n*/\nexports.copyStyles = function(srcDomNode,dstDomNode) {\n\t$tw.utils.setStyles(dstDomNode,$tw.utils.getComputedStyles(srcDomNode));\n};\n\n/*\nCopy plain text to the clipboard on browsers that support it\n*/\nexports.copyToClipboard = function(text,options) {\n\toptions = options || {};\n\tvar textArea = document.createElement(\"textarea\");\n\ttextArea.style.position = \"fixed\";\n\ttextArea.style.top = 0;\n\ttextArea.style.left = 0;\n\ttextArea.style.fontSize = \"12pt\";\n\ttextArea.style.width = \"2em\";\n\ttextArea.style.height = \"2em\";\n\ttextArea.style.padding = 0;\n\ttextArea.style.border = \"none\";\n\ttextArea.style.outline = \"none\";\n\ttextArea.style.boxShadow = \"none\";\n\ttextArea.style.background = \"transparent\";\n\ttextArea.value = text;\n\tdocument.body.appendChild(textArea);\n\ttextArea.select();\n\ttextArea.setSelectionRange(0,text.length);\n\tvar succeeded = false;\n\ttry {\n\t\tsucceeded = document.execCommand(\"copy\");\n\t} catch (err) {\n\t}\n\tif(!options.doNotNotify) {\n\t\t$tw.notifier.display(succeeded ? \"$:/language/Notifications/CopiedToClipboard/Succeeded\" : \"$:/language/Notifications/CopiedToClipboard/Failed\");\n\t}\n\tdocument.body.removeChild(textArea);\n};\n\nexports.getLocationPath = function() {\n\treturn window.location.toString().split(\"#\")[0];\n};\n\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/dragndrop.js": {
"title": "$:/core/modules/utils/dom/dragndrop.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/dragndrop.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser data transfer utilities, used with the clipboard and drag and drop\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nOptions:\n\ndomNode: dom node to make draggable\ndragImageType: \"pill\" or \"dom\"\ndragTiddlerFn: optional function to retrieve the title of tiddler to drag\ndragFilterFn: optional function to retreive the filter defining a list of tiddlers to drag\nwidget: widget to use as the contect for the filter\n*/\nexports.makeDraggable = function(options) {\n\tvar dragImageType = options.dragImageType || \"dom\",\n\t\tdragImage,\n\t\tdomNode = options.domNode;\n\t// Make the dom node draggable (not necessary for anchor tags)\n\tif((domNode.tagName || \"\").toLowerCase() !== \"a\") {\n\t\tdomNode.setAttribute(\"draggable\",\"true\");\t\t\n\t}\n\t// Add event handlers\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"dragstart\", handlerFunction: function(event) {\n\t\t\tif(event.dataTransfer === undefined) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Collect the tiddlers being dragged\n\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t \tstartActions = options.startActions;\n\t\t\tif(dragFilter) {\n\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t}\n\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t// Check that we've something to drag\n\t\t\tif(titles.length > 0 && event.target === domNode) {\n\t\t\t\t// Mark the drag in progress\n\t\t\t\t$tw.dragInProgress = domNode;\n\t\t\t\t// Set the dragging class on the element being dragged\n\t\t\t\t$tw.utils.addClass(event.target,\"tc-dragging\");\n\t\t\t\t// Invoke drag-start actions if given\n\t\t\t\tif(startActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(startActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Create the drag image elements\n\t\t\t\tdragImage = options.widget.document.createElement(\"div\");\n\t\t\t\tdragImage.className = \"tc-tiddler-dragger\";\n\t\t\t\tvar inner = options.widget.document.createElement(\"div\");\n\t\t\t\tinner.className = \"tc-tiddler-dragger-inner\";\n\t\t\t\tinner.appendChild(options.widget.document.createTextNode(\n\t\t\t\t\ttitles.length === 1 ? \n\t\t\t\t\t\ttitles[0] :\n\t\t\t\t\t\ttitles.length + \" tiddlers\"\n\t\t\t\t));\n\t\t\t\tdragImage.appendChild(inner);\n\t\t\t\toptions.widget.document.body.appendChild(dragImage);\n\t\t\t\t// Set the data transfer properties\n\t\t\t\tvar dataTransfer = event.dataTransfer;\n\t\t\t\t// Set up the image\n\t\t\t\tdataTransfer.effectAllowed = \"all\";\n\t\t\t\tif(dataTransfer.setDragImage) {\n\t\t\t\t\tif(dragImageType === \"pill\") {\n\t\t\t\t\t\tdataTransfer.setDragImage(dragImage.firstChild,-16,-16);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar r = domNode.getBoundingClientRect();\n\t\t\t\t\t\tdataTransfer.setDragImage(domNode,event.clientX-r.left,event.clientY-r.top);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Set up the data transfer\n\t\t\t\tif(dataTransfer.clearData) {\n\t\t\t\t\tdataTransfer.clearData();\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tvar jsonData = [];\n\t\t\t\tif(titles.length > 1) {\n\t\t\t\t\ttitles.forEach(function(title) {\n\t\t\t\t\t\tjsonData.push(options.widget.wiki.getTiddlerAsJson(title));\n\t\t\t\t\t});\n\t\t\t\t\tjsonData = \"[\" + jsonData.join(\",\") + \"]\";\n\t\t\t\t} else {\n\t\t\t\t\tjsonData = options.widget.wiki.getTiddlerAsJson(titles[0]);\n\t\t\t\t}\n\t\t\t\t// IE doesn't like these content types\n\t\t\t\tif(!$tw.browser.isIE) {\n\t\t\t\t\tdataTransfer.setData(\"text/vnd.tiddler\",jsonData);\n\t\t\t\t\tdataTransfer.setData(\"text/plain\",titleString);\n\t\t\t\t\tdataTransfer.setData(\"text/x-moz-url\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\t}\n\t\t\t\tdataTransfer.setData(\"URL\",\"data:text/vnd.tiddler,\" + encodeURIComponent(jsonData));\n\t\t\t\tdataTransfer.setData(\"Text\",titleString);\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn false;\n\t\t}},\n\t\t{name: \"dragend\", handlerFunction: function(event) {\n\t\t\tif(event.target === domNode) {\n\t\t\t\t// Collect the tiddlers being dragged\n\t\t\t\tvar dragTiddler = options.dragTiddlerFn && options.dragTiddlerFn(),\n\t\t\t\t\tdragFilter = options.dragFilterFn && options.dragFilterFn(),\n\t\t\t\t\ttitles = dragTiddler ? [dragTiddler] : [],\n\t\t\t \t\tendActions = options.endActions;\n\t\t\t\tif(dragFilter) {\n\t\t\t\t\ttitles.push.apply(titles,options.widget.wiki.filterTiddlers(dragFilter,options.widget));\n\t\t\t\t}\n\t\t\t\tvar titleString = $tw.utils.stringifyList(titles);\n\t\t\t\t$tw.dragInProgress = null;\n\t\t\t\t// Invoke drag-end actions if given\n\t\t\t\tif(endActions !== undefined) {\n\t\t\t\t\toptions.widget.invokeActionString(endActions,options.widget,event,{actionTiddler: titleString});\n\t\t\t\t}\n\t\t\t\t// Remove the dragging class on the element being dragged\n\t\t\t\t$tw.utils.removeClass(event.target,\"tc-dragging\");\n\t\t\t\t// Delete the drag image element\n\t\t\t\tif(dragImage) {\n\t\t\t\t\tdragImage.parentNode.removeChild(dragImage);\n\t\t\t\t\tdragImage = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t}}\n\t]);\n};\n\nexports.importDataTransfer = function(dataTransfer,fallbackTitle,callback) {\n\t// Try each provided data type in turn\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Available data types:\");\n\t\tfor(var type=0; type<dataTransfer.types.length; type++) {\n\t\t\tconsole.log(\"type\",dataTransfer.types[type],dataTransfer.getData(dataTransfer.types[type]))\n\t\t}\n\t}\n\tfor(var t=0; t<importDataTypes.length; t++) {\n\t\tif(!$tw.browser.isIE || importDataTypes[t].IECompatible) {\n\t\t\t// Get the data\n\t\t\tvar dataType = importDataTypes[t];\n\t\t\t\tvar data = dataTransfer.getData(dataType.type);\n\t\t\t// Import the tiddlers in the data\n\t\t\tif(data !== \"\" && data !== null) {\n\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\tconsole.log(\"Importing data type '\" + dataType.type + \"', data: '\" + data + \"'\")\n\t\t\t\t}\n\t\t\t\tvar tiddlerFields = dataType.toTiddlerFieldsArray(data,fallbackTitle);\n\t\t\t\tcallback(tiddlerFields);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n};\n\nvar importDataTypes = [\n\t{type: \"text/vnd.tiddler\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn parseJSONTiddlers(data,fallbackTitle);\n\t}},\n\t{type: \"URL\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/x-moz-url\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\t// Check for tiddler data URI\n\t\tvar match = decodeURIComponent(data).match(/^data\\:text\\/vnd\\.tiddler,(.*)/i);\n\t\tif(match) {\n\t\t\treturn parseJSONTiddlers(match[1],fallbackTitle);\n\t\t} else {\n\t\t\treturn [{title: fallbackTitle, text: data}]; // As URL string\n\t\t}\n\t}},\n\t{type: \"text/html\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/plain\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"Text\", IECompatible: true, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}},\n\t{type: \"text/uri-list\", IECompatible: false, toTiddlerFieldsArray: function(data,fallbackTitle) {\n\t\treturn [{title: fallbackTitle, text: data}];\n\t}}\n];\n\nfunction parseJSONTiddlers(json,fallbackTitle) {\n\tvar data = JSON.parse(json);\n\tif(!$tw.utils.isArray(data)) {\n\t\tdata = [data];\n\t}\n\tdata.forEach(function(fields) {\n\t\tfields.title = fields.title || fallbackTitle;\n\t});\n\treturn data;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/http.js": {
"title": "$:/core/modules/utils/dom/http.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/http.js\ntype: application/javascript\nmodule-type: utils\n\nBrowser HTTP support\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nA quick and dirty HTTP function; to be refactored later. Options are:\n\turl: URL to retrieve\n\theaders: hashmap of headers to send\n\ttype: GET, PUT, POST etc\n\tcallback: function invoked with (err,data,xhr)\n\treturnProp: string name of the property to return as first argument of callback\n*/\nexports.httpRequest = function(options) {\n\tvar type = options.type || \"GET\",\n\t\turl = options.url,\n\t\theaders = options.headers || {accept: \"application/json\"},\n\t\thasHeader = function(targetHeader) {\n\t\t\ttargetHeader = targetHeader.toLowerCase();\n\t\t\tvar result = false;\n\t\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\t\tif(headerTitle.toLowerCase() === targetHeader) {\n\t\t\t\t\tresult = true;\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn result;\n\t\t},\n\t\treturnProp = options.returnProp || \"responseText\",\n\t\trequest = new XMLHttpRequest(),\n\t\tdata = \"\",\n\t\tf,results;\n\t// Massage the data hashmap into a string\n\tif(options.data) {\n\t\tif(typeof options.data === \"string\") { // Already a string\n\t\t\tdata = options.data;\n\t\t} else { // A hashmap of strings\n\t\t\tresults = [];\n\t\t\t$tw.utils.each(options.data,function(dataItem,dataItemTitle) {\n\t\t\t\tresults.push(dataItemTitle + \"=\" + encodeURIComponent(dataItem));\n\t\t\t});\n\t\t\tif(type === \"GET\" || type === \"HEAD\") {\n\t\t\t\turl += \"?\" + results.join(\"&\");\n\t\t\t} else {\n\t\t\t\tdata = results.join(\"&\");\n\t\t\t}\n\t\t}\n\t}\n\t// Set up the state change handler\n\trequest.onreadystatechange = function() {\n\t\tif(this.readyState === 4) {\n\t\t\tif(this.status === 200 || this.status === 201 || this.status === 204) {\n\t\t\t\t// Success!\n\t\t\t\toptions.callback(null,this[returnProp],this);\n\t\t\t\treturn;\n\t\t\t}\n\t\t// Something went wrong\n\t\toptions.callback($tw.language.getString(\"Error/XMLHttpRequest\") + \": \" + this.status,null,this);\n\t\t}\n\t};\n\t// Make the request\n\trequest.open(type,url,true);\n\tif(headers) {\n\t\t$tw.utils.each(headers,function(header,headerTitle,object) {\n\t\t\trequest.setRequestHeader(headerTitle,header);\n\t\t});\n\t}\n\tif(data && !hasHeader(\"Content-Type\")) {\n\t\trequest.setRequestHeader(\"Content-Type\",\"application/x-www-form-urlencoded; charset=UTF-8\");\n\t}\n\tif(!hasHeader(\"X-Requested-With\")) {\n\t\trequest.setRequestHeader(\"X-Requested-With\",\"TiddlyWiki\");\n\t}\n\ttry {\n\t\trequest.send(data);\n\t} catch(e) {\n\t\toptions.callback(e,null,this);\n\t}\n\treturn request;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/keyboard.js": {
"title": "$:/core/modules/utils/dom/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/keyboard.js\ntype: application/javascript\nmodule-type: utils\n\nKeyboard utilities; now deprecated. Instead, use $tw.keyboardManager\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n[\"parseKeyDescriptor\",\"checkKeyDescriptor\"].forEach(function(method) {\n\texports[method] = function() {\n\t\tif($tw.keyboardManager) {\n\t\t\treturn $tw.keyboardManager[method].apply($tw.keyboardManager,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\treturn null\n\t\t}\n\t};\n});\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/modal.js": {
"title": "$:/core/modules/utils/dom/modal.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/modal.js\ntype: application/javascript\nmodule-type: utils\n\nModal message mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\nvar navigator = require(\"$:/core/modules/widgets/navigator.js\");\n\nvar Modal = function(wiki) {\n\tthis.wiki = wiki;\n\tthis.modalCount = 0;\n};\n\n/*\nDisplay a modal dialogue\n\ttitle: Title of tiddler to display\n\toptions: see below\nOptions include:\n\tdownloadLink: Text of a big download link to include\n*/\nModal.prototype.display = function(title,options) {\n\toptions = options || {};\n\tthis.srcDocument = options.variables && (options.variables.rootwindow === \"true\" ||\n\t\t\t\toptions.variables.rootwindow === \"yes\") ? document :\n\t\t\t\t(options.event.event && options.event.event.target ? options.event.event.target.ownerDocument : document);\n\tthis.srcWindow = this.srcDocument.defaultView;\n\tvar self = this,\n\t\trefreshHandler,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\ttiddler = this.wiki.getTiddler(title);\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Create the variables\n\tvar variables = $tw.utils.extend({\n\t\t\tcurrentTiddler: title,\n\t\t\t\"tv-story-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-story-list\") : \"\"),\n\t\t\t\"tv-history-list\": (options.event && options.event.widget ? options.event.widget.getVariable(\"tv-history-list\") : \"\")\n\t\t},options.variables);\n\n\t// Create the wrapper divs\n\tvar wrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalBackdrop = this.srcDocument.createElement(\"div\"),\n\t\tmodalWrapper = this.srcDocument.createElement(\"div\"),\n\t\tmodalHeader = this.srcDocument.createElement(\"div\"),\n\t\theaderTitle = this.srcDocument.createElement(\"h3\"),\n\t\tmodalBody = this.srcDocument.createElement(\"div\"),\n\t\tmodalLink = this.srcDocument.createElement(\"a\"),\n\t\tmodalFooter = this.srcDocument.createElement(\"div\"),\n\t\tmodalFooterHelp = this.srcDocument.createElement(\"span\"),\n\t\tmodalFooterButtons = this.srcDocument.createElement(\"span\");\n\t// Up the modal count and adjust the body class\n\tthis.modalCount++;\n\tthis.adjustPageClass();\n\t// Add classes\n\t$tw.utils.addClass(wrapper,\"tc-modal-wrapper\");\n\tif(tiddler.fields && tiddler.fields.class) {\n\t\t$tw.utils.addClass(wrapper,tiddler.fields.class);\n\t}\n\t$tw.utils.addClass(modalBackdrop,\"tc-modal-backdrop\");\n\t$tw.utils.addClass(modalWrapper,\"tc-modal\");\n\t$tw.utils.addClass(modalHeader,\"tc-modal-header\");\n\t$tw.utils.addClass(modalBody,\"tc-modal-body\");\n\t$tw.utils.addClass(modalFooter,\"tc-modal-footer\");\n\t// Join them together\n\twrapper.appendChild(modalBackdrop);\n\twrapper.appendChild(modalWrapper);\n\tmodalHeader.appendChild(headerTitle);\n\tmodalWrapper.appendChild(modalHeader);\n\tmodalWrapper.appendChild(modalBody);\n\tmodalFooter.appendChild(modalFooterHelp);\n\tmodalFooter.appendChild(modalFooterButtons);\n\tmodalWrapper.appendChild(modalFooter);\n\tvar navigatorTree = {\n\t\t\"type\": \"navigator\",\n\t\t\"attributes\": {\n\t\t\t\"story\": {\n\t\t\t\t\"name\": \"story\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-story-list\"]\n\t\t\t},\n\t\t\t\"history\": {\n\t\t\t\t\"name\": \"history\",\n\t\t\t\t\"type\": \"string\",\n\t\t\t\t\"value\": variables[\"tv-history-list\"]\n\t\t\t}\n\t\t},\n\t\t\"tag\": \"$navigator\",\n\t\t\"isBlock\": true,\n\t\t\"children\": []\n\t};\n\tvar navigatorWidgetNode = new navigator.navigator(navigatorTree, {\n\t\twiki: this.wiki,\n\t\tdocument : this.srcDocument,\n\t\tparentWidget: $tw.rootWidget\n\t});\n\tnavigatorWidgetNode.render(modalBody,null);\n\t\n\t// Render the title of the message\n\tvar headerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"subtitle\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"text\",\n\t\t\tattributes: {\n\t\t\t\ttext: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t}}}],\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\theaderWidgetNode.render(headerTitle,null);\n\t// Render the body of the message\n\tvar bodyWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\n\tbodyWidgetNode.render(modalBody,null);\n\t// Setup the link if present\n\tif(options.downloadLink) {\n\t\tmodalLink.href = options.downloadLink;\n\t\tmodalLink.appendChild(this.srcDocument.createTextNode(\"Right-click to save changes\"));\n\t\tmodalBody.appendChild(modalLink);\n\t}\n\t// Render the footer of the message\n\tif(tiddler.fields && tiddler.fields.help) {\n\t\tvar link = this.srcDocument.createElement(\"a\");\n\t\tlink.setAttribute(\"href\",tiddler.fields.help);\n\t\tlink.setAttribute(\"target\",\"_blank\");\n\t\tlink.setAttribute(\"rel\",\"noopener noreferrer\");\n\t\tlink.appendChild(this.srcDocument.createTextNode(\"Help\"));\n\t\tmodalFooterHelp.appendChild(link);\n\t\tmodalFooterHelp.style.float = \"left\";\n\t}\n\tvar footerWidgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tfield: \"footer\",\n\t\tmode: \"inline\",\n\t\tchildren: [{\n\t\t\ttype: \"button\",\n\t\t\tattributes: {\n\t\t\t\tmessage: {\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: \"tm-close-tiddler\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tchildren: [{\n\t\t\t\ttype: \"text\",\n\t\t\t\tattributes: {\n\t\t\t\t\ttext: {\n\t\t\t\t\t\ttype: \"string\",\n\t\t\t\t\t\tvalue: $tw.language.getString(\"Buttons/Close/Caption\")\n\t\t\t}}}\n\t\t]}],\n\t\tparentWidget: navigatorWidgetNode,\n\t\tdocument: this.srcDocument,\n\t\tvariables: variables,\n\t\timportPageMacros: true\n\t});\n\tfooterWidgetNode.render(modalFooterButtons,null);\n\t// Set up the refresh handler\n\trefreshHandler = function(changes) {\n\t\theaderWidgetNode.refresh(changes,modalHeader,null);\n\t\tbodyWidgetNode.refresh(changes,modalBody,null);\n\t\tfooterWidgetNode.refresh(changes,modalFooterButtons,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Add the close event handler\n\tvar closeHandler = function(event) {\n\t\t// Remove our refresh handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Decrease the modal count and adjust the body class\n\t\tself.modalCount--;\n\t\tself.adjustPageClass();\n\t\t// Force layout and animate the modal message away\n\t\t$tw.utils.forceLayout(modalBackdrop);\n\t\t$tw.utils.forceLayout(modalWrapper);\n\t\t$tw.utils.setStyle(modalBackdrop,[\n\t\t\t{opacity: \"0\"}\n\t\t]);\n\t\t$tw.utils.setStyle(modalWrapper,[\n\t\t\t{transform: \"translateY(\" + self.srcWindow.innerHeight + \"px)\"}\n\t\t]);\n\t\t// Set up an event for the transition end\n\t\tself.srcWindow.setTimeout(function() {\n\t\t\tif(wrapper.parentNode) {\n\t\t\t\t// Remove the modal message from the DOM\n\t\t\t\tself.srcDocument.body.removeChild(wrapper);\n\t\t\t}\n\t\t},duration);\n\t\t// Don't let anyone else handle the tm-close-tiddler message\n\t\treturn false;\n\t};\n\theaderWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tbodyWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\tfooterWidgetNode.addEventListener(\"tm-close-tiddler\",closeHandler,false);\n\t// Set the initial styles for the message\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-this.srcWindow.innerHeight) + \"px)\"}\n\t]);\n\t// Put the message into the document\n\tthis.srcDocument.body.appendChild(wrapper);\n\t// Set up animation for the styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{transition: \"opacity \" + duration + \"ms ease-out\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transition: $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Force layout\n\t$tw.utils.forceLayout(modalBackdrop);\n\t$tw.utils.forceLayout(modalWrapper);\n\t// Set final animated styles\n\t$tw.utils.setStyle(modalBackdrop,[\n\t\t{opacity: \"0.7\"}\n\t]);\n\t$tw.utils.setStyle(modalWrapper,[\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n};\n\nModal.prototype.adjustPageClass = function() {\n\tvar windowContainer = $tw.pageContainer ? ($tw.pageContainer === this.srcDocument.body.firstChild ? $tw.pageContainer : this.srcDocument.body.firstChild) : null;\n\tif(windowContainer) {\n\t\t$tw.utils.toggleClass(windowContainer,\"tc-modal-displayed\",this.modalCount > 0);\n\t}\n};\n\nexports.Modal = Modal;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/notifier.js": {
"title": "$:/core/modules/utils/dom/notifier.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/notifier.js\ntype: application/javascript\nmodule-type: utils\n\nNotifier mechanism\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar Notifier = function(wiki) {\n\tthis.wiki = wiki;\n};\n\n/*\nDisplay a notification\n\ttitle: Title of tiddler containing the notification text\n\toptions: see below\nOptions include:\n*/\nNotifier.prototype.display = function(title,options) {\n\toptions = options || {};\n\t// Create the wrapper divs\n\tvar self = this,\n\t\tnotification = document.createElement(\"div\"),\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t\trefreshHandler;\n\t// Don't do anything if the tiddler doesn't exist\n\tif(!tiddler) {\n\t\treturn;\n\t}\n\t// Add classes\n\t$tw.utils.addClass(notification,\"tc-notification\");\n\t// Create the variables\n\tvar variables = $tw.utils.extend({currentTiddler: title},options.variables);\n\t// Render the body of the notification\n\tvar widgetNode = this.wiki.makeTranscludeWidget(title,{\n\t\tparentWidget: $tw.rootWidget,\n\t\tdocument: document,\n\t\tvariables: variables,\n\t\timportPageMacros: true});\n\twidgetNode.render(notification,null);\n\trefreshHandler = function(changes) {\n\t\twidgetNode.refresh(changes,notification,null);\n\t};\n\tthis.wiki.addEventListener(\"change\",refreshHandler);\n\t// Set the initial styles for the notification\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"0\"},\n\t\t{transformOrigin: \"0% 0%\"},\n\t\t{transform: \"translateY(\" + (-window.innerHeight) + \"px)\"},\n\t\t{transition: \"opacity \" + duration + \"ms ease-out, \" + $tw.utils.roundTripPropertyName(\"transform\") + \" \" + duration + \"ms ease-in-out\"}\n\t]);\n\t// Add the notification to the DOM\n\tdocument.body.appendChild(notification);\n\t// Force layout\n\t$tw.utils.forceLayout(notification);\n\t// Set final animated styles\n\t$tw.utils.setStyle(notification,[\n\t\t{opacity: \"1.0\"},\n\t\t{transform: \"translateY(0px)\"}\n\t]);\n\t// Set a timer to remove the notification\n\twindow.setTimeout(function() {\n\t\t// Remove our change event handler\n\t\tself.wiki.removeEventListener(\"change\",refreshHandler);\n\t\t// Force layout and animate the notification away\n\t\t$tw.utils.forceLayout(notification);\n\t\t$tw.utils.setStyle(notification,[\n\t\t\t{opacity: \"0.0\"},\n\t\t\t{transform: \"translateX(\" + (notification.offsetWidth) + \"px)\"}\n\t\t]);\n\t\t// Remove the modal message from the DOM once the transition ends\n\t\tsetTimeout(function() {\n\t\t\tif(notification.parentNode) {\n\t\t\t\tdocument.body.removeChild(notification);\n\t\t\t}\n\t\t},duration);\n\t},$tw.config.preferences.notificationDuration);\n};\n\nexports.Notifier = Notifier;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/popup.js": {
"title": "$:/core/modules/utils/dom/popup.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/popup.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Popup object prototype that manages popups in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreates a Popup object with these options:\n\trootElement: the DOM element to which the popup zapper should be attached\n*/\nvar Popup = function(options) {\n\toptions = options || {};\n\tthis.rootElement = options.rootElement || document.documentElement;\n\tthis.popups = []; // Array of {title:,wiki:,domNode:} objects\n};\n\n/*\nTrigger a popup open or closed. Parameters are in a hashmap:\n\ttitle: title of the tiddler where the popup details are stored\n\tdomNode: dom node to which the popup will be positioned (one of domNode or domNodeRect is required)\n\tdomNodeRect: rectangle to which the popup will be positioned\n\twiki: wiki\n\tforce: if specified, forces the popup state to true or false (instead of toggling it)\n\tfloating: if true, skips registering the popup, meaning that it will need manually clearing\n*/\nPopup.prototype.triggerPopup = function(options) {\n\t// Check if this popup is already active\n\tvar index = this.findPopup(options.title);\n\t// Compute the new state\n\tvar state = index === -1;\n\tif(options.force !== undefined) {\n\t\tstate = options.force;\n\t}\n\t// Show or cancel the popup according to the new state\n\tif(state) {\n\t\tthis.show(options);\n\t} else {\n\t\tthis.cancel(index);\n\t}\n};\n\nPopup.prototype.findPopup = function(title) {\n\tvar index = -1;\n\tfor(var t=0; t<this.popups.length; t++) {\n\t\tif(this.popups[t].title === title) {\n\t\t\tindex = t;\n\t\t}\n\t}\n\treturn index;\n};\n\nPopup.prototype.handleEvent = function(event) {\n\tif(event.type === \"click\") {\n\t\t// Find out what was clicked on\n\t\tvar info = this.popupInfo(event.target),\n\t\t\tcancelLevel = info.popupLevel - 1;\n\t\t// Don't remove the level that was clicked on if we clicked on a handle\n\t\tif(info.isHandle) {\n\t\t\tcancelLevel++;\n\t\t}\n\t\t// Cancel\n\t\tthis.cancel(cancelLevel);\n\t}\n};\n\n/*\nFind the popup level containing a DOM node. Returns:\npopupLevel: count of the number of nested popups containing the specified element\nisHandle: true if the specified element is within a popup handle\n*/\nPopup.prototype.popupInfo = function(domNode) {\n\tvar isHandle = false,\n\t\tpopupCount = 0,\n\t\tnode = domNode;\n\t// First check ancestors to see if we're within a popup handle\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup-handle\")) {\n\t\t\tisHandle = true;\n\t\t\tpopupCount++;\n\t\t}\n\t\tif($tw.utils.hasClass(node,\"tc-popup-keep\")) {\n\t\t\tisHandle = true;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\t// Then count the number of ancestor popups\n\tnode = domNode;\n\twhile(node) {\n\t\tif($tw.utils.hasClass(node,\"tc-popup\")) {\n\t\t\tpopupCount++;\n\t\t}\n\t\tnode = node.parentNode;\n\t}\n\tvar info = {\n\t\tpopupLevel: popupCount,\n\t\tisHandle: isHandle\n\t};\n\treturn info;\n};\n\n/*\nDisplay a popup by adding it to the stack\n*/\nPopup.prototype.show = function(options) {\n\t// Find out what was clicked on\n\tvar info = this.popupInfo(options.domNode);\n\t// Cancel any higher level popups\n\tthis.cancel(info.popupLevel);\n\n\t// Store the popup details if not already there\n\tif(!options.floating && this.findPopup(options.title) === -1) {\n\t\tthis.popups.push({\n\t\t\ttitle: options.title,\n\t\t\twiki: options.wiki,\n\t\t\tdomNode: options.domNode,\n\t\t\tnoStateReference: options.noStateReference\n\t\t});\n\t}\n\t// Set the state tiddler\n\tvar rect;\n\tif(options.domNodeRect) {\n\t\trect = options.domNodeRect;\n\t} else {\n\t\trect = {\n\t\t\tleft: options.domNode.offsetLeft,\n\t\t\ttop: options.domNode.offsetTop,\n\t\t\twidth: options.domNode.offsetWidth,\n\t\t\theight: options.domNode.offsetHeight\n\t\t};\n\t}\n\tvar popupRect = \"(\" + rect.left + \",\" + rect.top + \",\" + \n\t\t\t\trect.width + \",\" + rect.height + \")\";\n\tif(options.noStateReference) {\n\t\toptions.wiki.setText(options.title,\"text\",undefined,popupRect);\n\t} else {\n\t\toptions.wiki.setTextReference(options.title,popupRect);\n\t}\n\t// Add the click handler if we have any popups\n\tif(this.popups.length > 0) {\n\t\tthis.rootElement.addEventListener(\"click\",this,true);\t\t\n\t}\n};\n\n/*\nCancel all popups at or above a specified level or DOM node\nlevel: popup level to cancel (0 cancels all popups)\n*/\nPopup.prototype.cancel = function(level) {\n\tvar numPopups = this.popups.length;\n\tlevel = Math.max(0,Math.min(level,numPopups));\n\tfor(var t=level; t<numPopups; t++) {\n\t\tvar popup = this.popups.pop();\n\t\tif(popup.title) {\n\t\t\tif(popup.noStateReference) {\n\t\t\t\tpopup.wiki.deleteTiddler(popup.title);\n\t\t\t} else {\n\t\t\t\tpopup.wiki.deleteTiddler($tw.utils.parseTextReference(popup.title).title);\n \t\t}\n\t\t}\n\t}\n\tif(this.popups.length === 0) {\n\t\tthis.rootElement.removeEventListener(\"click\",this,false);\n\t}\n};\n\n/*\nReturns true if the specified title and text identifies an active popup\n*/\nPopup.prototype.readPopupState = function(text) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/;\n\treturn popupLocationRegExp.test(text);\n};\n\nexports.Popup = Popup;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/dom/scroller.js": {
"title": "$:/core/modules/utils/dom/scroller.js",
"text": "/*\\\ntitle: $:/core/modules/utils/dom/scroller.js\ntype: application/javascript\nmodule-type: utils\n\nModule that creates a $tw.utils.Scroller object prototype that manages scrolling in the browser\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nEvent handler for when the `tm-scroll` event hits the document body\n*/\nvar PageScroller = function() {\n\tthis.idRequestFrame = null;\n\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\twindow.webkitRequestAnimationFrame ||\n\t\twindow.mozRequestAnimationFrame ||\n\t\tfunction(callback) {\n\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t};\n\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\twindow.webkitCancelAnimationFrame ||\n\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\twindow.mozCancelAnimationFrame ||\n\t\twindow.mozCancelRequestAnimationFrame ||\n\t\tfunction(id) {\n\t\t\twindow.clearTimeout(id);\n\t\t};\n};\n\nPageScroller.prototype.isScrolling = function() {\n\treturn this.idRequestFrame !== null;\n}\n\nPageScroller.prototype.cancelScroll = function(srcWindow) {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(srcWindow,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle an event\n*/\nPageScroller.prototype.handleEvent = function(event) {\n\tif(event.type === \"tm-scroll\") {\n\t\tif(event.paramObject && event.paramObject.selector) {\n\t\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector);\n\t\t} else {\n\t\t\tthis.scrollIntoView(event.target);\t\t\t\n\t\t}\n\t\treturn false; // Event was handled\n\t}\n\treturn true;\n};\n\n/*\nHandle a scroll event hitting the page document\n*/\nPageScroller.prototype.scrollIntoView = function(element,callback) {\n\tvar self = this,\n\t\tduration = $tw.utils.getAnimationDuration(),\n\t srcWindow = element ? element.ownerDocument.defaultView : window;\n\t// Now get ready to scroll the body\n\tthis.cancelScroll(srcWindow);\n\tthis.startTime = Date.now();\n\t// Get the height of any position:fixed toolbars\n\tvar toolbar = srcWindow.document.querySelector(\".tc-adjust-top-of-scroll\"),\n\t\toffset = 0;\n\tif(toolbar) {\n\t\toffset = toolbar.offsetHeight;\n\t}\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar getBounds = function() {\n\t\t\tvar clientBounds = typeof callback === 'function' ? callback() : element.getBoundingClientRect(),\n\t\t\t\tscrollPosition = $tw.utils.getScrollPosition(srcWindow);\n\t\t\treturn {\n\t\t\t\tleft: clientBounds.left + scrollPosition.x,\n\t\t\t\ttop: clientBounds.top + scrollPosition.y - offset,\n\t\t\t\twidth: clientBounds.width,\n\t\t\t\theight: clientBounds.height\n\t\t\t};\n\t\t},\n\t\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\t\t// targetPos/targetSize - position and size of the target element\n\t\t// currentPos/currentSize - position and size of the current scroll viewport\n\t\t// returns: new position of the scroll viewport\n\t\tgetEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\tvar newPos = targetPos;\n\t\t\t// If we are scrolling within 50 pixels of the top/left then snap to zero\n\t\t\tif(newPos < 50) {\n\t\t\t\tnewPos = 0;\n\t\t\t}\n\t\t\treturn newPos;\n\t\t},\n\t\tdrawFrame = function drawFrame() {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll(srcWindow);\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tvar scrollPosition = $tw.utils.getScrollPosition(srcWindow),\n\t\t\t\tbounds = getBounds(),\n\t\t\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,srcWindow.innerWidth),\n\t\t\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,srcWindow.innerHeight);\n\t\t\tsrcWindow.scrollTo(scrollPosition.x + (endX - scrollPosition.x) * t,scrollPosition.y + (endY - scrollPosition.y) * t);\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\tdrawFrame();\n};\n\nPageScroller.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) {\n\tbaseElement = baseElement || document.body;\n\tvar element = baseElement.querySelector(selector);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback);\t\t\n\t}\n};\n\nexports.PageScroller = PageScroller;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/edition-info.js": {
"title": "$:/core/modules/utils/edition-info.js",
"text": "/*\\\ntitle: $:/core/modules/utils/edition-info.js\ntype: application/javascript\nmodule-type: utils-node\n\nInformation about the available editions\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\nvar editionInfo;\n\nexports.getEditionInfo = function() {\n\tif(!editionInfo) {\n\t\t// Enumerate the edition paths\n\t\tvar editionPaths = $tw.getLibraryItemSearchPaths($tw.config.editionsPath,$tw.config.editionsEnvVar);\n\t\teditionInfo = {};\n\t\tfor(var editionIndex=0; editionIndex<editionPaths.length; editionIndex++) {\n\t\t\tvar editionPath = editionPaths[editionIndex];\n\t\t\t// Enumerate the folders\n\t\t\tvar entries = fs.readdirSync(editionPath);\n\t\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\t\tvar entry = entries[entryIndex];\n\t\t\t\t// Check if directories have a valid tiddlywiki.info\n\t\t\t\tif(!editionInfo[entry] && $tw.utils.isDirectory(path.resolve(editionPath,entry))) {\n\t\t\t\t\tvar info;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinfo = JSON.parse(fs.readFileSync(path.resolve(editionPath,entry,\"tiddlywiki.info\"),\"utf8\"));\n\t\t\t\t\t} catch(ex) {\n\t\t\t\t\t}\n\t\t\t\t\tif(info) {\n\t\t\t\t\t\teditionInfo[entry] = info;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn editionInfo;\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/fakedom.js": {
"title": "$:/core/modules/utils/fakedom.js",
"text": "/*\\\ntitle: $:/core/modules/utils/fakedom.js\ntype: application/javascript\nmodule-type: global\n\nA barebones implementation of DOM interfaces needed by the rendering mechanism.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Sequence number used to enable us to track objects for testing\nvar sequenceNumber = null;\n\nvar bumpSequenceNumber = function(object) {\n\tif(sequenceNumber !== null) {\n\t\tobject.sequenceNumber = sequenceNumber++;\n\t}\n};\n\nvar TW_Node = function (){\n\tthrow TypeError(\"Illegal constructor\");\n};\n\nObject.defineProperty(TW_Node.prototype, 'ELEMENT_NODE', {\n\tget: function() {\n\t\treturn 1;\n\t}\n});\n\nObject.defineProperty(TW_Node.prototype, 'TEXT_NODE', {\n\tget: function() {\n\t\treturn 3;\n\t}\n});\n\nvar TW_TextNode = function(text) {\n\tbumpSequenceNumber(this);\n\tthis.textContent = text + \"\";\n};\n\nTW_TextNode.prototype = Object.create(TW_Node.prototype);\n\nObject.defineProperty(TW_TextNode.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.TEXT_NODE;\n\t}\n});\n\nObject.defineProperty(TW_TextNode.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\treturn this.textContent.replace(/(\\r?\\n)/g,\"\");\n\t}\n});\n\nvar TW_Element = function(tag,namespace) {\n\tbumpSequenceNumber(this);\n\tthis.isTiddlyWikiFakeDom = true;\n\tthis.tag = tag;\n\tthis.attributes = {};\n\tthis.isRaw = false;\n\tthis.children = [];\n\tthis._style = {};\n\tthis.namespaceURI = namespace || \"http://www.w3.org/1999/xhtml\";\n};\n\nTW_Element.prototype = Object.create(TW_Node.prototype);\n\nObject.defineProperty(TW_Element.prototype, \"style\", {\n\tget: function() {\n\t\treturn this._style;\n\t},\n\tset: function(str) {\n\t\tvar self = this;\n\t\tstr = str || \"\";\n\t\t$tw.utils.each(str.split(\";\"),function(declaration) {\n\t\t\tvar parts = declaration.split(\":\"),\n\t\t\t\tname = $tw.utils.trim(parts[0]),\n\t\t\t\tvalue = $tw.utils.trim(parts[1]);\n\t\t\tif(name && value) {\n\t\t\t\tself._style[$tw.utils.convertStyleNameToPropertyName(name)] = value;\n\t\t\t}\n\t\t});\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"nodeType\", {\n\tget: function() {\n\t\treturn this.ELEMENT_NODE;\n\t}\n});\n\nTW_Element.prototype.getAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot getAttribute on a raw TW_Element\";\n\t}\n\treturn this.attributes[name];\n};\n\nTW_Element.prototype.setAttribute = function(name,value) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot setAttribute on a raw TW_Element\";\n\t}\n\tthis.attributes[name] = value + \"\";\n};\n\nTW_Element.prototype.setAttributeNS = function(namespace,name,value) {\n\tthis.setAttribute(name,value);\n};\n\nTW_Element.prototype.removeAttribute = function(name) {\n\tif(this.isRaw) {\n\t\tthrow \"Cannot removeAttribute on a raw TW_Element\";\n\t}\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\tdelete this.attributes[name];\n\t}\n};\n\nTW_Element.prototype.appendChild = function(node) {\n\tthis.children.push(node);\n\tnode.parentNode = this;\n};\n\nTW_Element.prototype.insertBefore = function(node,nextSibling) {\n\tif(nextSibling) {\n\t\tvar p = this.children.indexOf(nextSibling);\n\t\tif(p !== -1) {\n\t\t\tthis.children.splice(p,0,node);\n\t\t\tnode.parentNode = this;\n\t\t} else {\n\t\t\tthis.appendChild(node);\n\t\t}\n\t} else {\n\t\tthis.appendChild(node);\n\t}\n};\n\nTW_Element.prototype.removeChild = function(node) {\n\tvar p = this.children.indexOf(node);\n\tif(p !== -1) {\n\t\tthis.children.splice(p,1);\n\t}\n};\n\nTW_Element.prototype.hasChildNodes = function() {\n\treturn !!this.children.length;\n};\n\nObject.defineProperty(TW_Element.prototype, \"childNodes\", {\n\tget: function() {\n\t\treturn this.children;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"firstChild\", {\n\tget: function() {\n\t\treturn this.children[0];\n\t}\n});\n\nTW_Element.prototype.addEventListener = function(type,listener,useCapture) {\n\t// Do nothing\n};\n\nObject.defineProperty(TW_Element.prototype, \"tagName\", {\n\tget: function() {\n\t\treturn this.tag || \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"className\", {\n\tget: function() {\n\t\treturn this.attributes[\"class\"] || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes[\"class\"] = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"value\", {\n\tget: function() {\n\t\treturn this.attributes.value || \"\";\n\t},\n\tset: function(value) {\n\t\tthis.attributes.value = value + \"\";\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"outerHTML\", {\n\tget: function() {\n\t\tvar output = [],attr,a,v;\n\t\toutput.push(\"<\",this.tag);\n\t\tif(this.attributes) {\n\t\t\tattr = [];\n\t\t\tfor(a in this.attributes) {\n\t\t\t\tattr.push(a);\n\t\t\t}\n\t\t\tattr.sort();\n\t\t\tfor(a=0; a<attr.length; a++) {\n\t\t\t\tv = this.attributes[attr[a]];\n\t\t\t\tif(v !== undefined) {\n\t\t\t\t\toutput.push(\" \",attr[a],\"=\\\"\",$tw.utils.htmlEncode(v),\"\\\"\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(this._style) {\n\t\t\tvar style = [];\n\t\t\tfor(var s in this._style) {\n\t\t\t\tstyle.push($tw.utils.convertPropertyNameToStyleName(s) + \":\" + this._style[s] + \";\");\n\t\t\t}\n\t\t\tif(style.length > 0) {\n\t\t\t\toutput.push(\" style=\\\"\",style.join(\"\"),\"\\\"\");\n\t\t\t}\n\t\t}\n\t\toutput.push(\">\");\n\t\tif($tw.config.htmlVoidElements.indexOf(this.tag) === -1) {\n\t\t\toutput.push(this.innerHTML);\n\t\t\toutput.push(\"</\",this.tag,\">\");\n\t\t}\n\t\treturn output.join(\"\");\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"innerHTML\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn this.rawHTML;\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tif(node instanceof TW_Element) {\n\t\t\t\t\tb.push(node.outerHTML);\n\t\t\t\t} else if(node instanceof TW_TextNode) {\n\t\t\t\t\tb.push($tw.utils.htmlEncode(node.textContent));\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.isRaw = true;\n\t\tthis.rawHTML = value;\n\t\tthis.rawTextContent = null;\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textInnerHTML\", {\n\tset: function(value) {\n\t\tif(this.isRaw) {\n\t\t\tthis.rawTextContent = value;\n\t\t} else {\n\t\t\tthrow \"Cannot set textInnerHTML of a non-raw TW_Element\";\n\t\t}\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"textContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\tif(this.rawTextContent === null) {\n\t\t\t\treturn \"\";\n\t\t\t} else {\n\t\t\t\treturn this.rawTextContent;\n\t\t\t}\n\t\t} else {\n\t\t\tvar b = [];\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.textContent);\n\t\t\t});\n\t\t\treturn b.join(\"\");\n\t\t}\n\t},\n\tset: function(value) {\n\t\tthis.children = [new TW_TextNode(value)];\n\t}\n});\n\nObject.defineProperty(TW_Element.prototype, \"formattedTextContent\", {\n\tget: function() {\n\t\tif(this.isRaw) {\n\t\t\treturn \"\";\n\t\t} else {\n\t\t\tvar b = [],\n\t\t\t\tisBlock = $tw.config.htmlBlockElements.indexOf(this.tag) !== -1;\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\tif(this.tag === \"li\") {\n\t\t\t\tb.push(\"* \");\n\t\t\t}\n\t\t\t$tw.utils.each(this.children,function(node) {\n\t\t\t\tb.push(node.formattedTextContent);\n\t\t\t});\n\t\t\tif(isBlock) {\n\t\t\t\tb.push(\"\\n\");\n\t\t\t}\n\t\t\treturn b.join(\"\");\n\t\t}\n\t}\n});\n\nvar document = {\n\tsetSequenceNumber: function(value) {\n\t\tsequenceNumber = value;\n\t},\n\tcreateElementNS: function(namespace,tag) {\n\t\treturn new TW_Element(tag,namespace);\n\t},\n\tcreateElement: function(tag) {\n\t\treturn new TW_Element(tag);\n\t},\n\tcreateTextNode: function(text) {\n\t\treturn new TW_TextNode(text);\n\t},\n\tcompatMode: \"CSS1Compat\", // For KaTeX to know that we're not a browser in quirks mode\n\tisTiddlyWikiFakeDom: true\n};\n\nexports.fakeDocument = document;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/filesystem.js": {
"title": "$:/core/modules/utils/filesystem.js",
"text": "/*\\\ntitle: $:/core/modules/utils/filesystem.js\ntype: application/javascript\nmodule-type: utils-node\n\nFile system utilities\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar fs = require(\"fs\"),\n\tpath = require(\"path\");\n\n/*\nReturn the subdirectories of a path\n*/\nexports.getSubdirectories = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn null;\n\t}\n\tvar subdirs = [];\n\t$tw.utils.each(fs.readdirSync(dirPath),function(item) {\n\t\tif($tw.utils.isDirectory(path.resolve(dirPath,item))) {\n\t\t\tsubdirs.push(item);\n\t\t}\n\t});\n\treturn subdirs;\n}\n\n/*\nRecursively (and synchronously) copy a directory and all its content\n*/\nexports.copyDirectory = function(srcPath,dstPath) {\n\t// Remove any trailing path separators\n\tsrcPath = path.resolve($tw.utils.removeTrailingSeparator(srcPath));\n\tdstPath = path.resolve($tw.utils.removeTrailingSeparator(dstPath));\n\t// Check that neither director is within the other\n\tif(srcPath.substring(0,dstPath.length) === dstPath || dstPath.substring(0,srcPath.length) === srcPath) {\n\t\treturn \"Cannot copy nested directories\";\n\t}\n\t// Create the destination directory\n\tvar err = $tw.utils.createDirectory(dstPath);\n\tif(err) {\n\t\treturn err;\n\t}\n\t// Function to copy a folder full of files\n\tvar copy = function(srcPath,dstPath) {\n\t\tvar srcStats = fs.lstatSync(srcPath),\n\t\t\tdstExists = fs.existsSync(dstPath);\n\t\tif(srcStats.isFile()) {\n\t\t\t$tw.utils.copyFile(srcPath,dstPath);\n\t\t} else if(srcStats.isDirectory()) {\n\t\t\tvar items = fs.readdirSync(srcPath);\n\t\t\tfor(var t=0; t<items.length; t++) {\n\t\t\t\tvar item = items[t],\n\t\t\t\t\terr = copy(srcPath + path.sep + item,dstPath + path.sep + item);\n\t\t\t\tif(err) {\n\t\t\t\t\treturn err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n\tcopy(srcPath,dstPath);\n\treturn null;\n};\n\n/*\nCopy a file\n*/\nvar FILE_BUFFER_LENGTH = 64 * 1024,\n\tfileBuffer;\n\nexports.copyFile = function(srcPath,dstPath) {\n\t// Create buffer if required\n\tif(!fileBuffer) {\n\t\tfileBuffer = Buffer.alloc(FILE_BUFFER_LENGTH);\n\t}\n\t// Create any directories in the destination\n\t$tw.utils.createDirectory(path.dirname(dstPath));\n\t// Copy the file\n\tvar srcFile = fs.openSync(srcPath,\"r\"),\n\t\tdstFile = fs.openSync(dstPath,\"w\"),\n\t\tbytesRead = 1,\n\t\tpos = 0;\n\twhile (bytesRead > 0) {\n\t\tbytesRead = fs.readSync(srcFile,fileBuffer,0,FILE_BUFFER_LENGTH,pos);\n\t\tfs.writeSync(dstFile,fileBuffer,0,bytesRead);\n\t\tpos += bytesRead;\n\t}\n\tfs.closeSync(srcFile);\n\tfs.closeSync(dstFile);\n\treturn null;\n};\n\n/*\nRemove trailing path separator\n*/\nexports.removeTrailingSeparator = function(dirPath) {\n\tvar len = dirPath.length;\n\tif(dirPath.charAt(len-1) === path.sep) {\n\t\tdirPath = dirPath.substr(0,len-1);\n\t}\n\treturn dirPath;\n};\n\n/*\nRecursively create a directory\n*/\nexports.createDirectory = function(dirPath) {\n\tif(dirPath.substr(dirPath.length-1,1) !== path.sep) {\n\t\tdirPath = dirPath + path.sep;\n\t}\n\tvar pos = 1;\n\tpos = dirPath.indexOf(path.sep,pos);\n\twhile(pos !== -1) {\n\t\tvar subDirPath = dirPath.substr(0,pos);\n\t\tif(!$tw.utils.isDirectory(subDirPath)) {\n\t\t\ttry {\n\t\t\t\tfs.mkdirSync(subDirPath);\n\t\t\t} catch(e) {\n\t\t\t\treturn \"Error creating directory '\" + subDirPath + \"'\";\n\t\t\t}\n\t\t}\n\t\tpos = dirPath.indexOf(path.sep,pos + 1);\n\t}\n\treturn null;\n};\n\n/*\nRecursively create directories needed to contain a specified file\n*/\nexports.createFileDirectories = function(filePath) {\n\treturn $tw.utils.createDirectory(path.dirname(filePath));\n};\n\n/*\nRecursively delete a directory\n*/\nexports.deleteDirectory = function(dirPath) {\n\tif(fs.existsSync(dirPath)) {\n\t\tvar entries = fs.readdirSync(dirPath);\n\t\tfor(var entryIndex=0; entryIndex<entries.length; entryIndex++) {\n\t\t\tvar currPath = dirPath + path.sep + entries[entryIndex];\n\t\t\tif(fs.lstatSync(currPath).isDirectory()) {\n\t\t\t\t$tw.utils.deleteDirectory(currPath);\n\t\t\t} else {\n\t\t\t\tfs.unlinkSync(currPath);\n\t\t\t}\n\t\t}\n\tfs.rmdirSync(dirPath);\n\t}\n\treturn null;\n};\n\n/*\nCheck if a path identifies a directory\n*/\nexports.isDirectory = function(dirPath) {\n\treturn fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory();\n};\n\n/*\nCheck if a path identifies a directory that is empty\n*/\nexports.isDirectoryEmpty = function(dirPath) {\n\tif(!$tw.utils.isDirectory(dirPath)) {\n\t\treturn false;\n\t}\n\tvar files = fs.readdirSync(dirPath),\n\t\tempty = true;\n\t$tw.utils.each(files,function(file,index) {\n\t\tif(file.charAt(0) !== \".\") {\n\t\t\tempty = false;\n\t\t}\n\t});\n\treturn empty;\n};\n\n/*\nRecursively delete a tree of empty directories\n*/\nexports.deleteEmptyDirs = function(dirpath,callback) {\n\tvar self = this;\n\tfs.readdir(dirpath,function(err,files) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\n\t\tif(files.length > 0) {\n\t\t\treturn callback(null);\n\t\t}\n\t\tfs.rmdir(dirpath,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tself.deleteEmptyDirs(path.dirname(dirpath),callback);\n\t\t});\n\t});\n};\n\n/*\nCreate a fileInfo object for saving a tiddler:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file on disk (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n\tisEditableFile: true if the tiddler was loaded via non-standard options & marked editable\nOptions include:\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\textFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters,\n\tfileInfo: an existing fileInfo to check against\n\toriginalpath: a preferred filepath if no pathFilters match\n*/\nexports.generateTiddlerFileInfo = function(tiddler,options) {\n\tvar fileInfo = {}, metaExt;\n\t// Propagate the isEditableFile flag\n\tif(options.fileInfo) {\n\t\tfileInfo.isEditableFile = options.fileInfo.isEditableFile || false;\n\t}\n\t// Check if the tiddler has any unsafe fields that can't be expressed in a .tid or .meta file: containing control characters, or leading/trailing whitespace\n\tvar hasUnsafeFields = false;\n\t$tw.utils.each(tiddler.getFieldStrings(),function(value,fieldName) {\n\t\tif(fieldName !== \"text\") {\n\t\t\thasUnsafeFields = hasUnsafeFields || /[\\x00-\\x1F]/mg.test(value);\n\t\t\thasUnsafeFields = hasUnsafeFields || ($tw.utils.trim(value) !== value);\n\t\t}\n\t});\n\t// Check for field values \n\tif(hasUnsafeFields) {\n\t\t// Save as a JSON file\n\t\tfileInfo.type = \"application/json\";\n\t\tfileInfo.hasMetaFile = false;\n\t} else {\n\t\t// Save as a .tid or a text/binary file plus a .meta file\n\t\tvar tiddlerType = tiddler.fields.type || \"text/vnd.tiddlywiki\";\n\t\tif(tiddlerType === \"text/vnd.tiddlywiki\") {\n\t\t\t// Save as a .tid file\n\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\tfileInfo.hasMetaFile = false;\n\t\t} else {\n\t\t\t// Save as a text/binary file and a .meta file\n\t\t\tfileInfo.type = tiddlerType;\n\t\t\tfileInfo.hasMetaFile = true;\n\t\t}\n\t\tif(options.extFilters) {\n\t\t\t// Check for extension override\n\t\t\tmetaExt = $tw.utils.generateTiddlerExtension(tiddler.fields.title,{\n\t\t\t\textFilters: options.extFilters,\n\t\t\t\twiki: options.wiki\n\t\t\t});\n\t\t\tif(metaExt){\n\t\t\t\tif(metaExt === \".tid\") {\n\t\t\t\t\t// Overriding to the .tid extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/x-tiddler\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else if (metaExt === \".json\") {\n\t\t\t\t\t// Overriding to the .json extension needs special handling\n\t\t\t\t\tfileInfo.type = \"application/json\";\n\t\t\t\t\tfileInfo.hasMetaFile = false;\n\t\t\t\t} else {\n\t\t\t\t\t//If the new type matches a known extention, use that MIME type's encoding\n\t\t\t\t\tvar extInfo = $tw.utils.getFileExtensionInfo(metaExt);\n\t\t\t\t\tfileInfo.type = extInfo ? extInfo.type : null;\n\t\t\t\t\tfileInfo.encoding = $tw.utils.getTypeEncoding(metaExt);\n\t\t\t\t\tfileInfo.hasMetaFile = true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// Take the file extension from the tiddler content type or metaExt\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[fileInfo.type] || {extension: \"\"};\n\t// Generate the filepath\n\tfileInfo.filepath = $tw.utils.generateTiddlerFilepath(tiddler.fields.title,{\n\t\textension: metaExt || contentTypeInfo.extension,\n\t\tdirectory: options.directory,\n\t\tpathFilters: options.pathFilters,\n\t\twiki: options.wiki,\n\t\tfileInfo: options.fileInfo,\n\t\toriginalpath: options.originalpath\n\t});\n\treturn fileInfo;\n};\n\n/*\nGenerate the file extension for saving a tiddler\nOptions include:\n\textFilters: optional array of filters to be used to generate the extention\n\twiki: optional wiki for evaluating the extFilters\n*/\nexports.generateTiddlerExtension = function(title,options) {\n\tvar self = this,\n\t\textension;\n\t// Check if any of the extFilters applies\n\tif(options.extFilters && options.wiki) { \n\t\t$tw.utils.each(options.extFilters,function(filter) {\n\t\t\tif(!extension) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\textension = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\treturn extension;\n};\n\n/*\nGenerate the filepath for saving a tiddler\nOptions include:\n\textension: file extension to be added the finished filepath\n\tdirectory: absolute path of root directory to which we are saving\n\tpathFilters: optional array of filters to be used to generate the base path\n\twiki: optional wiki for evaluating the pathFilters\n\tfileInfo: an existing fileInfo object to check against\n*/\nexports.generateTiddlerFilepath = function(title,options) {\n\tvar self = this,\n\t\tdirectory = options.directory || \"\",\n\t\textension = options.extension || \"\",\n\t\toriginalpath = options.originalpath || \"\",\n\t\tfilepath;\t\n\t// Check if any of the pathFilters applies\n\tif(options.pathFilters && options.wiki) {\n\t\t$tw.utils.each(options.pathFilters,function(filter) {\n\t\t\tif(!filepath) {\n\t\t\t\tvar source = options.wiki.makeTiddlerIterator([title]),\n\t\t\t\t\tresult = options.wiki.filterTiddlers(filter,null,source);\n\t\t\t\tif(result.length > 0) {\n\t\t\t\t\tfilepath = result[0];\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\tif(!filepath && originalpath !== \"\") {\n\t\t//Use the originalpath without the extension\n\t\tvar ext = path.extname(originalpath);\n\t\tfilepath = originalpath.substring(0,originalpath.length - ext.length);\n\t} else if(!filepath) {\n\t\tfilepath = title;\n\t\t// If the filepath already ends in the extension then remove it\n\t\tif(filepath.substring(filepath.length - extension.length) === extension) {\n\t\t\tfilepath = filepath.substring(0,filepath.length - extension.length);\n\t\t}\n\t\t// Remove any forward or backward slashes so we don't create directories\n\t\tfilepath = filepath.replace(/\\/|\\\\/g,\"_\");\n\t}\n\t//If the path does not start with \".\" or \"..\" and a path seperator, then\n\tif(!/^\\.{1,2}[/\\\\]/g.test(filepath)) {\n\t\t// Don't let the filename start with any dots because such files are invisible on *nix\n\t\tfilepath = filepath.replace(/^\\.+/g,\"_\");\n\t}\n\t// Remove any characters that can't be used in cross-platform filenames\n\tfilepath = $tw.utils.transliterate(filepath.replace(/<|>|~|\\:|\\\"|\\||\\?|\\*|\\^/g,\"_\"));\n\t// Truncate the filename if it is too long\n\tif(filepath.length > 200) {\n\t\tfilepath = filepath.substr(0,200);\n\t}\n\t// If the resulting filename is blank (eg because the title is just punctuation characters)\n\tif(!filepath) {\n\t\t// ...then just use the character codes of the title\n\t\tfilepath = \"\";\t\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tif(filepath) {\n\t\t\t\tfilepath += \"-\";\n\t\t\t}\n\t\t\tfilepath += char.charCodeAt(0).toString();\n\t\t});\n\t}\n\t// Add a uniquifier if the file already exists\n\tvar fullPath, oldPath = (options.fileInfo) ? options.fileInfo.filepath : undefined,\n\t\tcount = 0;\n\tdo {\n\t\tfullPath = path.resolve(directory,filepath + (count ? \"_\" + count : \"\") + extension);\n\t\tif(oldPath && oldPath == fullPath) {\n\t\t\tbreak;\n\t\t}\n\t\tcount++;\n\t} while(fs.existsSync(fullPath));\n\t// If the last write failed with an error, or if path does not start with:\n\t//\tthe resolved options.directory, the resolved wikiPath directory, or the wikiTiddlersPath directory, \n\t//\tthen encodeURIComponent() and resolve to tiddler directory\n\tvar newPath = fullPath,\n\t\tencode = (options.fileInfo || {writeError: false}).writeError == true;\n\tif(!encode){\n\t\tencode = !(fullPath.indexOf(path.resolve(directory)) == 0 ||\n\t\t\tfullPath.indexOf(path.resolve($tw.boot.wikiPath)) == 0 ||\n\t\t\tfullPath.indexOf($tw.boot.wikiTiddlersPath) == 0);\n\t\t}\n\tif(encode){\n\t\tfullPath = path.resolve(directory, encodeURIComponent(fullPath));\n\t}\n\t// Call hook to allow plugins to modify the final path\n\tfullPath = $tw.hooks.invokeHook(\"th-make-tiddler-path\", newPath, fullPath);\n\t// Return the full path to the file\n\treturn fullPath;\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFile = function(tiddler,fileInfo,callback) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFile(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding,function(err) {\n\t\t\tif(err) {\n\t\t\t\treturn callback(err);\n\t\t\t}\n\t\t\tfs.writeFile(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\",callback);\n\t\t});\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFile(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\",callback);\n\t\t} else {\n\t\t\tfs.writeFile(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\",callback);\n\t\t}\n\t}\n};\n\n/*\nSave a tiddler to a file described by the fileInfo:\n\tfilepath: the absolute path to the file containing the tiddler\n\ttype: the type of the tiddler file (NOT the type of the tiddler)\n\thasMetaFile: true if the file also has a companion .meta file\n*/\nexports.saveTiddlerToFileSync = function(tiddler,fileInfo) {\n\t$tw.utils.createDirectory(path.dirname(fileInfo.filepath));\n\tif(fileInfo.hasMetaFile) {\n\t\t// Save the tiddler as a separate body and meta file\n\t\tvar typeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/plain\"] || {encoding: \"utf8\"};\n\t\tfs.writeFileSync(fileInfo.filepath,tiddler.fields.text,typeInfo.encoding);\n\t\tfs.writeFileSync(fileInfo.filepath + \".meta\",tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}),\"utf8\");\n\t} else {\n\t\t// Save the tiddler as a self contained templated file\n\t\tif(fileInfo.type === \"application/x-tiddler\") {\n\t\t\tfs.writeFileSync(fileInfo.filepath,tiddler.getFieldStringBlock({exclude: [\"text\",\"bag\"]}) + (!!tiddler.fields.text ? \"\\n\\n\" + tiddler.fields.text : \"\"),\"utf8\");\n\t\t} else {\n\t\t\tfs.writeFileSync(fileInfo.filepath,JSON.stringify([tiddler.getFieldStrings({exclude: [\"bag\"]})],null,$tw.config.preferences.jsonSpaces),\"utf8\");\n\t\t}\n\t}\n};\n\n/*\nDelete a file described by the fileInfo if it exits\n*/\nexports.deleteTiddlerFile = function(fileInfo, callback) {\n\t//Only attempt to delete files that exist on disk\n\tif(!fileInfo.filepath || !fs.existsSync(fileInfo.filepath)) {\n\t\treturn callback(null);\n\t}\n\t// Delete the file\n\tfs.unlink(fileInfo.filepath,function(err) {\n\t\tif(err) {\n\t\t\treturn callback(err);\n\t\t}\t\n\t\t// Delete the metafile if present\n\t\tif(fileInfo.hasMetaFile && fs.existsSync(fileInfo.filepath + \".meta\")) {\n\t\t\tfs.unlink(fileInfo.filepath + \".meta\",function(err) {\n\t\t\t\tif(err) {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback);\n\t\t\t});\n\t\t} else {\n\t\t\treturn $tw.utils.deleteEmptyDirs(path.dirname(fileInfo.filepath),callback);\n\t\t}\n\t});\n};\n\n/*\nCleanup old files on disk, by comparing the options values:\n\tadaptorInfo from $tw.syncer.tiddlerInfo\n\tbootInfo from $tw.boot.files\n*/\nexports.cleanupTiddlerFiles = function(options, callback) {\n\tvar adaptorInfo = options.adaptorInfo || {},\n\tbootInfo = options.bootInfo || {},\n\ttitle = options.title || \"undefined\";\n\tif(adaptorInfo.filepath && bootInfo.filepath && adaptorInfo.filepath !== bootInfo.filepath) {\n\t\treturn $tw.utils.deleteTiddlerFile(adaptorInfo, function(err){\n\t\t\tif(err) {\n\t\t\t\tif ((err.code == \"EPERM\" || err.code == \"EACCES\") && err.syscall == \"unlink\") {\n\t\t\t\t\t// Error deleting the previous file on disk, should fail gracefully\n\t\t\t\t\t$tw.syncer.displayError(\"Server desynchronized. Error cleaning up previous file for tiddler: \"+title, err);\n\t\t\t\t\treturn callback(null);\n\t\t\t\t} else {\n\t\t\t\t\treturn callback(err);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn callback(null);\n\t\t});\n\t} else {\n\t\treturn callback(null);\n\t}\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils-node"
},
"$:/core/modules/utils/linkedlist.js": {
"title": "$:/core/modules/utils/linkedlist.js",
"text": "/*\\\nmodule-type: utils\ntitle: $:/core/modules/utils/linkedlist.js\ntype: application/javascript\n\nThis is a doubly-linked indexed list intended for manipulation, particularly\npushTop, which it does with significantly better performance than an array.\n\n\\*/\n(function(){\n\nfunction LinkedList() {\n\tthis.clear();\n};\n\nLinkedList.prototype.clear = function() {\n\tthis.index = Object.create(null);\n\t// LinkedList performs the duty of both the head and tail node\n\tthis.next = this;\n\tthis.prev = this;\n\tthis.length = 0;\n};\n\nLinkedList.prototype.remove = function(value) {\n\tif($tw.utils.isArray(value)) {\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t} else {\n\t\t_removeOne(this,value);\n\t}\n};\n\nLinkedList.prototype.push = function(/* values */) {\n\tfor(var i = 0; i < arguments.length; i++) {\n\t\tvar value = arguments[i];\n\t\tvar node = {value: value};\n\t\tvar preexistingNode = this.index[value];\n\t\t_linkToEnd(this,node);\n\t\tif(preexistingNode) {\n\t\t\t// We want to keep pointing to the first instance, but we want\n\t\t\t// to have that instance (or chain of instances) point to the\n\t\t\t// new one.\n\t\t\twhile (preexistingNode.copy) {\n\t\t\t\tpreexistingNode = preexistingNode.copy;\n\t\t\t}\n\t\t\tpreexistingNode.copy = node;\n\t\t} else {\n\t\t\tthis.index[value] = node;\n\t\t}\n\t}\n};\n\nLinkedList.prototype.pushTop = function(value) {\n\tif($tw.utils.isArray(value)) {\n\t\tfor(var t=0; t<value.length; t++) {\n\t\t\t_removeOne(this,value[t]);\n\t\t}\n\t\tthis.push.apply(this,value);\n\t} else {\n\t\tvar node = _removeOne(this,value);\n\t\tif(!node) {\n\t\t\tnode = {value: value};\n\t\t\tthis.index[value] = node;\n\t\t} else {\n\t\t\t// Put this node at the end of the copy chain.\n\t\t\tvar preexistingNode = node;\n\t\t\twhile(preexistingNode.copy) {\n\t\t\t\tpreexistingNode = preexistingNode.copy;\n\t\t\t}\n\t\t\t// The order of these three statements is important,\n\t\t\t// because sometimes preexistingNode == node.\n\t\t\tpreexistingNode.copy = node;\n\t\t\tthis.index[value] = node.copy;\n\t\t\tnode.copy = undefined;\n\t\t}\n\t\t_linkToEnd(this,node);\n\t}\n};\n\nLinkedList.prototype.each = function(callback) {\n\tfor(var ptr = this.next; ptr !== this; ptr = ptr.next) {\n\t\tcallback(ptr.value);\n\t}\n};\n\nLinkedList.prototype.toArray = function() {\n\tvar output = [];\n\tfor(var ptr = this.next; ptr !== this; ptr = ptr.next) {\n\t\toutput.push(ptr.value);\n\t}\n\treturn output;\n};\n\nfunction _removeOne(list,value) {\n\tvar node = list.index[value];\n\tif(node) {\n\t\tnode.prev.next = node.next;\n\t\tnode.next.prev = node.prev;\n\t\tlist.length -= 1;\n\t\t// Point index to the next instance of the same value, maybe nothing.\n\t\tlist.index[value] = node.copy;\n\t}\n\treturn node;\n};\n\nfunction _linkToEnd(list,node) {\n\t// Sticks the given node onto the end of the list.\n\tlist.prev.next = node;\n\tnode.prev = list.prev;\n\tlist.prev = node;\n\tnode.next = list;\n\tlist.length += 1;\n};\n\nexports.LinkedList = LinkedList;\n\n})();\n",
"module-type": "utils",
"type": "application/javascript"
},
"$:/core/modules/utils/logger.js": {
"title": "$:/core/modules/utils/logger.js",
"text": "/*\\\ntitle: $:/core/modules/utils/logger.js\ntype: application/javascript\nmodule-type: utils\n\nA basic logging implementation\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar ALERT_TAG = \"$:/tags/Alert\";\n\n/*\nMake a new logger\n*/\nfunction Logger(componentName,options) {\n\toptions = options || {};\n\tthis.componentName = componentName || \"\";\n\tthis.colour = options.colour || \"white\";\n\tthis.enable = \"enable\" in options ? options.enable : true;\n\tthis.save = \"save\" in options ? options.save : true;\n\tthis.saveLimit = options.saveLimit || 100 * 1024;\n\tthis.saveBufferLogger = this;\n\tthis.buffer = \"\";\n\tthis.alertCount = 0;\n}\n\nLogger.prototype.setSaveBuffer = function(logger) {\n\tthis.saveBufferLogger = logger;\n};\n\n/*\nLog a message\n*/\nLogger.prototype.log = function(/* args */) {\n\tvar self = this;\n\tif(this.enable) {\n\t\tif(this.saveBufferLogger.save) {\n\t\t\tthis.saveBufferLogger.buffer += $tw.utils.formatDateString(new Date(),\"YYYY MM DD 0hh:0mm:0ss.0XXX\") + \":\";\n\t\t\t$tw.utils.each(Array.prototype.slice.call(arguments,0),function(arg,index) {\n\t\t\t\tself.saveBufferLogger.buffer += \" \" + arg;\n\t\t\t});\n\t\t\tthis.saveBufferLogger.buffer += \"\\n\";\n\t\t\tthis.saveBufferLogger.buffer = this.saveBufferLogger.buffer.slice(-this.saveBufferLogger.saveLimit);\t\t\t\n\t\t}\n\t\tif(console !== undefined && console.log !== undefined) {\n\t\t\treturn Function.apply.call(console.log, console, [$tw.utils.terminalColour(this.colour),this.componentName + \":\"].concat(Array.prototype.slice.call(arguments,0)).concat($tw.utils.terminalColour()));\n\t\t}\n\t} \n};\n\n/*\nRead the message buffer\n*/\nLogger.prototype.getBuffer = function() {\n\treturn this.saveBufferLogger.buffer;\n};\n\n/*\nLog a structure as a table\n*/\nLogger.prototype.table = function(value) {\n\t(console.table || console.log)(value);\n};\n\n/*\nAlert a message\n*/\nLogger.prototype.alert = function(/* args */) {\n\tif(this.enable) {\n\t\t// Prepare the text of the alert\n\t\tvar text = Array.prototype.join.call(arguments,\" \");\n\t\t// Create alert tiddlers in the browser\n\t\tif($tw.browser) {\n\t\t\t// Check if there is an existing alert with the same text and the same component\n\t\t\tvar existingAlerts = $tw.wiki.getTiddlersWithTag(ALERT_TAG),\n\t\t\t\talertFields,\n\t\t\t\texistingCount,\n\t\t\t\tself = this;\n\t\t\t$tw.utils.each(existingAlerts,function(title) {\n\t\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\t\tif(tiddler.fields.text === text && tiddler.fields.component === self.componentName && tiddler.fields.modified && (!alertFields || tiddler.fields.modified < alertFields.modified)) {\n\t\t\t\t\t\talertFields = $tw.utils.extend({},tiddler.fields);\n\t\t\t\t}\n\t\t\t});\n\t\t\tif(alertFields) {\n\t\t\t\texistingCount = alertFields.count || 1;\n\t\t\t} else {\n\t\t\t\talertFields = {\n\t\t\t\t\ttitle: $tw.wiki.generateNewTitle(\"$:/temp/alerts/alert\",{prefix: \"\"}),\n\t\t\t\t\ttext: text,\n\t\t\t\t\ttags: [ALERT_TAG],\n\t\t\t\t\tcomponent: this.componentName\n\t\t\t\t};\n\t\t\t\texistingCount = 0;\n\t\t\t\tthis.alertCount += 1;\n\t\t\t}\n\t\t\talertFields.modified = new Date();\n\t\t\tif(++existingCount > 1) {\n\t\t\t\talertFields.count = existingCount;\n\t\t\t} else {\n\t\t\t\talertFields.count = undefined;\n\t\t\t}\n\t\t\t$tw.wiki.addTiddler(new $tw.Tiddler(alertFields));\n\t\t\t// Log the alert as well\n\t\t\tthis.log.apply(this,Array.prototype.slice.call(arguments,0));\n\t\t} else {\n\t\t\t// Print an orange message to the console if not in the browser\n\t\t\tconsole.error(\"\\x1b[1;33m\" + text + \"\\x1b[0m\");\n\t\t}\t\t\n\t}\n};\n\n/*\nClear outstanding alerts\n*/\nLogger.prototype.clearAlerts = function() {\n\tvar self = this;\n\tif($tw.browser && this.alertCount > 0) {\n\t\t$tw.utils.each($tw.wiki.getTiddlersWithTag(ALERT_TAG),function(title) {\n\t\t\tvar tiddler = $tw.wiki.getTiddler(title);\n\t\t\tif(tiddler.fields.component === self.componentName) {\n\t\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t\t}\n\t\t});\n\t\tthis.alertCount = 0;\n\t}\n};\n\nexports.Logger = Logger;\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/parsetree.js": {
"title": "$:/core/modules/utils/parsetree.js",
"text": "/*\\\ntitle: $:/core/modules/utils/parsetree.js\ntype: application/javascript\nmodule-type: utils\n\nParse tree utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.addAttributeToParseTreeNode = function(node,name,value) {\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[name] = {type: \"string\", value: value};\n};\n\nexports.getAttributeValueFromParseTreeNode = function(node,name,defaultValue) {\n\tif(node.attributes && node.attributes[name] && node.attributes[name].value !== undefined) {\n\t\treturn node.attributes[name].value;\n\t}\n\treturn defaultValue;\n};\n\nexports.addClassToParseTreeNode = function(node,classString) {\n\tvar classes = [];\n\tnode.attributes = node.attributes || {};\n\tnode.attributes[\"class\"] = node.attributes[\"class\"] || {type: \"string\", value: \"\"};\n\tif(node.attributes[\"class\"].type === \"string\") {\n\t\tif(node.attributes[\"class\"].value !== \"\") {\n\t\t\tclasses = node.attributes[\"class\"].value.split(\" \");\n\t\t}\n\t\tif(classString !== \"\") {\n\t\t\t$tw.utils.pushTop(classes,classString.split(\" \"));\n\t\t}\n\t\tnode.attributes[\"class\"].value = classes.join(\" \");\n\t}\n};\n\nexports.addStyleToParseTreeNode = function(node,name,value) {\n\t\tnode.attributes = node.attributes || {};\n\t\tnode.attributes.style = node.attributes.style || {type: \"string\", value: \"\"};\n\t\tif(node.attributes.style.type === \"string\") {\n\t\t\tnode.attributes.style.value += name + \":\" + value + \";\";\n\t\t}\n};\n\nexports.findParseTreeNode = function(nodeArray,search) {\n\tfor(var t=0; t<nodeArray.length; t++) {\n\t\tif(nodeArray[t].type === search.type && nodeArray[t].tag === search.tag) {\n\t\t\treturn nodeArray[t];\n\t\t}\n\t}\n\treturn undefined;\n};\n\n/*\nHelper to get the text of a parse tree node or array of nodes\n*/\nexports.getParseTreeText = function getParseTreeText(tree) {\n\tvar output = [];\n\tif($tw.utils.isArray(tree)) {\n\t\t$tw.utils.each(tree,function(node) {\n\t\t\toutput.push(getParseTreeText(node));\n\t\t});\n\t} else {\n\t\tif(tree.type === \"text\") {\n\t\t\toutput.push(tree.text);\n\t\t}\n\t\tif(tree.children) {\n\t\t\treturn getParseTreeText(tree.children);\n\t\t}\n\t}\n\treturn output.join(\"\");\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/performance.js": {
"title": "$:/core/modules/utils/performance.js",
"text": "/*\\\ntitle: $:/core/modules/utils/performance.js\ntype: application/javascript\nmodule-type: global\n\nPerformance measurement.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nfunction Performance(enabled) {\n\tthis.enabled = !!enabled;\n\tthis.measures = {}; // Hashmap by measurement name of {time:, invocations:}\n\tthis.logger = new $tw.utils.Logger(\"performance\");\n\tthis.showGreeting();\n}\n\nPerformance.prototype.showGreeting = function() {\n\tif($tw.browser) {\n\t\tthis.logger.log(\"Execute $tw.perf.log(); to see filter execution timings\");\t\t\n\t}\n};\n\n/*\nWrap performance reporting around a top level function\n*/\nPerformance.prototype.report = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tself.logger.log(name + \": \" + $tw.utils.timer(startTime).toFixed(2) + \"ms\");\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nPerformance.prototype.log = function() {\n\tvar self = this,\n\t\ttotalTime = 0,\n\t\torderedMeasures = Object.keys(this.measures).sort(function(a,b) {\n\t\t\tif(self.measures[a].time > self.measures[b].time) {\n\t\t\t\treturn -1;\n\t\t\t} else if (self.measures[a].time < self.measures[b].time) {\n\t\t\t\treturn + 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t});\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\ttotalTime += self.measures[name].time;\n\t});\n\tvar results = []\n\t$tw.utils.each(orderedMeasures,function(name) {\n\t\tvar measure = self.measures[name];\n\t\tresults.push({name: name,invocations: measure.invocations, avgTime: measure.time / measure.invocations, totalTime: measure.time, percentTime: (measure.time / totalTime) * 100})\n\t});\n\tself.logger.table(results);\n};\n\n/*\nWrap performance measurements around a subfunction\n*/\nPerformance.prototype.measure = function(name,fn) {\n\tvar self = this;\n\tif(this.enabled) {\n\t\treturn function() {\n\t\t\tvar startTime = $tw.utils.timer(),\n\t\t\t\tresult = fn.apply(this,arguments);\n\t\t\tif(!(name in self.measures)) {\n\t\t\t\tself.measures[name] = {time: 0, invocations: 0};\n\t\t\t}\n\t\t\tself.measures[name].time += $tw.utils.timer(startTime);\n\t\t\tself.measures[name].invocations++;\n\t\t\treturn result;\n\t\t};\n\t} else {\n\t\treturn fn;\n\t}\n};\n\nexports.Performance = Performance;\n\n})();\n",
"type": "application/javascript",
"module-type": "global"
},
"$:/core/modules/utils/pluginmaker.js": {
"title": "$:/core/modules/utils/pluginmaker.js",
"text": "/*\\\ntitle: $:/core/modules/utils/pluginmaker.js\ntype: application/javascript\nmodule-type: utils\n\nA quick and dirty way to pack up plugins within the browser.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRepack a plugin, and then delete any non-shadow payload tiddlers\n*/\nexports.repackPlugin = function(title,additionalTiddlers,excludeTiddlers) {\n\tadditionalTiddlers = additionalTiddlers || [];\n\texcludeTiddlers = excludeTiddlers || [];\n\t// Get the plugin tiddler\n\tvar pluginTiddler = $tw.wiki.getTiddler(title);\n\tif(!pluginTiddler) {\n\t\tthrow \"No such tiddler as \" + title;\n\t}\n\t// Extract the JSON\n\tvar jsonPluginTiddler;\n\ttry {\n\t\tjsonPluginTiddler = JSON.parse(pluginTiddler.fields.text);\n\t} catch(e) {\n\t\tthrow \"Cannot parse plugin tiddler \" + title + \"\\n\" + $tw.language.getString(\"Error/Caption\") + \": \" + e;\n\t}\n\t// Get the list of tiddlers\n\tvar tiddlers = Object.keys(jsonPluginTiddler.tiddlers);\n\t// Add the additional tiddlers\n\t$tw.utils.pushTop(tiddlers,additionalTiddlers);\n\t// Remove any excluded tiddlers\n\tfor(var t=tiddlers.length-1; t>=0; t--) {\n\t\tif(excludeTiddlers.indexOf(tiddlers[t]) !== -1) {\n\t\t\ttiddlers.splice(t,1);\n\t\t}\n\t}\n\t// Pack up the tiddlers into a block of JSON\n\tvar plugins = {};\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = $tw.wiki.getTiddler(title),\n\t\t\tfields = {};\n\t\t$tw.utils.each(tiddler.fields,function (value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\tplugins[title] = fields;\n\t});\n\t// Retrieve and bump the version number\n\tvar pluginVersion = $tw.utils.parseVersion(pluginTiddler.getFieldString(\"version\") || \"0.0.0\") || {\n\t\t\tmajor: \"0\",\n\t\t\tminor: \"0\",\n\t\t\tpatch: \"0\"\n\t\t};\n\tpluginVersion.patch++;\n\tvar version = pluginVersion.major + \".\" + pluginVersion.minor + \".\" + pluginVersion.patch;\n\tif(pluginVersion.prerelease) {\n\t\tversion += \"-\" + pluginVersion.prerelease;\n\t}\n\tif(pluginVersion.build) {\n\t\tversion += \"+\" + pluginVersion.build;\n\t}\n\t// Save the tiddler\n\t$tw.wiki.addTiddler(new $tw.Tiddler(pluginTiddler,{text: JSON.stringify({tiddlers: plugins},null,4), version: version}));\n\t// Delete any non-shadow constituent tiddlers\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tif($tw.wiki.tiddlerExists(title)) {\n\t\t\t$tw.wiki.deleteTiddler(title);\n\t\t}\n\t});\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t// Return a heartwarming confirmation\n\treturn \"Plugin \" + title + \" successfully saved\";\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/transliterate.js": {
"title": "$:/core/modules/utils/transliterate.js",
"text": "/*\\\ntitle: $:/core/modules/utils/transliterate.js\ntype: application/javascript\nmodule-type: utils\n\nTransliteration static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nTransliterate string to ASCII\n\n(Some pairs taken from http://semplicewebsites.com/removing-accents-javascript)\n*/\nexports.transliterationPairs = {\n\t\"Á\":\"A\",\n\t\"Ă\":\"A\",\n\t\"Ắ\":\"A\",\n\t\"Ặ\":\"A\",\n\t\"Ằ\":\"A\",\n\t\"Ẳ\":\"A\",\n\t\"Ẵ\":\"A\",\n\t\"Ǎ\":\"A\",\n\t\"Â\":\"A\",\n\t\"Ấ\":\"A\",\n\t\"Ậ\":\"A\",\n\t\"Ầ\":\"A\",\n\t\"Ẩ\":\"A\",\n\t\"Ẫ\":\"A\",\n\t\"Ä\":\"A\",\n\t\"Ǟ\":\"A\",\n\t\"Ȧ\":\"A\",\n\t\"Ǡ\":\"A\",\n\t\"Ạ\":\"A\",\n\t\"Ȁ\":\"A\",\n\t\"À\":\"A\",\n\t\"Ả\":\"A\",\n\t\"Ȃ\":\"A\",\n\t\"Ā\":\"A\",\n\t\"Ą\":\"A\",\n\t\"Å\":\"A\",\n\t\"Ǻ\":\"A\",\n\t\"Ḁ\":\"A\",\n\t\"Ⱥ\":\"A\",\n\t\"Ã\":\"A\",\n\t\"Ꜳ\":\"AA\",\n\t\"Æ\":\"AE\",\n\t\"Ǽ\":\"AE\",\n\t\"Ǣ\":\"AE\",\n\t\"Ꜵ\":\"AO\",\n\t\"Ꜷ\":\"AU\",\n\t\"Ꜹ\":\"AV\",\n\t\"Ꜻ\":\"AV\",\n\t\"Ꜽ\":\"AY\",\n\t\"Ḃ\":\"B\",\n\t\"Ḅ\":\"B\",\n\t\"Ɓ\":\"B\",\n\t\"Ḇ\":\"B\",\n\t\"Ƀ\":\"B\",\n\t\"Ƃ\":\"B\",\n\t\"Ć\":\"C\",\n\t\"Č\":\"C\",\n\t\"Ç\":\"C\",\n\t\"Ḉ\":\"C\",\n\t\"Ĉ\":\"C\",\n\t\"Ċ\":\"C\",\n\t\"Ƈ\":\"C\",\n\t\"Ȼ\":\"C\",\n\t\"Ď\":\"D\",\n\t\"Ḑ\":\"D\",\n\t\"Ḓ\":\"D\",\n\t\"Ḋ\":\"D\",\n\t\"Ḍ\":\"D\",\n\t\"Ɗ\":\"D\",\n\t\"Ḏ\":\"D\",\n\t\"Dz\":\"D\",\n\t\"Dž\":\"D\",\n\t\"Đ\":\"D\",\n\t\"Ƌ\":\"D\",\n\t\"DZ\":\"DZ\",\n\t\"DŽ\":\"DZ\",\n\t\"É\":\"E\",\n\t\"Ĕ\":\"E\",\n\t\"Ě\":\"E\",\n\t\"Ȩ\":\"E\",\n\t\"Ḝ\":\"E\",\n\t\"Ê\":\"E\",\n\t\"Ế\":\"E\",\n\t\"Ệ\":\"E\",\n\t\"Ề\":\"E\",\n\t\"Ể\":\"E\",\n\t\"Ễ\":\"E\",\n\t\"Ḙ\":\"E\",\n\t\"Ë\":\"E\",\n\t\"Ė\":\"E\",\n\t\"Ẹ\":\"E\",\n\t\"Ȅ\":\"E\",\n\t\"È\":\"E\",\n\t\"Ẻ\":\"E\",\n\t\"Ȇ\":\"E\",\n\t\"Ē\":\"E\",\n\t\"Ḗ\":\"E\",\n\t\"Ḕ\":\"E\",\n\t\"Ę\":\"E\",\n\t\"Ɇ\":\"E\",\n\t\"Ẽ\":\"E\",\n\t\"Ḛ\":\"E\",\n\t\"Ꝫ\":\"ET\",\n\t\"Ḟ\":\"F\",\n\t\"Ƒ\":\"F\",\n\t\"Ǵ\":\"G\",\n\t\"Ğ\":\"G\",\n\t\"Ǧ\":\"G\",\n\t\"Ģ\":\"G\",\n\t\"Ĝ\":\"G\",\n\t\"Ġ\":\"G\",\n\t\"Ɠ\":\"G\",\n\t\"Ḡ\":\"G\",\n\t\"Ǥ\":\"G\",\n\t\"Ḫ\":\"H\",\n\t\"Ȟ\":\"H\",\n\t\"Ḩ\":\"H\",\n\t\"Ĥ\":\"H\",\n\t\"Ⱨ\":\"H\",\n\t\"Ḧ\":\"H\",\n\t\"Ḣ\":\"H\",\n\t\"Ḥ\":\"H\",\n\t\"Ħ\":\"H\",\n\t\"Í\":\"I\",\n\t\"Ĭ\":\"I\",\n\t\"Ǐ\":\"I\",\n\t\"Î\":\"I\",\n\t\"Ï\":\"I\",\n\t\"Ḯ\":\"I\",\n\t\"İ\":\"I\",\n\t\"Ị\":\"I\",\n\t\"Ȉ\":\"I\",\n\t\"Ì\":\"I\",\n\t\"Ỉ\":\"I\",\n\t\"Ȋ\":\"I\",\n\t\"Ī\":\"I\",\n\t\"Į\":\"I\",\n\t\"Ɨ\":\"I\",\n\t\"Ĩ\":\"I\",\n\t\"Ḭ\":\"I\",\n\t\"Ꝺ\":\"D\",\n\t\"Ꝼ\":\"F\",\n\t\"Ᵹ\":\"G\",\n\t\"Ꞃ\":\"R\",\n\t\"Ꞅ\":\"S\",\n\t\"Ꞇ\":\"T\",\n\t\"Ꝭ\":\"IS\",\n\t\"Ĵ\":\"J\",\n\t\"Ɉ\":\"J\",\n\t\"Ḱ\":\"K\",\n\t\"Ǩ\":\"K\",\n\t\"Ķ\":\"K\",\n\t\"Ⱪ\":\"K\",\n\t\"Ꝃ\":\"K\",\n\t\"Ḳ\":\"K\",\n\t\"Ƙ\":\"K\",\n\t\"Ḵ\":\"K\",\n\t\"Ꝁ\":\"K\",\n\t\"Ꝅ\":\"K\",\n\t\"Ĺ\":\"L\",\n\t\"Ƚ\":\"L\",\n\t\"Ľ\":\"L\",\n\t\"Ļ\":\"L\",\n\t\"Ḽ\":\"L\",\n\t\"Ḷ\":\"L\",\n\t\"Ḹ\":\"L\",\n\t\"Ⱡ\":\"L\",\n\t\"Ꝉ\":\"L\",\n\t\"Ḻ\":\"L\",\n\t\"Ŀ\":\"L\",\n\t\"Ɫ\":\"L\",\n\t\"Lj\":\"L\",\n\t\"Ł\":\"L\",\n\t\"LJ\":\"LJ\",\n\t\"Ḿ\":\"M\",\n\t\"Ṁ\":\"M\",\n\t\"Ṃ\":\"M\",\n\t\"Ɱ\":\"M\",\n\t\"Ń\":\"N\",\n\t\"Ň\":\"N\",\n\t\"Ņ\":\"N\",\n\t\"Ṋ\":\"N\",\n\t\"Ṅ\":\"N\",\n\t\"Ṇ\":\"N\",\n\t\"Ǹ\":\"N\",\n\t\"Ɲ\":\"N\",\n\t\"Ṉ\":\"N\",\n\t\"Ƞ\":\"N\",\n\t\"Nj\":\"N\",\n\t\"Ñ\":\"N\",\n\t\"NJ\":\"NJ\",\n\t\"Ó\":\"O\",\n\t\"Ŏ\":\"O\",\n\t\"Ǒ\":\"O\",\n\t\"Ô\":\"O\",\n\t\"Ố\":\"O\",\n\t\"Ộ\":\"O\",\n\t\"Ồ\":\"O\",\n\t\"Ổ\":\"O\",\n\t\"Ỗ\":\"O\",\n\t\"Ö\":\"O\",\n\t\"Ȫ\":\"O\",\n\t\"Ȯ\":\"O\",\n\t\"Ȱ\":\"O\",\n\t\"Ọ\":\"O\",\n\t\"Ő\":\"O\",\n\t\"Ȍ\":\"O\",\n\t\"Ò\":\"O\",\n\t\"Ỏ\":\"O\",\n\t\"Ơ\":\"O\",\n\t\"Ớ\":\"O\",\n\t\"Ợ\":\"O\",\n\t\"Ờ\":\"O\",\n\t\"Ở\":\"O\",\n\t\"Ỡ\":\"O\",\n\t\"Ȏ\":\"O\",\n\t\"Ꝋ\":\"O\",\n\t\"Ꝍ\":\"O\",\n\t\"Ō\":\"O\",\n\t\"Ṓ\":\"O\",\n\t\"Ṑ\":\"O\",\n\t\"Ɵ\":\"O\",\n\t\"Ǫ\":\"O\",\n\t\"Ǭ\":\"O\",\n\t\"Ø\":\"O\",\n\t\"Ǿ\":\"O\",\n\t\"Õ\":\"O\",\n\t\"Ṍ\":\"O\",\n\t\"Ṏ\":\"O\",\n\t\"Ȭ\":\"O\",\n\t\"Ƣ\":\"OI\",\n\t\"Ꝏ\":\"OO\",\n\t\"Ɛ\":\"E\",\n\t\"Ɔ\":\"O\",\n\t\"Ȣ\":\"OU\",\n\t\"Ṕ\":\"P\",\n\t\"Ṗ\":\"P\",\n\t\"Ꝓ\":\"P\",\n\t\"Ƥ\":\"P\",\n\t\"Ꝕ\":\"P\",\n\t\"Ᵽ\":\"P\",\n\t\"Ꝑ\":\"P\",\n\t\"Ꝙ\":\"Q\",\n\t\"Ꝗ\":\"Q\",\n\t\"Ŕ\":\"R\",\n\t\"Ř\":\"R\",\n\t\"Ŗ\":\"R\",\n\t\"Ṙ\":\"R\",\n\t\"Ṛ\":\"R\",\n\t\"Ṝ\":\"R\",\n\t\"Ȑ\":\"R\",\n\t\"Ȓ\":\"R\",\n\t\"Ṟ\":\"R\",\n\t\"Ɍ\":\"R\",\n\t\"Ɽ\":\"R\",\n\t\"Ꜿ\":\"C\",\n\t\"Ǝ\":\"E\",\n\t\"Ś\":\"S\",\n\t\"Ṥ\":\"S\",\n\t\"Š\":\"S\",\n\t\"Ṧ\":\"S\",\n\t\"Ş\":\"S\",\n\t\"Ŝ\":\"S\",\n\t\"Ș\":\"S\",\n\t\"Ṡ\":\"S\",\n\t\"Ṣ\":\"S\",\n\t\"Ṩ\":\"S\",\n\t\"Ť\":\"T\",\n\t\"Ţ\":\"T\",\n\t\"Ṱ\":\"T\",\n\t\"Ț\":\"T\",\n\t\"Ⱦ\":\"T\",\n\t\"Ṫ\":\"T\",\n\t\"Ṭ\":\"T\",\n\t\"Ƭ\":\"T\",\n\t\"Ṯ\":\"T\",\n\t\"Ʈ\":\"T\",\n\t\"Ŧ\":\"T\",\n\t\"Ɐ\":\"A\",\n\t\"Ꞁ\":\"L\",\n\t\"Ɯ\":\"M\",\n\t\"Ʌ\":\"V\",\n\t\"Ꜩ\":\"TZ\",\n\t\"Ú\":\"U\",\n\t\"Ŭ\":\"U\",\n\t\"Ǔ\":\"U\",\n\t\"Û\":\"U\",\n\t\"Ṷ\":\"U\",\n\t\"Ü\":\"U\",\n\t\"Ǘ\":\"U\",\n\t\"Ǚ\":\"U\",\n\t\"Ǜ\":\"U\",\n\t\"Ǖ\":\"U\",\n\t\"Ṳ\":\"U\",\n\t\"Ụ\":\"U\",\n\t\"Ű\":\"U\",\n\t\"Ȕ\":\"U\",\n\t\"Ù\":\"U\",\n\t\"Ủ\":\"U\",\n\t\"Ư\":\"U\",\n\t\"Ứ\":\"U\",\n\t\"Ự\":\"U\",\n\t\"Ừ\":\"U\",\n\t\"Ử\":\"U\",\n\t\"Ữ\":\"U\",\n\t\"Ȗ\":\"U\",\n\t\"Ū\":\"U\",\n\t\"Ṻ\":\"U\",\n\t\"Ų\":\"U\",\n\t\"Ů\":\"U\",\n\t\"Ũ\":\"U\",\n\t\"Ṹ\":\"U\",\n\t\"Ṵ\":\"U\",\n\t\"Ꝟ\":\"V\",\n\t\"Ṿ\":\"V\",\n\t\"Ʋ\":\"V\",\n\t\"Ṽ\":\"V\",\n\t\"Ꝡ\":\"VY\",\n\t\"Ẃ\":\"W\",\n\t\"Ŵ\":\"W\",\n\t\"Ẅ\":\"W\",\n\t\"Ẇ\":\"W\",\n\t\"Ẉ\":\"W\",\n\t\"Ẁ\":\"W\",\n\t\"Ⱳ\":\"W\",\n\t\"Ẍ\":\"X\",\n\t\"Ẋ\":\"X\",\n\t\"Ý\":\"Y\",\n\t\"Ŷ\":\"Y\",\n\t\"Ÿ\":\"Y\",\n\t\"Ẏ\":\"Y\",\n\t\"Ỵ\":\"Y\",\n\t\"Ỳ\":\"Y\",\n\t\"Ƴ\":\"Y\",\n\t\"Ỷ\":\"Y\",\n\t\"Ỿ\":\"Y\",\n\t\"Ȳ\":\"Y\",\n\t\"Ɏ\":\"Y\",\n\t\"Ỹ\":\"Y\",\n\t\"Ź\":\"Z\",\n\t\"Ž\":\"Z\",\n\t\"Ẑ\":\"Z\",\n\t\"Ⱬ\":\"Z\",\n\t\"Ż\":\"Z\",\n\t\"Ẓ\":\"Z\",\n\t\"Ȥ\":\"Z\",\n\t\"Ẕ\":\"Z\",\n\t\"Ƶ\":\"Z\",\n\t\"IJ\":\"IJ\",\n\t\"Œ\":\"OE\",\n\t\"ᴀ\":\"A\",\n\t\"ᴁ\":\"AE\",\n\t\"ʙ\":\"B\",\n\t\"ᴃ\":\"B\",\n\t\"ᴄ\":\"C\",\n\t\"ᴅ\":\"D\",\n\t\"ᴇ\":\"E\",\n\t\"ꜰ\":\"F\",\n\t\"ɢ\":\"G\",\n\t\"ʛ\":\"G\",\n\t\"ʜ\":\"H\",\n\t\"ɪ\":\"I\",\n\t\"ʁ\":\"R\",\n\t\"ᴊ\":\"J\",\n\t\"ᴋ\":\"K\",\n\t\"ʟ\":\"L\",\n\t\"ᴌ\":\"L\",\n\t\"ᴍ\":\"M\",\n\t\"ɴ\":\"N\",\n\t\"ᴏ\":\"O\",\n\t\"ɶ\":\"OE\",\n\t\"ᴐ\":\"O\",\n\t\"ᴕ\":\"OU\",\n\t\"ᴘ\":\"P\",\n\t\"ʀ\":\"R\",\n\t\"ᴎ\":\"N\",\n\t\"ᴙ\":\"R\",\n\t\"ꜱ\":\"S\",\n\t\"ᴛ\":\"T\",\n\t\"ⱻ\":\"E\",\n\t\"ᴚ\":\"R\",\n\t\"ᴜ\":\"U\",\n\t\"ᴠ\":\"V\",\n\t\"ᴡ\":\"W\",\n\t\"ʏ\":\"Y\",\n\t\"ᴢ\":\"Z\",\n\t\"á\":\"a\",\n\t\"ă\":\"a\",\n\t\"ắ\":\"a\",\n\t\"ặ\":\"a\",\n\t\"ằ\":\"a\",\n\t\"ẳ\":\"a\",\n\t\"ẵ\":\"a\",\n\t\"ǎ\":\"a\",\n\t\"â\":\"a\",\n\t\"ấ\":\"a\",\n\t\"ậ\":\"a\",\n\t\"ầ\":\"a\",\n\t\"ẩ\":\"a\",\n\t\"ẫ\":\"a\",\n\t\"ä\":\"a\",\n\t\"ǟ\":\"a\",\n\t\"ȧ\":\"a\",\n\t\"ǡ\":\"a\",\n\t\"ạ\":\"a\",\n\t\"ȁ\":\"a\",\n\t\"à\":\"a\",\n\t\"ả\":\"a\",\n\t\"ȃ\":\"a\",\n\t\"ā\":\"a\",\n\t\"ą\":\"a\",\n\t\"ᶏ\":\"a\",\n\t\"ẚ\":\"a\",\n\t\"å\":\"a\",\n\t\"ǻ\":\"a\",\n\t\"ḁ\":\"a\",\n\t\"ⱥ\":\"a\",\n\t\"ã\":\"a\",\n\t\"ꜳ\":\"aa\",\n\t\"æ\":\"ae\",\n\t\"ǽ\":\"ae\",\n\t\"ǣ\":\"ae\",\n\t\"ꜵ\":\"ao\",\n\t\"ꜷ\":\"au\",\n\t\"ꜹ\":\"av\",\n\t\"ꜻ\":\"av\",\n\t\"ꜽ\":\"ay\",\n\t\"ḃ\":\"b\",\n\t\"ḅ\":\"b\",\n\t\"ɓ\":\"b\",\n\t\"ḇ\":\"b\",\n\t\"ᵬ\":\"b\",\n\t\"ᶀ\":\"b\",\n\t\"ƀ\":\"b\",\n\t\"ƃ\":\"b\",\n\t\"ɵ\":\"o\",\n\t\"ć\":\"c\",\n\t\"č\":\"c\",\n\t\"ç\":\"c\",\n\t\"ḉ\":\"c\",\n\t\"ĉ\":\"c\",\n\t\"ɕ\":\"c\",\n\t\"ċ\":\"c\",\n\t\"ƈ\":\"c\",\n\t\"ȼ\":\"c\",\n\t\"ď\":\"d\",\n\t\"ḑ\":\"d\",\n\t\"ḓ\":\"d\",\n\t\"ȡ\":\"d\",\n\t\"ḋ\":\"d\",\n\t\"ḍ\":\"d\",\n\t\"ɗ\":\"d\",\n\t\"ᶑ\":\"d\",\n\t\"ḏ\":\"d\",\n\t\"ᵭ\":\"d\",\n\t\"ᶁ\":\"d\",\n\t\"đ\":\"d\",\n\t\"ɖ\":\"d\",\n\t\"ƌ\":\"d\",\n\t\"ı\":\"i\",\n\t\"ȷ\":\"j\",\n\t\"ɟ\":\"j\",\n\t\"ʄ\":\"j\",\n\t\"dz\":\"dz\",\n\t\"dž\":\"dz\",\n\t\"é\":\"e\",\n\t\"ĕ\":\"e\",\n\t\"ě\":\"e\",\n\t\"ȩ\":\"e\",\n\t\"ḝ\":\"e\",\n\t\"ê\":\"e\",\n\t\"ế\":\"e\",\n\t\"ệ\":\"e\",\n\t\"ề\":\"e\",\n\t\"ể\":\"e\",\n\t\"ễ\":\"e\",\n\t\"ḙ\":\"e\",\n\t\"ë\":\"e\",\n\t\"ė\":\"e\",\n\t\"ẹ\":\"e\",\n\t\"ȅ\":\"e\",\n\t\"è\":\"e\",\n\t\"ẻ\":\"e\",\n\t\"ȇ\":\"e\",\n\t\"ē\":\"e\",\n\t\"ḗ\":\"e\",\n\t\"ḕ\":\"e\",\n\t\"ⱸ\":\"e\",\n\t\"ę\":\"e\",\n\t\"ᶒ\":\"e\",\n\t\"ɇ\":\"e\",\n\t\"ẽ\":\"e\",\n\t\"ḛ\":\"e\",\n\t\"ꝫ\":\"et\",\n\t\"ḟ\":\"f\",\n\t\"ƒ\":\"f\",\n\t\"ᵮ\":\"f\",\n\t\"ᶂ\":\"f\",\n\t\"ǵ\":\"g\",\n\t\"ğ\":\"g\",\n\t\"ǧ\":\"g\",\n\t\"ģ\":\"g\",\n\t\"ĝ\":\"g\",\n\t\"ġ\":\"g\",\n\t\"ɠ\":\"g\",\n\t\"ḡ\":\"g\",\n\t\"ᶃ\":\"g\",\n\t\"ǥ\":\"g\",\n\t\"ḫ\":\"h\",\n\t\"ȟ\":\"h\",\n\t\"ḩ\":\"h\",\n\t\"ĥ\":\"h\",\n\t\"ⱨ\":\"h\",\n\t\"ḧ\":\"h\",\n\t\"ḣ\":\"h\",\n\t\"ḥ\":\"h\",\n\t\"ɦ\":\"h\",\n\t\"ẖ\":\"h\",\n\t\"ħ\":\"h\",\n\t\"ƕ\":\"hv\",\n\t\"í\":\"i\",\n\t\"ĭ\":\"i\",\n\t\"ǐ\":\"i\",\n\t\"î\":\"i\",\n\t\"ï\":\"i\",\n\t\"ḯ\":\"i\",\n\t\"ị\":\"i\",\n\t\"ȉ\":\"i\",\n\t\"ì\":\"i\",\n\t\"ỉ\":\"i\",\n\t\"ȋ\":\"i\",\n\t\"ī\":\"i\",\n\t\"į\":\"i\",\n\t\"ᶖ\":\"i\",\n\t\"ɨ\":\"i\",\n\t\"ĩ\":\"i\",\n\t\"ḭ\":\"i\",\n\t\"ꝺ\":\"d\",\n\t\"ꝼ\":\"f\",\n\t\"ᵹ\":\"g\",\n\t\"ꞃ\":\"r\",\n\t\"ꞅ\":\"s\",\n\t\"ꞇ\":\"t\",\n\t\"ꝭ\":\"is\",\n\t\"ǰ\":\"j\",\n\t\"ĵ\":\"j\",\n\t\"ʝ\":\"j\",\n\t\"ɉ\":\"j\",\n\t\"ḱ\":\"k\",\n\t\"ǩ\":\"k\",\n\t\"ķ\":\"k\",\n\t\"ⱪ\":\"k\",\n\t\"ꝃ\":\"k\",\n\t\"ḳ\":\"k\",\n\t\"ƙ\":\"k\",\n\t\"ḵ\":\"k\",\n\t\"ᶄ\":\"k\",\n\t\"ꝁ\":\"k\",\n\t\"ꝅ\":\"k\",\n\t\"ĺ\":\"l\",\n\t\"ƚ\":\"l\",\n\t\"ɬ\":\"l\",\n\t\"ľ\":\"l\",\n\t\"ļ\":\"l\",\n\t\"ḽ\":\"l\",\n\t\"ȴ\":\"l\",\n\t\"ḷ\":\"l\",\n\t\"ḹ\":\"l\",\n\t\"ⱡ\":\"l\",\n\t\"ꝉ\":\"l\",\n\t\"ḻ\":\"l\",\n\t\"ŀ\":\"l\",\n\t\"ɫ\":\"l\",\n\t\"ᶅ\":\"l\",\n\t\"ɭ\":\"l\",\n\t\"ł\":\"l\",\n\t\"lj\":\"lj\",\n\t\"ſ\":\"s\",\n\t\"ẜ\":\"s\",\n\t\"ẛ\":\"s\",\n\t\"ẝ\":\"s\",\n\t\"ḿ\":\"m\",\n\t\"ṁ\":\"m\",\n\t\"ṃ\":\"m\",\n\t\"ɱ\":\"m\",\n\t\"ᵯ\":\"m\",\n\t\"ᶆ\":\"m\",\n\t\"ń\":\"n\",\n\t\"ň\":\"n\",\n\t\"ņ\":\"n\",\n\t\"ṋ\":\"n\",\n\t\"ȵ\":\"n\",\n\t\"ṅ\":\"n\",\n\t\"ṇ\":\"n\",\n\t\"ǹ\":\"n\",\n\t\"ɲ\":\"n\",\n\t\"ṉ\":\"n\",\n\t\"ƞ\":\"n\",\n\t\"ᵰ\":\"n\",\n\t\"ᶇ\":\"n\",\n\t\"ɳ\":\"n\",\n\t\"ñ\":\"n\",\n\t\"nj\":\"nj\",\n\t\"ó\":\"o\",\n\t\"ŏ\":\"o\",\n\t\"ǒ\":\"o\",\n\t\"ô\":\"o\",\n\t\"ố\":\"o\",\n\t\"ộ\":\"o\",\n\t\"ồ\":\"o\",\n\t\"ổ\":\"o\",\n\t\"ỗ\":\"o\",\n\t\"ö\":\"o\",\n\t\"ȫ\":\"o\",\n\t\"ȯ\":\"o\",\n\t\"ȱ\":\"o\",\n\t\"ọ\":\"o\",\n\t\"ő\":\"o\",\n\t\"ȍ\":\"o\",\n\t\"ò\":\"o\",\n\t\"ỏ\":\"o\",\n\t\"ơ\":\"o\",\n\t\"ớ\":\"o\",\n\t\"ợ\":\"o\",\n\t\"ờ\":\"o\",\n\t\"ở\":\"o\",\n\t\"ỡ\":\"o\",\n\t\"ȏ\":\"o\",\n\t\"ꝋ\":\"o\",\n\t\"ꝍ\":\"o\",\n\t\"ⱺ\":\"o\",\n\t\"ō\":\"o\",\n\t\"ṓ\":\"o\",\n\t\"ṑ\":\"o\",\n\t\"ǫ\":\"o\",\n\t\"ǭ\":\"o\",\n\t\"ø\":\"o\",\n\t\"ǿ\":\"o\",\n\t\"õ\":\"o\",\n\t\"ṍ\":\"o\",\n\t\"ṏ\":\"o\",\n\t\"ȭ\":\"o\",\n\t\"ƣ\":\"oi\",\n\t\"ꝏ\":\"oo\",\n\t\"ɛ\":\"e\",\n\t\"ᶓ\":\"e\",\n\t\"ɔ\":\"o\",\n\t\"ᶗ\":\"o\",\n\t\"ȣ\":\"ou\",\n\t\"ṕ\":\"p\",\n\t\"ṗ\":\"p\",\n\t\"ꝓ\":\"p\",\n\t\"ƥ\":\"p\",\n\t\"ᵱ\":\"p\",\n\t\"ᶈ\":\"p\",\n\t\"ꝕ\":\"p\",\n\t\"ᵽ\":\"p\",\n\t\"ꝑ\":\"p\",\n\t\"ꝙ\":\"q\",\n\t\"ʠ\":\"q\",\n\t\"ɋ\":\"q\",\n\t\"ꝗ\":\"q\",\n\t\"ŕ\":\"r\",\n\t\"ř\":\"r\",\n\t\"ŗ\":\"r\",\n\t\"ṙ\":\"r\",\n\t\"ṛ\":\"r\",\n\t\"ṝ\":\"r\",\n\t\"ȑ\":\"r\",\n\t\"ɾ\":\"r\",\n\t\"ᵳ\":\"r\",\n\t\"ȓ\":\"r\",\n\t\"ṟ\":\"r\",\n\t\"ɼ\":\"r\",\n\t\"ᵲ\":\"r\",\n\t\"ᶉ\":\"r\",\n\t\"ɍ\":\"r\",\n\t\"ɽ\":\"r\",\n\t\"ↄ\":\"c\",\n\t\"ꜿ\":\"c\",\n\t\"ɘ\":\"e\",\n\t\"ɿ\":\"r\",\n\t\"ś\":\"s\",\n\t\"ṥ\":\"s\",\n\t\"š\":\"s\",\n\t\"ṧ\":\"s\",\n\t\"ş\":\"s\",\n\t\"ŝ\":\"s\",\n\t\"ș\":\"s\",\n\t\"ṡ\":\"s\",\n\t\"ṣ\":\"s\",\n\t\"ṩ\":\"s\",\n\t\"ʂ\":\"s\",\n\t\"ᵴ\":\"s\",\n\t\"ᶊ\":\"s\",\n\t\"ȿ\":\"s\",\n\t\"ɡ\":\"g\",\n\t\"ᴑ\":\"o\",\n\t\"ᴓ\":\"o\",\n\t\"ᴝ\":\"u\",\n\t\"ť\":\"t\",\n\t\"ţ\":\"t\",\n\t\"ṱ\":\"t\",\n\t\"ț\":\"t\",\n\t\"ȶ\":\"t\",\n\t\"ẗ\":\"t\",\n\t\"ⱦ\":\"t\",\n\t\"ṫ\":\"t\",\n\t\"ṭ\":\"t\",\n\t\"ƭ\":\"t\",\n\t\"ṯ\":\"t\",\n\t\"ᵵ\":\"t\",\n\t\"ƫ\":\"t\",\n\t\"ʈ\":\"t\",\n\t\"ŧ\":\"t\",\n\t\"ᵺ\":\"th\",\n\t\"ɐ\":\"a\",\n\t\"ᴂ\":\"ae\",\n\t\"ǝ\":\"e\",\n\t\"ᵷ\":\"g\",\n\t\"ɥ\":\"h\",\n\t\"ʮ\":\"h\",\n\t\"ʯ\":\"h\",\n\t\"ᴉ\":\"i\",\n\t\"ʞ\":\"k\",\n\t\"ꞁ\":\"l\",\n\t\"ɯ\":\"m\",\n\t\"ɰ\":\"m\",\n\t\"ᴔ\":\"oe\",\n\t\"ɹ\":\"r\",\n\t\"ɻ\":\"r\",\n\t\"ɺ\":\"r\",\n\t\"ⱹ\":\"r\",\n\t\"ʇ\":\"t\",\n\t\"ʌ\":\"v\",\n\t\"ʍ\":\"w\",\n\t\"ʎ\":\"y\",\n\t\"ꜩ\":\"tz\",\n\t\"ú\":\"u\",\n\t\"ŭ\":\"u\",\n\t\"ǔ\":\"u\",\n\t\"û\":\"u\",\n\t\"ṷ\":\"u\",\n\t\"ü\":\"u\",\n\t\"ǘ\":\"u\",\n\t\"ǚ\":\"u\",\n\t\"ǜ\":\"u\",\n\t\"ǖ\":\"u\",\n\t\"ṳ\":\"u\",\n\t\"ụ\":\"u\",\n\t\"ű\":\"u\",\n\t\"ȕ\":\"u\",\n\t\"ù\":\"u\",\n\t\"ủ\":\"u\",\n\t\"ư\":\"u\",\n\t\"ứ\":\"u\",\n\t\"ự\":\"u\",\n\t\"ừ\":\"u\",\n\t\"ử\":\"u\",\n\t\"ữ\":\"u\",\n\t\"ȗ\":\"u\",\n\t\"ū\":\"u\",\n\t\"ṻ\":\"u\",\n\t\"ų\":\"u\",\n\t\"ᶙ\":\"u\",\n\t\"ů\":\"u\",\n\t\"ũ\":\"u\",\n\t\"ṹ\":\"u\",\n\t\"ṵ\":\"u\",\n\t\"ᵫ\":\"ue\",\n\t\"ꝸ\":\"um\",\n\t\"ⱴ\":\"v\",\n\t\"ꝟ\":\"v\",\n\t\"ṿ\":\"v\",\n\t\"ʋ\":\"v\",\n\t\"ᶌ\":\"v\",\n\t\"ⱱ\":\"v\",\n\t\"ṽ\":\"v\",\n\t\"ꝡ\":\"vy\",\n\t\"ẃ\":\"w\",\n\t\"ŵ\":\"w\",\n\t\"ẅ\":\"w\",\n\t\"ẇ\":\"w\",\n\t\"ẉ\":\"w\",\n\t\"ẁ\":\"w\",\n\t\"ⱳ\":\"w\",\n\t\"ẘ\":\"w\",\n\t\"ẍ\":\"x\",\n\t\"ẋ\":\"x\",\n\t\"ᶍ\":\"x\",\n\t\"ý\":\"y\",\n\t\"ŷ\":\"y\",\n\t\"ÿ\":\"y\",\n\t\"ẏ\":\"y\",\n\t\"ỵ\":\"y\",\n\t\"ỳ\":\"y\",\n\t\"ƴ\":\"y\",\n\t\"ỷ\":\"y\",\n\t\"ỿ\":\"y\",\n\t\"ȳ\":\"y\",\n\t\"ẙ\":\"y\",\n\t\"ɏ\":\"y\",\n\t\"ỹ\":\"y\",\n\t\"ź\":\"z\",\n\t\"ž\":\"z\",\n\t\"ẑ\":\"z\",\n\t\"ʑ\":\"z\",\n\t\"ⱬ\":\"z\",\n\t\"ż\":\"z\",\n\t\"ẓ\":\"z\",\n\t\"ȥ\":\"z\",\n\t\"ẕ\":\"z\",\n\t\"ᵶ\":\"z\",\n\t\"ᶎ\":\"z\",\n\t\"ʐ\":\"z\",\n\t\"ƶ\":\"z\",\n\t\"ɀ\":\"z\",\n\t\"ff\":\"ff\",\n\t\"ffi\":\"ffi\",\n\t\"ffl\":\"ffl\",\n\t\"fi\":\"fi\",\n\t\"fl\":\"fl\",\n\t\"ij\":\"ij\",\n\t\"œ\":\"oe\",\n\t\"st\":\"st\",\n\t\"ₐ\":\"a\",\n\t\"ₑ\":\"e\",\n\t\"ᵢ\":\"i\",\n\t\"ⱼ\":\"j\",\n\t\"ₒ\":\"o\",\n\t\"ᵣ\":\"r\",\n\t\"ᵤ\":\"u\",\n\t\"ᵥ\":\"v\",\n\t\"ₓ\":\"x\",\n\t\"Ё\":\"YO\",\n\t\"Й\":\"I\",\n\t\"Ц\":\"TS\",\n\t\"У\":\"U\",\n\t\"К\":\"K\",\n\t\"Е\":\"E\",\n\t\"Н\":\"N\",\n\t\"Г\":\"G\",\n\t\"Ш\":\"SH\",\n\t\"Щ\":\"SCH\",\n\t\"З\":\"Z\",\n\t\"Х\":\"H\",\n\t\"Ъ\":\"'\",\n\t\"ё\":\"yo\",\n\t\"й\":\"i\",\n\t\"ц\":\"ts\",\n\t\"у\":\"u\",\n\t\"к\":\"k\",\n\t\"е\":\"e\",\n\t\"н\":\"n\",\n\t\"г\":\"g\",\n\t\"ш\":\"sh\",\n\t\"щ\":\"sch\",\n\t\"з\":\"z\",\n\t\"х\":\"h\",\n\t\"ъ\":\"'\",\n\t\"Ф\":\"F\",\n\t\"Ы\":\"I\",\n\t\"В\":\"V\",\n\t\"А\":\"a\",\n\t\"П\":\"P\",\n\t\"Р\":\"R\",\n\t\"О\":\"O\",\n\t\"Л\":\"L\",\n\t\"Д\":\"D\",\n\t\"Ж\":\"ZH\",\n\t\"Э\":\"E\",\n\t\"ф\":\"f\",\n\t\"ы\":\"i\",\n\t\"в\":\"v\",\n\t\"а\":\"a\",\n\t\"п\":\"p\",\n\t\"р\":\"r\",\n\t\"о\":\"o\",\n\t\"л\":\"l\",\n\t\"д\":\"d\",\n\t\"ж\":\"zh\",\n\t\"э\":\"e\",\n\t\"Я\":\"Ya\",\n\t\"Ч\":\"CH\",\n\t\"С\":\"S\",\n\t\"М\":\"M\",\n\t\"И\":\"I\",\n\t\"Т\":\"T\",\n\t\"Ь\":\"'\",\n\t\"Б\":\"B\",\n\t\"Ю\":\"YU\",\n\t\"я\":\"ya\",\n\t\"ч\":\"ch\",\n\t\"с\":\"s\",\n\t\"м\":\"m\",\n\t\"и\":\"i\",\n\t\"т\":\"t\",\n\t\"ь\":\"'\",\n\t\"б\":\"b\",\n\t\"ю\":\"yu\"\n};\n\nexports.transliterate = function(str) {\n\treturn str.replace(/[^A-Za-z0-9\\[\\] ]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || ch\n\t});\n};\n\nexports.transliterateToSafeASCII = function(str) {\n\treturn str.replace(/[^\\x00-\\x7F]/g,function(ch) {\n\t\treturn exports.transliterationPairs[ch] || \"\"\n\t});\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/utils/utils.js": {
"title": "$:/core/modules/utils/utils.js",
"text": "/*\\\ntitle: $:/core/modules/utils/utils.js\ntype: application/javascript\nmodule-type: utils\n\nVarious static utility functions.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar base64utf8 = require(\"$:/core/modules/utils/base64-utf8/base64-utf8.module.js\");\n\n/*\nDisplay a message, in colour if we're on a terminal\n*/\nexports.log = function(text,colour) {\n\tconsole.log($tw.node ? exports.terminalColour(colour) + text + exports.terminalColour() : text);\n};\n\nexports.terminalColour = function(colour) {\n\tif(!$tw.browser && $tw.node && process.stdout.isTTY) {\n\t\tif(colour) {\n\t\t\tvar code = exports.terminalColourLookup[colour];\n\t\t\tif(code) {\n\t\t\t\treturn \"\\x1b[\" + code + \"m\";\n\t\t\t}\n\t\t} else {\n\t\t\treturn \"\\x1b[0m\"; // Cancel colour\n\t\t}\n\t}\n\treturn \"\";\n};\n\nexports.terminalColourLookup = {\n\t\"black\": \"0;30\",\n\t\"red\": \"0;31\",\n\t\"green\": \"0;32\",\n\t\"brown/orange\": \"0;33\",\n\t\"blue\": \"0;34\",\n\t\"purple\": \"0;35\",\n\t\"cyan\": \"0;36\",\n\t\"light gray\": \"0;37\"\n};\n\n/*\nDisplay a warning, in colour if we're on a terminal\n*/\nexports.warning = function(text) {\n\texports.log(text,\"brown/orange\");\n};\n\n/*\nLog a table of name: value pairs\n*/\nexports.logTable = function(data) {\n\tif(console.table) {\n\t\tconsole.table(data);\n\t} else {\n\t\t$tw.utils.each(data,function(value,name) {\n\t\t\tconsole.log(name + \": \" + value);\n\t\t});\n\t}\n}\n\n/*\nReturn the integer represented by the str (string).\nReturn the dflt (default) parameter if str is not a base-10 number.\n*/\nexports.getInt = function(str,deflt) {\n\tvar i = parseInt(str,10);\n\treturn isNaN(i) ? deflt : i;\n}\n\n/*\nRepeatedly replaces a substring within a string. Like String.prototype.replace, but without any of the default special handling of $ sequences in the replace string\n*/\nexports.replaceString = function(text,search,replace) {\n\treturn text.replace(search,function() {\n\t\treturn replace;\n\t});\n};\n\n/*\nRepeats a string\n*/\nexports.repeat = function(str,count) {\n\tvar result = \"\";\n\tfor(var t=0;t<count;t++) {\n\t\tresult += str;\n\t}\n\treturn result;\n};\n\n/*\nTrim whitespace from the start and end of a string\nThanks to Steven Levithan, http://blog.stevenlevithan.com/archives/faster-trim-javascript\n*/\nexports.trim = function(str) {\n\tif(typeof str === \"string\") {\n\t\treturn str.replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n\t} else {\n\t\treturn str;\n\t}\n};\n\nexports.trimPrefix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/^\\s\\s*/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('^(' + unwanted + ')+');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\nexports.trimSuffix = function(str,unwanted) {\n\tif(typeof str === \"string\" && typeof unwanted === \"string\") {\n\t\tif(unwanted === \"\") {\n\t\t\treturn str.replace(/\\s\\s*$/, '');\n\t\t} else {\n\t\t\t// Safely regexp-escape the unwanted text\n\t\t\tunwanted = unwanted.replace(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\t\t\tvar regex = new RegExp('(' + unwanted + ')+$');\n\t\t\treturn str.replace(regex, '');\n\t\t}\n\t} else {\n\t\treturn str;\n\t}\n};\n\n/*\nConvert a string to sentence case (ie capitalise first letter)\n*/\nexports.toSentenceCase = function(str) {\n\treturn (str || \"\").replace(/^\\S/, function(c) {return c.toUpperCase();});\n}\n\n/*\nConvert a string to title case (ie capitalise each initial letter)\n*/\nexports.toTitleCase = function(str) {\n\treturn (str || \"\").replace(/(^|\\s)\\S/g, function(c) {return c.toUpperCase();});\n}\n\t\n/*\nFind the line break preceding a given position in a string\nReturns position immediately after that line break, or the start of the string\n*/\nexports.findPrecedingLineBreak = function(text,pos) {\n\tvar result = text.lastIndexOf(\"\\n\",pos - 1);\n\tif(result === -1) {\n\t\tresult = 0;\n\t} else {\n\t\tresult++;\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nFind the line break following a given position in a string\n*/\nexports.findFollowingLineBreak = function(text,pos) {\n\t// Cut to just past the following line break, or to the end of the text\n\tvar result = text.indexOf(\"\\n\",pos);\n\tif(result === -1) {\n\t\tresult = text.length;\n\t} else {\n\t\tif(text.charAt(result) === \"\\r\") {\n\t\t\tresult++;\n\t\t}\n\t}\n\treturn result;\n};\n\n/*\nReturn the number of keys in an object\n*/\nexports.count = function(object) {\n\treturn Object.keys(object || {}).length;\n};\n\n/*\nDetermine whether an array-item is an object-property\n*/\nexports.hopArray = function(object,array) {\n\tfor(var i=0; i<array.length; i++) {\n\t\tif($tw.utils.hop(object,array[i])) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n};\n\n/*\nRemove entries from an array\n\tarray: array to modify\n\tvalue: a single value to remove, or an array of values to remove\n*/\nexports.removeArrayEntries = function(array,value) {\n\tvar t,p;\n\tif($tw.utils.isArray(value)) {\n\t\tfor(t=0; t<value.length; t++) {\n\t\t\tp = array.indexOf(value[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tarray.splice(p,1);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tp = array.indexOf(value);\n\t\tif(p !== -1) {\n\t\t\tarray.splice(p,1);\n\t\t}\n\t}\n};\n\n/*\nCheck whether any members of a hashmap are present in another hashmap\n*/\nexports.checkDependencies = function(dependencies,changes) {\n\tvar hit = false;\n\t$tw.utils.each(changes,function(change,title) {\n\t\tif($tw.utils.hop(dependencies,title)) {\n\t\t\thit = true;\n\t\t}\n\t});\n\treturn hit;\n};\n\nexports.extend = function(object /* [, src] */) {\n\t$tw.utils.each(Array.prototype.slice.call(arguments, 1), function(source) {\n\t\tif(source) {\n\t\t\tfor(var property in source) {\n\t\t\t\tobject[property] = source[property];\n\t\t\t}\n\t\t}\n\t});\n\treturn object;\n};\n\nexports.deepCopy = function(object) {\n\tvar result,t;\n\tif($tw.utils.isArray(object)) {\n\t\t// Copy arrays\n\t\tresult = object.slice(0);\n\t} else if(typeof object === \"object\") {\n\t\tresult = {};\n\t\tfor(t in object) {\n\t\t\tif(object[t] !== undefined) {\n\t\t\t\tresult[t] = $tw.utils.deepCopy(object[t]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tresult = object;\n\t}\n\treturn result;\n};\n\nexports.extendDeepCopy = function(object,extendedProperties) {\n\tvar result = $tw.utils.deepCopy(object),t;\n\tfor(t in extendedProperties) {\n\t\tif(extendedProperties[t] !== undefined) {\n\t\t\tresult[t] = $tw.utils.deepCopy(extendedProperties[t]);\n\t\t}\n\t}\n\treturn result;\n};\n\nexports.deepFreeze = function deepFreeze(object) {\n\tvar property, key;\n\tif(object) {\n\t\tObject.freeze(object);\n\t\tfor(key in object) {\n\t\t\tproperty = object[key];\n\t\t\tif($tw.utils.hop(object,key) && (typeof property === \"object\") && !Object.isFrozen(property)) {\n\t\t\t\tdeepFreeze(property);\n\t\t\t}\n\t\t}\n\t}\n};\n\nexports.slowInSlowOut = function(t) {\n\treturn (1 - ((Math.cos(t * Math.PI) + 1) / 2));\n};\n\nexports.formatDateString = function(date,template) {\n\tvar result = \"\",\n\t\tt = template,\n\t\tmatches = [\n\t\t\t[/^0hh12/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getHours12(date));\n\t\t\t}],\n\t\t\t[/^wYYYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date),4);\n\t\t\t}],\n\t\t\t[/^hh12/, function() {\n\t\t\t\treturn $tw.utils.getHours12(date);\n\t\t\t}],\n\t\t\t[/^DDth/, function() {\n\t\t\t\treturn date.getDate() + $tw.utils.getDaySuffix(date);\n\t\t\t}],\n\t\t\t[/^YYYY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear(),4);\n\t\t\t}],\n\t\t\t[/^aYYYY/, function() {\n\t\t\t\treturn $tw.utils.pad(Math.abs(date.getFullYear()),4);\n\t\t\t}],\n\t\t\t[/^\\{era:([^,\\|}]*)\\|([^}\\|]*)\\|([^}]*)\\}/, function(match) {\n\t\t\t\tvar year = date.getFullYear();\n\t\t\t\treturn year === 0 ? match[2] : (year < 0 ? match[1] : match[3]);\n\t\t\t}],\n\t\t\t[/^0hh/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getHours());\n\t\t\t}],\n\t\t\t[/^0mm/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMinutes());\n\t\t\t}],\n\t\t\t[/^0ss/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getSeconds());\n\t\t\t}],\n\t\t\t[/^0XXX/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMilliseconds(),3);\n\t\t\t}],\n\t\t\t[/^0DD/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getDate());\n\t\t\t}],\n\t\t\t[/^0MM/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getMonth()+1);\n\t\t\t}],\n\t\t\t[/^0WW/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getWeek(date));\n\t\t\t}],\n\t\t\t[/^ddd/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^mmm/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Short/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^DDD/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Day/\" + date.getDay());\n\t\t\t}],\n\t\t\t[/^MMM/, function() {\n\t\t\t\treturn $tw.language.getString(\"Date/Long/Month/\" + (date.getMonth() + 1));\n\t\t\t}],\n\t\t\t[/^TZD/, function() {\n\t\t\t\tvar tz = date.getTimezoneOffset(),\n\t\t\t\tatz = Math.abs(tz);\n\t\t\t\treturn (tz < 0 ? '+' : '-') + $tw.utils.pad(Math.floor(atz / 60)) + ':' + $tw.utils.pad(atz % 60);\n\t\t\t}],\n\t\t\t[/^wYY/, function() {\n\t\t\t\treturn $tw.utils.pad($tw.utils.getYearForWeekNo(date) - 2000);\n\t\t\t}],\n\t\t\t[/^[ap]m/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toLowerCase();\n\t\t\t}],\n\t\t\t[/^hh/, function() {\n\t\t\t\treturn date.getHours();\n\t\t\t}],\n\t\t\t[/^mm/, function() {\n\t\t\t\treturn date.getMinutes();\n\t\t\t}],\n\t\t\t[/^ss/, function() {\n\t\t\t\treturn date.getSeconds();\n\t\t\t}],\n\t\t\t[/^XXX/, function() {\n\t\t\t\treturn date.getMilliseconds();\n\t\t\t}],\n\t\t\t[/^[AP]M/, function() {\n\t\t\t\treturn $tw.utils.getAmPm(date).toUpperCase();\n\t\t\t}],\n\t\t\t[/^DD/, function() {\n\t\t\t\treturn date.getDate();\n\t\t\t}],\n\t\t\t[/^MM/, function() {\n\t\t\t\treturn date.getMonth() + 1;\n\t\t\t}],\n\t\t\t[/^WW/, function() {\n\t\t\t\treturn $tw.utils.getWeek(date);\n\t\t\t}],\n\t\t\t[/^YY/, function() {\n\t\t\t\treturn $tw.utils.pad(date.getFullYear() - 2000);\n\t\t\t}]\n\t\t];\n\t// If the user wants everything in UTC, shift the datestamp\n\t// Optimize for format string that essentially means\n\t// 'return raw UTC (tiddlywiki style) date string.'\n\tif(t.indexOf(\"[UTC]\") == 0 ) {\n\t\tif(t == \"[UTC]YYYY0MM0DD0hh0mm0ssXXX\")\n\t\t\treturn $tw.utils.stringifyDate(new Date());\n\t\tvar offset = date.getTimezoneOffset() ; // in minutes\n\t\tdate = new Date(date.getTime()+offset*60*1000) ;\n\t\tt = t.substr(5) ;\n\t}\n\twhile(t.length){\n\t\tvar matchString = \"\";\n\t\t$tw.utils.each(matches, function(m) {\n\t\t\tvar match = m[0].exec(t);\n\t\t\tif(match) {\n\t\t\t\tmatchString = m[1].call(null,match);\n\t\t\t\tt = t.substr(match[0].length);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t\tif(matchString) {\n\t\t\tresult += matchString;\n\t\t} else {\n\t\t\tresult += t.charAt(0);\n\t\t\tt = t.substr(1);\n\t\t}\n\t}\n\tresult = result.replace(/\\\\(.)/g,\"$1\");\n\treturn result;\n};\n\nexports.getAmPm = function(date) {\n\treturn $tw.language.getString(\"Date/Period/\" + (date.getHours() >= 12 ? \"pm\" : \"am\"));\n};\n\nexports.getDaySuffix = function(date) {\n\treturn $tw.language.getString(\"Date/DaySuffix/\" + date.getDate());\n};\n\nexports.getWeek = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week to calculate weekNo\n\tvar x = new Date(dt.getFullYear(),0,1);\n\tvar n = Math.floor((dt.getTime() - x.getTime()) / 86400000);\n\treturn Math.floor(n / 7) + 1;\n};\n\nexports.getYearForWeekNo = function(date) {\n\tvar dt = new Date(date.getTime());\n\tvar d = dt.getDay();\n\tif(d === 0) {\n\t\td = 7; // JavaScript Sun=0, ISO Sun=7\n\t}\n\tdt.setTime(dt.getTime() + (4 - d) * 86400000);// shift day to Thurs of same week\n\treturn dt.getFullYear();\n};\n\nexports.getHours12 = function(date) {\n\tvar h = date.getHours();\n\treturn h > 12 ? h-12 : ( h > 0 ? h : 12 );\n};\n\n/*\nConvert a date delta in milliseconds into a string representation of \"23 seconds ago\", \"27 minutes ago\" etc.\n\tdelta: delta in milliseconds\nReturns an object with these members:\n\tdescription: string describing the delta period\n\tupdatePeriod: time in millisecond until the string will be inaccurate\n*/\nexports.getRelativeDate = function(delta) {\n\tvar futurep = false;\n\tif(delta < 0) {\n\t\tdelta = -1 * delta;\n\t\tfuturep = true;\n\t}\n\tvar units = [\n\t\t{name: \"Years\", duration: 365 * 24 * 60 * 60 * 1000},\n\t\t{name: \"Months\", duration: (365/12) * 24 * 60 * 60 * 1000},\n\t\t{name: \"Days\", duration: 24 * 60 * 60 * 1000},\n\t\t{name: \"Hours\", duration: 60 * 60 * 1000},\n\t\t{name: \"Minutes\", duration: 60 * 1000},\n\t\t{name: \"Seconds\", duration: 1000}\n\t];\n\tfor(var t=0; t<units.length; t++) {\n\t\tvar result = Math.floor(delta / units[t].duration);\n\t\tif(result >= 2) {\n\t\t\treturn {\n\t\t\t\tdelta: delta,\n\t\t\t\tdescription: $tw.language.getString(\n\t\t\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/\" + units[t].name,\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{period: result.toString()}\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\tupdatePeriod: units[t].duration\n\t\t\t};\n\t\t}\n\t}\n\treturn {\n\t\tdelta: delta,\n\t\tdescription: $tw.language.getString(\n\t\t\t\"RelativeDate/\" + (futurep ? \"Future\" : \"Past\") + \"/Second\",\n\t\t\t{variables:\n\t\t\t\t{period: \"1\"}\n\t\t\t}\n\t\t),\n\t\tupdatePeriod: 1000\n\t};\n};\n\n// Convert & to \"&\", < to \"<\", > to \">\", \" to \""\"\nexports.htmlEncode = function(s) {\n\tif(s) {\n\t\treturn s.toString().replace(/&/mg,\"&\").replace(/</mg,\"<\").replace(/>/mg,\">\").replace(/\\\"/mg,\""\");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n// Converts all HTML entities to their character equivalents\nexports.entityDecode = function(s) {\n\tvar converter = String.fromCodePoint || String.fromCharCode,\n\t\te = s.substr(1,s.length-2), // Strip the & and the ;\n\t\tc;\n\tif(e.charAt(0) === \"#\") {\n\t\tif(e.charAt(1) === \"x\" || e.charAt(1) === \"X\") {\n\t\t\tc = parseInt(e.substr(2),16);\n\t\t} else {\n\t\t\tc = parseInt(e.substr(1),10);\n\t\t}\n\t\tif(isNaN(c)) {\n\t\t\treturn s;\n\t\t} else {\n\t\t\treturn converter(c);\n\t\t}\n\t} else {\n\t\tc = $tw.config.htmlEntities[e];\n\t\tif(c) {\n\t\t\treturn converter(c);\n\t\t} else {\n\t\t\treturn s; // Couldn't convert it as an entity, just return it raw\n\t\t}\n\t}\n};\n\nexports.unescapeLineBreaks = function(s) {\n\treturn s.replace(/\\\\n/mg,\"\\n\").replace(/\\\\b/mg,\" \").replace(/\\\\s/mg,\"\\\\\").replace(/\\r/mg,\"\");\n};\n\n/*\n * Returns an escape sequence for given character. Uses \\x for characters <=\n * 0xFF to save space, \\u for the rest.\n *\n * The code needs to be in sync with th code template in the compilation\n * function for \"action\" nodes.\n */\n// Copied from peg.js, thanks to David Majda\nexports.escape = function(ch) {\n\tvar charCode = ch.charCodeAt(0);\n\tif(charCode <= 0xFF) {\n\t\treturn '\\\\x' + $tw.utils.pad(charCode.toString(16).toUpperCase());\n\t} else {\n\t\treturn '\\\\u' + $tw.utils.pad(charCode.toString(16).toUpperCase(),4);\n\t}\n};\n\n// Turns a string into a legal JavaScript string\n// Copied from peg.js, thanks to David Majda\nexports.stringify = function(s, rawUnicode) {\n\t/*\n\t* ECMA-262, 5th ed., 7.8.4: All characters may appear literally in a string\n\t* literal except for the closing quote character, backslash, carriage return,\n\t* line separator, paragraph separator, and line feed. Any character may\n\t* appear in the form of an escape sequence.\n\t*\n\t* For portability, we also escape all non-ASCII characters.\n\t*/\n\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/'/g, \"\\\\'\") // single quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(regex, exports.escape); // non-ASCII characters\n};\n\n// Turns a string into a legal JSON string\n// Derived from peg.js, thanks to David Majda\nexports.jsonStringify = function(s, rawUnicode) {\n\t// See http://www.json.org/\n\tvar regex = rawUnicode ? /[\\x00-\\x1f]/g : /[\\x00-\\x1f\\x80-\\uFFFF]/g;\n\treturn (s || \"\")\n\t\t.replace(/\\\\/g, '\\\\\\\\') // backslash\n\t\t.replace(/\"/g, '\\\\\"') // double quote character\n\t\t.replace(/\\r/g, '\\\\r') // carriage return\n\t\t.replace(/\\n/g, '\\\\n') // line feed\n\t\t.replace(/\\x08/g, '\\\\b') // backspace\n\t\t.replace(/\\x0c/g, '\\\\f') // formfeed\n\t\t.replace(/\\t/g, '\\\\t') // tab\n\t\t.replace(regex,function(s) {\n\t\t\treturn '\\\\u' + $tw.utils.pad(s.charCodeAt(0).toString(16).toUpperCase(),4);\n\t\t}); // non-ASCII characters\n};\n\n/*\nEscape the RegExp special characters with a preceding backslash\n*/\nexports.escapeRegExp = function(s) {\n return s.replace(/[\\-\\/\\\\\\^\\$\\*\\+\\?\\.\\(\\)\\|\\[\\]\\{\\}]/g, '\\\\$&');\n};\n\n// Checks whether a link target is external, i.e. not a tiddler title\nexports.isLinkExternal = function(to) {\n\tvar externalRegExp = /^(?:file|http|https|mailto|ftp|irc|news|data|skype):[^\\s<>{}\\[\\]`|\"\\\\^]+(?:\\/|\\b)/i;\n\treturn externalRegExp.test(to);\n};\n\nexports.nextTick = function(fn) {\n/*global window: false */\n\tif(typeof process === \"undefined\") {\n\t\t// Apparently it would be faster to use postMessage - http://dbaron.org/log/20100309-faster-timeouts\n\t\twindow.setTimeout(fn,4);\n\t} else {\n\t\tprocess.nextTick(fn);\n\t}\n};\n\n/*\nConvert a hyphenated CSS property name into a camel case one\n*/\nexports.unHyphenateCss = function(propName) {\n\treturn propName.replace(/-([a-z])/gi, function(match0,match1) {\n\t\treturn match1.toUpperCase();\n\t});\n};\n\n/*\nConvert a camelcase CSS property name into a dashed one (\"backgroundColor\" --> \"background-color\")\n*/\nexports.hyphenateCss = function(propName) {\n\treturn propName.replace(/([A-Z])/g, function(match0,match1) {\n\t\treturn \"-\" + match1.toLowerCase();\n\t});\n};\n\n/*\nParse a text reference of one of these forms:\n* title\n* !!field\n* title!!field\n* title##index\n* etc\nReturns an object with the following fields, all optional:\n* title: tiddler title\n* field: tiddler field name\n* index: JSON property index\n*/\nexports.parseTextReference = function(textRef) {\n\t// Separate out the title, field name and/or JSON indices\n\tvar reTextRef = /(?:(.*?)!!(.+))|(?:(.*?)##(.+))|(.*)/mg,\n\t\tmatch = reTextRef.exec(textRef),\n\t\tresult = {};\n\tif(match && reTextRef.lastIndex === textRef.length) {\n\t\t// Return the parts\n\t\tif(match[1]) {\n\t\t\tresult.title = match[1];\n\t\t}\n\t\tif(match[2]) {\n\t\t\tresult.field = match[2];\n\t\t}\n\t\tif(match[3]) {\n\t\t\tresult.title = match[3];\n\t\t}\n\t\tif(match[4]) {\n\t\t\tresult.index = match[4];\n\t\t}\n\t\tif(match[5]) {\n\t\t\tresult.title = match[5];\n\t\t}\n\t} else {\n\t\t// If we couldn't parse it\n\t\tresult.title = textRef\n\t}\n\treturn result;\n};\n\n/*\nChecks whether a string is a valid fieldname\n*/\nexports.isValidFieldName = function(name) {\n\tif(!name || typeof name !== \"string\") {\n\t\treturn false;\n\t}\n\tname = name.toLowerCase().trim();\n\tvar fieldValidatorRegEx = /^[a-z0-9\\-\\._]+$/mg;\n\treturn fieldValidatorRegEx.test(name);\n};\n\n/*\nExtract the version number from the meta tag or from the boot file\n*/\n\n// Browser version\nexports.extractVersionInfo = function() {\n\tif($tw.packageInfo) {\n\t\treturn $tw.packageInfo.version;\n\t} else {\n\t\tvar metatags = document.getElementsByTagName(\"meta\");\n\t\tfor(var t=0; t<metatags.length; t++) {\n\t\t\tvar m = metatags[t];\n\t\t\tif(m.name === \"tiddlywiki-version\") {\n\t\t\t\treturn m.content;\n\t\t\t}\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the animation duration in ms\n*/\nexports.getAnimationDuration = function() {\n\treturn parseInt($tw.wiki.getTiddlerText(\"$:/config/AnimationDuration\",\"400\"),10) || 0;\n};\n\n/*\nHash a string to a number\nDerived from http://stackoverflow.com/a/15710692\n*/\nexports.hashString = function(str) {\n\treturn str.split(\"\").reduce(function(a,b) {\n\t\ta = ((a << 5) - a) + b.charCodeAt(0);\n\t\treturn a & a;\n\t},0);\n};\n\n/*\nDecode a base64 string\n*/\nexports.base64Decode = function(string64) {\n\treturn base64utf8.base64.decode.call(base64utf8,string64);\n};\n\n/*\nEncode a string to base64\n*/\nexports.base64Encode = function(string64) {\n\treturn base64utf8.base64.encode.call(base64utf8,string64);\n};\n\n/*\nConvert a hashmap into a tiddler dictionary format sequence of name:value pairs\n*/\nexports.makeTiddlerDictionary = function(data) {\n\tvar output = [];\n\tfor(var name in data) {\n\t\toutput.push(name + \": \" + data[name]);\n\t}\n\treturn output.join(\"\\n\");\n};\n\n/*\nHigh resolution microsecond timer for profiling\n*/\nexports.timer = function(base) {\n\tvar m;\n\tif($tw.node) {\n\t\tvar r = process.hrtime();\n\t\tm = r[0] * 1e3 + (r[1] / 1e6);\n\t} else if(window.performance) {\n\t\tm = performance.now();\n\t} else {\n\t\tm = Date.now();\n\t}\n\tif(typeof base !== \"undefined\") {\n\t\tm = m - base;\n\t}\n\treturn m;\n};\n\n/*\nConvert text and content type to a data URI\n*/\nexports.makeDataUri = function(text,type,_canonical_uri) {\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar typeInfo = $tw.config.contentTypeInfo[type] || $tw.config.contentTypeInfo[\"text/plain\"],\n\t\tisBase64 = typeInfo.encoding === \"base64\",\n\t\tparts = [];\n\tif(_canonical_uri) {\n\t\tparts.push(_canonical_uri);\n\t} else {\n\t\tparts.push(\"data:\");\n\t\tparts.push(type);\n\t\tparts.push(isBase64 ? \";base64\" : \"\");\n\t\tparts.push(\",\");\n\t\tparts.push(isBase64 ? text : encodeURIComponent(text));\t\t\n\t}\n\treturn parts.join(\"\");\n};\n\n/*\nUseful for finding out the fully escaped CSS selector equivalent to a given tag. For example:\n\n$tw.utils.tagToCssSelector(\"$:/tags/Stylesheet\") --> tc-tagged-\\%24\\%3A\\%2Ftags\\%2FStylesheet\n*/\nexports.tagToCssSelector = function(tagName) {\n\treturn \"tc-tagged-\" + encodeURIComponent(tagName).replace(/[!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^`{\\|}~,]/mg,function(c) {\n\t\treturn \"\\\\\" + c;\n\t});\n};\n\n/*\nIE does not have sign function\n*/\nexports.sign = Math.sign || function(x) {\n\tx = +x; // convert to a number\n\tif (x === 0 || isNaN(x)) {\n\t\treturn x;\n\t}\n\treturn x > 0 ? 1 : -1;\n};\n\n/*\nIE does not have an endsWith function\n*/\nexports.strEndsWith = function(str,ending,position) {\n\tif(str.endsWith) {\n\t\treturn str.endsWith(ending,position);\n\t} else {\n\t\tif (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > str.length) {\n\t\t\tposition = str.length;\n\t\t}\n\t\tposition -= ending.length;\n\t\tvar lastIndex = str.indexOf(ending, position);\n\t\treturn lastIndex !== -1 && lastIndex === position;\n\t}\n};\n\n/*\nReturn system information useful for debugging\n*/\nexports.getSystemInfo = function(str,ending,position) {\n\tvar results = [],\n\t\tsave = function(desc,value) {\n\t\t\tresults.push(desc + \": \" + value);\n\t\t};\n\tif($tw.browser) {\n\t\tsave(\"User Agent\",navigator.userAgent);\n\t\tsave(\"Online Status\",window.navigator.onLine);\n\t}\n\tif($tw.node) {\n\t\tsave(\"Node Version\",process.version);\n\t}\n\treturn results.join(\"\\n\");\n};\n\nexports.parseNumber = function(str) {\n\treturn parseFloat(str) || 0;\n};\n\nexports.parseInt = function(str) {\n\treturn parseInt(str,10) || 0;\n};\n\nexports.stringifyNumber = function(num) {\n\treturn num + \"\";\n};\n\nexports.makeCompareFunction = function(type,options) {\n\toptions = options || {};\n\tvar gt = options.invert ? -1 : +1,\n\t\tlt = options.invert ? +1 : -1,\n\t\tcompare = function(a,b) {\n\t\t\tif(a > b) {\n\t\t\t\treturn gt ;\n\t\t\t} else if(a < b) {\n\t\t\t\treturn lt;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t},\n\t\ttypes = {\n\t\t\t\"number\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseNumber(a),$tw.utils.parseNumber(b));\n\t\t\t},\n\t\t\t\"integer\": function(a,b) {\n\t\t\t\treturn compare($tw.utils.parseInt(a),$tw.utils.parseInt(b));\n\t\t\t},\n\t\t\t\"string\": function(a,b) {\n\t\t\t\treturn compare(\"\" + a,\"\" +b);\n\t\t\t},\n\t\t\t\"date\": function(a,b) {\n\t\t\t\tvar dateA = $tw.utils.parseDate(a),\n\t\t\t\t\tdateB = $tw.utils.parseDate(b);\n\t\t\t\tif(!isFinite(dateA)) {\n\t\t\t\t\tdateA = new Date(0);\n\t\t\t\t}\n\t\t\t\tif(!isFinite(dateB)) {\n\t\t\t\t\tdateB = new Date(0);\n\t\t\t\t}\n\t\t\t\treturn compare(dateA,dateB);\n\t\t\t},\n\t\t\t\"version\": function(a,b) {\n\t\t\t\treturn $tw.utils.compareVersions(a,b);\n\t\t\t}\n\t\t};\n\treturn (types[type] || types[options.defaultType] || types.number);\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "utils"
},
"$:/core/modules/widgets/action-confirm.js": {
"title": "$:/core/modules/widgets/action-confirm.js",
"text": "/*\\\n\ntitle: $:/core/modules/widgets/action-confirm.js\ntype: application/javascript\nmodule-type: widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ConfirmWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nConfirmWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nConfirmWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.parentDomNode = parent;\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nConfirmWidget.prototype.execute = function() {\n\tthis.message = this.getAttribute(\"$message\",$tw.language.getString(\"ConfirmAction\"));\n\tthis.prompt = (this.getAttribute(\"$prompt\",\"yes\") == \"no\" ? false : true);\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nConfirmWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$message\"] || changedAttributes[\"$prompt\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nConfirmWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar invokeActions = true,\n\t\thandled = true;\n\tif(this.prompt) {\n\t\tinvokeActions = confirm(this.message);\n\t}\n\tif(invokeActions) {\n\t\thandled = this.invokeActions(triggeringWidget,event);\n\t}\n\treturn handled;\n};\n\nConfirmWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nexports[\"action-confirm\"] = ConfirmWidget;\n\n})();",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-createtiddler.js": {
"title": "$:/core/modules/widgets/action-createtiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-createtiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to create a new tiddler with a unique name and specified fields.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw:false, require:false, exports:false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CreateTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCreateTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCreateTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nCreateTiddlerWidget.prototype.execute = function() {\n\tthis.actionBaseTitle = this.getAttribute(\"$basetitle\");\n\tthis.hasBase = !!this.actionBaseTitle;\n\tthis.actionSaveTitle = this.getAttribute(\"$savetitle\");\n\tthis.actionSaveDraftTitle = this.getAttribute(\"$savedrafttitle\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n\t//Following params are new since 5.1.22\n\tthis.actionTemplate = this.getAttribute(\"$template\");\n\tthis.useTemplate = !!this.actionTemplate;\n\tthis.actionOverwrite = this.getAttribute(\"$overwrite\",\"no\");\n\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nCreateTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nCreateTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar title = this.wiki.getTiddlerText(\"$:/language/DefaultNewTiddlerTitle\"), // Get the initial new-tiddler title\n\t\tfields = {},\n\t\tcreationFields,\n\t\tmodificationFields;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tfields[name] = attribute;\n\t\t}\n\t});\n\tif(this.actionTimestamp) {\n\t\tcreationFields = this.wiki.getCreationFields();\n\t\tmodificationFields = this.wiki.getModificationFields();\n\t}\n\tif(this.hasBase && this.actionOverwrite === \"no\") {\n\t\ttitle = this.wiki.generateNewTitle(this.actionBaseTitle);\n\t} else if (this.hasBase && this.actionOverwrite === \"yes\") {\n\t\ttitle = this.actionBaseTitle\n\t}\n\t// NO $basetitle BUT $template parameter is available\n\t// the title MUST be unique, otherwise the template would be overwritten\n\tif (!this.hasBase && this.useTemplate) {\n\t\ttitle = this.wiki.generateNewTitle(this.actionTemplate);\n\t} else if (!this.hasBase && !this.useTemplate) {\n\t\t// If NO $basetitle AND NO $template use initial title\n\t\t// DON'T overwrite any stuff\n\t\ttitle = this.wiki.generateNewTitle(title);\n\t}\n\tvar templateTiddler = this.wiki.getTiddler(this.actionTemplate) || {};\n\tvar tiddler = this.wiki.addTiddler(new $tw.Tiddler(templateTiddler.fields,creationFields,fields,modificationFields,{title: title}));\n\tif(this.actionSaveTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveTitle,title,this.getVariable(\"currentTiddler\"));\n\t}\n\tif(this.actionSaveDraftTitle) {\n\t\tthis.wiki.setTextReference(this.actionSaveDraftTitle,this.wiki.generateDraftTitle(title),this.getVariable(\"currentTiddler\"));\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-createtiddler\"] = CreateTiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-deletefield.js": {
"title": "$:/core/modules/widgets/action-deletefield.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletefield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete fields of a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\ttiddler = this.wiki.getTiddler(self.actionTiddler),\n\t\tremoveFields = {},\n\t\thasChanged = false;\n\tif(this.actionField && tiddler) {\n\t\tremoveFields[this.actionField] = undefined;\n\t\tif(this.actionField in tiddler.fields) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(tiddler) {\n\t\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\t\tif(name.charAt(0) !== \"$\" && name !== \"title\") {\n\t\t\t\tremoveFields[name] = undefined;\n\t\t\t\thasChanged = true;\n\t\t\t}\n\t\t});\n\t\tif(hasChanged) {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,removeFields,this.wiki.getModificationFields()));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletefield\"] = DeleteFieldWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-deletetiddler.js": {
"title": "$:/core/modules/widgets/action-deletetiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-deletetiddler.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to delete a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DeleteTiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDeleteTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDeleteTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nDeleteTiddlerWidget.prototype.execute = function() {\n\tthis.actionFilter = this.getAttribute(\"$filter\");\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nDeleteTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$filter\"] || changedAttributes[\"$tiddler\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nDeleteTiddlerWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar tiddlers = [];\n\tif(this.actionFilter) {\n\t\ttiddlers = this.wiki.filterTiddlers(this.actionFilter,this);\n\t}\n\tif(this.actionTiddler) {\n\t\ttiddlers.push(this.actionTiddler);\n\t}\n\tfor(var t=0; t<tiddlers.length; t++) {\n\t\tthis.wiki.deleteTiddler(tiddlers[t]);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-deletetiddler\"] = DeleteTiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-listops.js": {
"title": "$:/core/modules/widgets/action-listops.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-listops.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to apply list operations to any tiddler field (defaults to the 'list' field of the current tiddler)\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar ActionListopsWidget = function(parseTreeNode, options) {\n\tthis.initialise(parseTreeNode, options);\n};\n/**\n * Inherit from the base widget class\n */\nActionListopsWidget.prototype = new Widget();\n/**\n * Render this widget into the DOM\n */\nActionListopsWidget.prototype.render = function(parent, nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n/**\n * Compute the internal state of the widget\n */\nActionListopsWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.target = this.getAttribute(\"$tiddler\", this.getVariable(\n\t\t\"currentTiddler\"));\n\tthis.filter = this.getAttribute(\"$filter\");\n\tthis.subfilter = this.getAttribute(\"$subfilter\");\n\tthis.listField = this.getAttribute(\"$field\", \"list\");\n\tthis.listIndex = this.getAttribute(\"$index\");\n\tthis.filtertags = this.getAttribute(\"$tags\");\n};\n/**\n * \tRefresh the widget by ensuring our attributes are up to date\n */\nActionListopsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.$tiddler || changedAttributes.$filter ||\n\t\tchangedAttributes.$subfilter || changedAttributes.$field ||\n\t\tchangedAttributes.$index || changedAttributes.$tags) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n/**\n * \tInvoke the action associated with this widget\n */\nActionListopsWidget.prototype.invokeAction = function(triggeringWidget,\n\tevent) {\n\t//Apply the specified filters to the lists\n\tvar field = this.listField,\n\t\tindex,\n\t\ttype = \"!!\",\n\t\tlist = this.listField;\n\tif(this.listIndex) {\n\t\tfield = undefined;\n\t\tindex = this.listIndex;\n\t\ttype = \"##\";\n\t\tlist = this.listIndex;\n\t}\n\tif(this.filter) {\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(this.filter, this)));\n\t}\n\tif(this.subfilter) {\n\t\tvar subfilter = \"[list[\" + this.target + type + list + \"]] \" + this.subfilter;\n\t\tthis.wiki.setText(this.target, field, index, $tw.utils.stringifyList(\n\t\t\tthis.wiki\n\t\t\t.filterTiddlers(subfilter, this)));\n\t}\n\tif(this.filtertags) {\n\t\tvar tiddler = this.wiki.getTiddler(this.target),\n\t\t\toldtags = tiddler ? (tiddler.fields.tags || []).slice(0) : [],\n\t\t\ttagfilter = \"[list[\" + this.target + \"!!tags]] \" + this.filtertags,\n\t\t\tnewtags = this.wiki.filterTiddlers(tagfilter,this);\n\t\tif($tw.utils.stringifyList(oldtags.sort()) !== $tw.utils.stringifyList(newtags.sort())) {\n\t\t\tthis.wiki.setText(this.target,\"tags\",undefined,$tw.utils.stringifyList(newtags));\t\t\t\n\t\t}\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-listops\"] = ActionListopsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-log.js": {
"title": "$:/core/modules/widgets/action-log.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-log.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to log debug messages\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LogWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLogWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLogWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\nLogWidget.prototype.execute = function(){\n\tthis.message = this.getAttribute(\"$$message\",\"debug\");\n\tthis.logAll = this.getAttribute(\"$$all\",\"no\") === \"yes\" ? true : false;\n\tthis.filter = this.getAttribute(\"$$filter\");\n}\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nLogWidget.prototype.refresh = function(changedTiddlers) {\n\tthis.refreshSelf();\n\treturn true;\n};\n\n/*\nInvoke the action associated with this widget\n*/\nLogWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tthis.log();\n\treturn true; // Action was invoked\n};\n\nLogWidget.prototype.log = function() {\n\tvar data = {},\n\t\tdataCount,\n\t\tallVars = {},\n\t\tfilteredVars;\n\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.substring(0,2) !== \"$$\") {\n\t\t\tdata[name] = attribute;\n\t\t}\t\t\n\t});\n\n\tfor(var v in this.variables) {\n\t\tallVars[v] = this.getVariable(v,{defaultValue:\"\"});\n\t}\t\n\tif(this.filter) {\n\t\tfilteredVars = this.wiki.compileFilter(this.filter).call(this.wiki,this.wiki.makeTiddlerIterator(allVars));\n\t\t$tw.utils.each(filteredVars,function(name) {\n\t\t\tdata[name] = allVars[name];\n\t\t});\t\t\n\t}\n\tdataCount = $tw.utils.count(data);\n\n\tconsole.group(this.message);\n\tif(dataCount > 0) {\n\t\t$tw.utils.logTable(data);\n\t}\n\tif(this.logAll || !dataCount) {\n\t\tconsole.groupCollapsed(\"All variables\");\n\t\t$tw.utils.logTable(allVars);\n\t\tconsole.groupEnd();\n\t}\n\tconsole.groupEnd();\n}\n\nexports[\"action-log\"] = LogWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-navigate.js": {
"title": "$:/core/modules/widgets/action-navigate.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-navigate.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to navigate to a tiddler\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigateWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigateWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigateWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigateWidget.prototype.execute = function() {\n\tthis.actionTo = this.getAttribute(\"$to\");\n\tthis.actionScroll = this.getAttribute(\"$scroll\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nNavigateWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$to\"] || changedAttributes[\"$scroll\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nNavigateWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tevent = event || {};\n\tvar bounds = triggeringWidget && triggeringWidget.getBoundingClientRect && triggeringWidget.getBoundingClientRect(),\n\t\tsuppressNavigation = event.metaKey || event.ctrlKey || (event.button === 1);\n\tif(this.actionScroll === \"yes\") {\n\t\tsuppressNavigation = false;\n\t} else if(this.actionScroll === \"no\") {\n\t\tsuppressNavigation = true;\n\t}\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.actionTo === undefined ? this.getVariable(\"currentTiddler\") : this.actionTo,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: triggeringWidget,\n\t\tnavigateFromClientRect: bounds && { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: suppressNavigation\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-navigate\"] = NavigateWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-popup.js": {
"title": "$:/core/modules/widgets/action-popup.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-popup.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to trigger a popup.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ActionPopupWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nActionPopupWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nActionPopupWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nActionPopupWidget.prototype.execute = function() {\n\tthis.actionState = this.getAttribute(\"$state\");\n\tthis.actionCoords = this.getAttribute(\"$coords\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nActionPopupWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$state\"] || changedAttributes[\"$coords\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nActionPopupWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Trigger the popup\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(this.actionCoords || \"\");\n\tif(match) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: null,\n\t\t\tdomNodeRect: {\n\t\t\t\tleft: parseFloat(match[1]),\n\t\t\t\ttop: parseFloat(match[2]),\n\t\t\t\twidth: parseFloat(match[3]),\n\t\t\t\theight: parseFloat(match[4])\n\t\t\t},\n\t\t\ttitle: this.actionState,\n\t\t\twiki: this.wiki\n\t\t});\n\t} else {\n\t\t$tw.popup.cancel(0);\n\t}\n\treturn true; // Action was invoked\n};\n\nexports[\"action-popup\"] = ActionPopupWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-sendmessage.js": {
"title": "$:/core/modules/widgets/action-sendmessage.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-sendmessage.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to send a message\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SendMessageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSendMessageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSendMessageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSendMessageWidget.prototype.execute = function() {\n\tthis.actionMessage = this.getAttribute(\"$message\");\n\tthis.actionParam = this.getAttribute(\"$param\");\n\tthis.actionName = this.getAttribute(\"$name\");\n\tthis.actionValue = this.getAttribute(\"$value\",\"\");\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSendMessageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSendMessageWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\t// Get the string parameter\n\tvar param = this.actionParam;\n\t// Assemble the attributes as a hashmap\n\tvar paramObject = Object.create(null);\n\tvar count = 0;\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparamObject[name] = attribute;\n\t\t\tcount++;\n\t\t}\n\t});\n\t// Add name/value pair if present\n\tif(this.actionName) {\n\t\tparamObject[this.actionName] = this.actionValue;\n\t}\n\t// Dispatch the message\n\tthis.dispatchEvent({\n\t\ttype: this.actionMessage,\n\t\tparam: param,\n\t\tparamObject: paramObject,\n\t\ttiddlerTitle: this.getVariable(\"currentTiddler\"),\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tevent: event\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-sendmessage\"] = SendMessageWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/action-setfield.js": {
"title": "$:/core/modules/widgets/action-setfield.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/action-setfield.js\ntype: application/javascript\nmodule-type: widget\n\nAction widget to set a single field or index on a tiddler.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetFieldWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetFieldWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetFieldWidget.prototype.render = function(parent,nextSibling) {\n\tthis.computeAttributes();\n\tthis.execute();\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetFieldWidget.prototype.execute = function() {\n\tthis.actionTiddler = this.getAttribute(\"$tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.actionField = this.getAttribute(\"$field\");\n\tthis.actionIndex = this.getAttribute(\"$index\");\n\tthis.actionValue = this.getAttribute(\"$value\");\n\tthis.actionTimestamp = this.getAttribute(\"$timestamp\",\"yes\") === \"yes\";\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nSetFieldWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"$tiddler\"] || changedAttributes[\"$field\"] || changedAttributes[\"$index\"] || changedAttributes[\"$value\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nInvoke the action associated with this widget\n*/\nSetFieldWidget.prototype.invokeAction = function(triggeringWidget,event) {\n\tvar self = this,\n\t\toptions = {};\n\toptions.suppressTimestamp = !this.actionTimestamp;\n\tif((typeof this.actionField == \"string\") || (typeof this.actionIndex == \"string\") || (typeof this.actionValue == \"string\")) {\n\t\tthis.wiki.setText(this.actionTiddler,this.actionField,this.actionIndex,this.actionValue,options);\n\t}\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tself.wiki.setText(self.actionTiddler,name,undefined,attribute,options);\n\t\t}\n\t});\n\treturn true; // Action was invoked\n};\n\nexports[\"action-setfield\"] = SetFieldWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/browse.js": {
"title": "$:/core/modules/widgets/browse.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/browse.js\ntype: application/javascript\nmodule-type: widget\n\nBrowse widget for browsing for files to import\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar BrowseWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nBrowseWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nBrowseWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"file\");\n\tif(this.browseMultiple) {\n\t\tdomNode.setAttribute(\"multiple\",\"multiple\");\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\t// Nw.js supports \"nwsaveas\" to force a \"save as\" dialogue that allows a new or existing file to be selected\n\tif(this.nwsaveas) {\n\t\tdomNode.setAttribute(\"nwsaveas\",this.nwsaveas);\n\t}\n\tif(this.accept) {\n\t\tdomNode.setAttribute(\"accept\",this.accept);\n\t}\n\t// Nw.js supports \"webkitdirectory\" and \"nwdirectory\" to allow a directory to be selected\n\tif(this.webkitdirectory) {\n\t\tdomNode.setAttribute(\"webkitdirectory\",this.webkitdirectory);\n\t}\n\tif(this.nwdirectory) {\n\t\tdomNode.setAttribute(\"nwdirectory\",this.nwdirectory);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"change\",function (event) {\n\t\tif(self.message) {\n\t\t\tself.dispatchEvent({type: self.message, param: self.param, files: event.target.files});\n\t\t} else {\n\t\t\tself.wiki.readFiles(event.target.files,{\n\t\t\t\tcallback: function(tiddlerFieldsArray) {\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray)});\n\t\t\t\t},\n\t\t\t\tdeserializer: self.deserializer\n\t\t\t});\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nBrowseWidget.prototype.execute = function() {\n\tthis.browseMultiple = this.getAttribute(\"multiple\");\n\tthis.deserializer = this.getAttribute(\"deserializer\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.nwsaveas = this.getAttribute(\"nwsaveas\");\n\tthis.accept = this.getAttribute(\"accept\");\n\tthis.webkitdirectory = this.getAttribute(\"webkitdirectory\");\n\tthis.nwdirectory = this.getAttribute(\"nwdirectory\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nBrowseWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.browse = BrowseWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/button.js": {
"title": "$:/core/modules/widgets/button.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/button.js\ntype: application/javascript\nmodule-type: widget\n\nButton widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ButtonWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nButtonWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nButtonWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this,\n\t\ttag = \"button\",\n\t\tdomNode;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tif(this.buttonTag && $tw.config.htmlUnsafeElements.indexOf(this.buttonTag) === -1) {\n\t\ttag = this.buttonTag;\n\t}\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tvar classes = this[\"class\"].split(\" \") || [],\n\t\tisPoppedUp = (this.popup || this.popupTitle) && this.isPoppedUp();\n\tif(this.selectedClass) {\n\t\tif((this.set || this.setTitle) && this.setTo && this.isSelected()) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t\tif(isPoppedUp) {\n\t\t\t$tw.utils.pushTop(classes,this.selectedClass.split(\" \"));\n\t\t}\n\t}\n\tif(isPoppedUp) {\n\t\t$tw.utils.pushTop(classes,\"tc-popup-handle\");\n\t}\n\tdomNode.className = classes.join(\" \");\n\t// Assign other attributes\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tif(this.tooltip) {\n\t\tdomNode.setAttribute(\"title\",this.tooltip);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tdomNode.setAttribute(\"disabled\",true);\n\t}\n\t// Add a click event handler\n\tdomNode.addEventListener(\"click\",function (event) {\n\t\tvar handled = false;\n\t\tif(self.invokeActions(self,event)) {\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.to) {\n\t\t\tself.navigateTo(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.message) {\n\t\t\tself.dispatchMessage(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.popup || self.popupTitle) {\n\t\t\tself.triggerPopup(event);\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.set || self.setTitle) {\n\t\t\tself.setTiddler();\n\t\t\thandled = true;\n\t\t}\n\t\tif(self.actions) {\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tself.invokeActionString(self.actions,self,event,{modifier: modifierKey});\n\t\t}\n\t\tif(handled) {\n\t\t\tevent.preventDefault();\n\t\t\tevent.stopPropagation();\n\t\t}\n\t\treturn handled;\n\t},false);\n\t// Make it draggable if required\n\tif(this.dragTiddler || this.dragFilter) {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.dragTiddler;},\n\t\t\tdragFilterFn: function() {return self.dragFilter;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nWe don't allow actions to propagate because we trigger actions ourselves\n*/\nButtonWidget.prototype.allowActionPropagation = function() {\n\treturn false;\n};\n\nButtonWidget.prototype.getBoundingClientRect = function() {\n\treturn this.domNodes[0].getBoundingClientRect();\n};\n\nButtonWidget.prototype.isSelected = function() {\n return this.setTitle ? (this.setField ? this.wiki.getTiddler(this.setTitle).getFieldString(this.setField) === this.setTo :\n\t\t(this.setIndex ? this.wiki.extractTiddlerDataItem(this.setTitle,this.setIndex) === this.setTo :\n\t\t\tthis.wiki.getTiddlerText(this.setTitle))) || this.defaultSetValue || this.getVariable(\"currentTiddler\") :\n\t\tthis.wiki.getTextReference(this.set,this.defaultSetValue,this.getVariable(\"currentTiddler\")) === this.setTo;\n};\n\nButtonWidget.prototype.isPoppedUp = function() {\n\tvar tiddler = this.popupTitle ? this.wiki.getTiddler(this.popupTitle) : this.wiki.getTiddler(this.popup);\n\tvar result = tiddler && tiddler.fields.text ? $tw.popup.readPopupState(tiddler.fields.text) : false;\n\treturn result;\n};\n\nButtonWidget.prototype.navigateTo = function(event) {\n\tvar bounds = this.getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tevent: event\n\t});\n};\n\nButtonWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\"), event: event});\n};\n\nButtonWidget.prototype.triggerPopup = function(event) {\n\tif(this.popupTitle) {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popupTitle,\n\t\t\twiki: this.wiki,\n\t\t\tnoStateReference: true\n\t\t});\n\t} else {\n\t\t$tw.popup.triggerPopup({\n\t\t\tdomNode: this.domNodes[0],\n\t\t\ttitle: this.popup,\n\t\t\twiki: this.wiki\n\t\t});\n\t}\n};\n\nButtonWidget.prototype.setTiddler = function() {\n\tif(this.setTitle) {\n\t\tthis.setField ? this.wiki.setText(this.setTitle,this.setField,undefined,this.setTo) :\n\t\t\t\t(this.setIndex ? this.wiki.setText(this.setTitle,undefined,this.setIndex,this.setTo) :\n\t\t\t\tthis.wiki.setText(this.setTitle,\"text\",undefined,this.setTo));\n\t} else {\n\t\tthis.wiki.setTextReference(this.set,this.setTo,this.getVariable(\"currentTiddler\"));\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nButtonWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\");\n\tthis.to = this.getAttribute(\"to\");\n\tthis.message = this.getAttribute(\"message\");\n\tthis.param = this.getAttribute(\"param\");\n\tthis.set = this.getAttribute(\"set\");\n\tthis.setTo = this.getAttribute(\"setTo\");\n\tthis.popup = this.getAttribute(\"popup\");\n\tthis.hover = this.getAttribute(\"hover\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis.style = this.getAttribute(\"style\");\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tthis.selectedClass = this.getAttribute(\"selectedClass\");\n\tthis.defaultSetValue = this.getAttribute(\"default\",\"\");\n\tthis.buttonTag = this.getAttribute(\"tag\");\n\tthis.dragTiddler = this.getAttribute(\"dragTiddler\");\n\tthis.dragFilter = this.getAttribute(\"dragFilter\");\n\tthis.setTitle = this.getAttribute(\"setTitle\");\n\tthis.setField = this.getAttribute(\"setField\");\n\tthis.setIndex = this.getAttribute(\"setIndex\");\n\tthis.popupTitle = this.getAttribute(\"popupTitle\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nButtonWidget.prototype.updateDomNodeClasses = function() {\n\tvar domNodeClasses = this.domNode.className.split(\" \"),\n\t\toldClasses = this.class.split(\" \"),\n\t\tnewClasses;\t\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tnewClasses = this.class.split(\" \");\n\t//Remove classes assigned from the old value of class attribute\n\t$tw.utils.each(oldClasses,function(oldClass){\n\t\tvar i = domNodeClasses.indexOf(oldClass);\n\t\tif(i !== -1) {\n\t\t\tdomNodeClasses.splice(i,1);\n\t\t}\n\t});\n\t//Add new classes from updated class attribute.\n\t$tw.utils.pushTop(domNodeClasses,newClasses);\n\tthis.domNode.className = domNodeClasses.join(\" \");\n}\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nButtonWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.actions || changedAttributes.to || changedAttributes.message || changedAttributes.param || changedAttributes.set || changedAttributes.setTo || changedAttributes.popup || changedAttributes.hover || changedAttributes.selectedClass || changedAttributes.style || changedAttributes.dragFilter || changedAttributes.dragTiddler || (this.set && changedTiddlers[this.set]) || (this.popup && changedTiddlers[this.popup]) || (this.popupTitle && changedTiddlers[this.popupTitle]) || changedAttributes.setTitle || changedAttributes.setField || changedAttributes.setIndex || changedAttributes.popupTitle || changedAttributes.disabled) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.updateDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.button = ButtonWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/checkbox.js": {
"title": "$:/core/modules/widgets/checkbox.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/checkbox.js\ntype: application/javascript\nmodule-type: widget\n\nCheckbox widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CheckboxWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCheckboxWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCheckboxWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",this.checkboxClass);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"checkbox\");\n\tif(this.getValue()) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nCheckboxWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.checkboxTitle);\n\tif(tiddler) {\n\t\tif(this.checkboxTag) {\n\t\t\tif(this.checkboxInvertTag) {\n\t\t\t\treturn !tiddler.hasTag(this.checkboxTag);\n\t\t\t} else {\n\t\t\t\treturn tiddler.hasTag(this.checkboxTag);\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tvar value;\n\t\t\tif($tw.utils.hop(tiddler.fields,this.checkboxField)) {\n\t\t\t\tvalue = tiddler.fields[this.checkboxField] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.checkboxDefault || \"\";\n\t\t\t}\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t\tif(this.checkboxIndex) {\n\t\t\tvar value = this.wiki.extractTiddlerDataItem(tiddler,this.checkboxIndex,this.checkboxDefault || \"\");\n\t\t\tif(value === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(value === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif(this.checkboxTag) {\n\t\t\treturn false;\n\t\t}\n\t\tif(this.checkboxField) {\n\t\t\tif(this.checkboxDefault === this.checkboxChecked) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif(this.checkboxDefault === this.checkboxUnchecked) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\nCheckboxWidget.prototype.handleChangeEvent = function(event) {\n\tvar checked = this.inputDomNode.checked,\n\t\ttiddler = this.wiki.getTiddler(this.checkboxTitle),\n\t\tfallbackFields = {text: \"\"},\n\t\tnewFields = {title: this.checkboxTitle},\n\t\thasChanged = false,\n\t\ttagCheck = false,\n\t\thasTag = tiddler && tiddler.hasTag(this.checkboxTag),\n\t\tvalue = checked ? this.checkboxChecked : this.checkboxUnchecked;\n\tif(this.checkboxTag && this.checkboxInvertTag === \"yes\") {\n\t\ttagCheck = hasTag === checked;\n\t} else {\n\t\ttagCheck = hasTag !== checked;\n\t}\n\t// Set the tag if specified\n\tif(this.checkboxTag && (!tiddler || tagCheck)) {\n\t\tnewFields.tags = tiddler ? (tiddler.fields.tags || []).slice(0) : [];\n\t\tvar pos = newFields.tags.indexOf(this.checkboxTag);\n\t\tif(pos !== -1) {\n\t\t\tnewFields.tags.splice(pos,1);\n\t\t}\n\t\tif(this.checkboxInvertTag === \"yes\" && !checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t} else if(this.checkboxInvertTag !== \"yes\" && checked) {\n\t\t\tnewFields.tags.push(this.checkboxTag);\n\t\t}\n\t\thasChanged = true;\n\t}\n\t// Set the field if specified\n\tif(this.checkboxField) {\n\t\tif(!tiddler || tiddler.fields[this.checkboxField] !== value) {\n\t\t\tnewFields[this.checkboxField] = value;\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\t// Set the index if specified\n\tif(this.checkboxIndex) {\n\t\tvar indexValue = this.wiki.extractTiddlerDataItem(this.checkboxTitle,this.checkboxIndex);\n\t\tif(!tiddler || indexValue !== value) {\n\t\t\thasChanged = true;\n\t\t}\n\t}\n\tif(hasChanged) {\n\t\tif(this.checkboxIndex) {\n\t\t\tthis.wiki.setText(this.checkboxTitle,\"\",this.checkboxIndex,value);\n\t\t} else {\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),fallbackFields,tiddler,newFields,this.wiki.getModificationFields()));\n\t\t}\n\t}\n\t// Trigger actions\n\tif(this.checkboxActions) {\n\t\tthis.invokeActionString(this.checkboxActions,this,event);\n\t}\n\tif(this.checkboxCheckActions && checked) {\n\t\tthis.invokeActionString(this.checkboxCheckActions,this,event);\n\t}\n\tif(this.checkboxUncheckActions && !checked) {\n\t\tthis.invokeActionString(this.checkboxUncheckActions,this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCheckboxWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.checkboxActions = this.getAttribute(\"actions\");\n\tthis.checkboxCheckActions = this.getAttribute(\"checkactions\");\n\tthis.checkboxUncheckActions = this.getAttribute(\"uncheckactions\");\n\tthis.checkboxTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.checkboxTag = this.getAttribute(\"tag\");\n\tthis.checkboxField = this.getAttribute(\"field\");\n\tthis.checkboxIndex = this.getAttribute(\"index\");\n\tthis.checkboxChecked = this.getAttribute(\"checked\");\n\tthis.checkboxUnchecked = this.getAttribute(\"unchecked\");\n\tthis.checkboxDefault = this.getAttribute(\"default\");\n\tthis.checkboxClass = this.getAttribute(\"class\",\"\");\n\tthis.checkboxInvertTag = this.getAttribute(\"invertTag\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCheckboxWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.tag || changedAttributes.invertTag || changedAttributes.field || changedAttributes.index || changedAttributes.checked || changedAttributes.unchecked || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.disabled) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.checkboxTitle]) {\n\t\t\tthis.inputDomNode.checked = this.getValue();\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.checkbox = CheckboxWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/codeblock.js": {
"title": "$:/core/modules/widgets/codeblock.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/codeblock.js\ntype: application/javascript\nmodule-type: widget\n\nCode block node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CodeBlockWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCodeBlockWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCodeBlockWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar codeNode = this.document.createElement(\"code\"),\n\t\tdomNode = this.document.createElement(\"pre\");\n\tcodeNode.appendChild(this.document.createTextNode(this.getAttribute(\"code\")));\n\tdomNode.appendChild(codeNode);\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n\tif(this.postRender) {\n\t\tthis.postRender();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nCodeBlockWidget.prototype.execute = function() {\n\tthis.language = this.getAttribute(\"language\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCodeBlockWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.codeblock = CodeBlockWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/count.js": {
"title": "$:/core/modules/widgets/count.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/count.js\ntype: application/javascript\nmodule-type: widget\n\nCount widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar CountWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nCountWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nCountWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.currentCount);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nCountWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Execute the filter\n\tif(this.filter) {\n\t\tthis.currentCount = this.wiki.filterTiddlers(this.filter,this).length;\n\t} else {\n\t\tthis.currentCount = \"0\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nCountWidget.prototype.refresh = function(changedTiddlers) {\n\t// Re-execute the filter to get the count\n\tthis.computeAttributes();\n\tvar oldCount = this.currentCount;\n\tthis.execute();\n\tif(this.currentCount !== oldCount) {\n\t\t// Regenerate and rerender the widget and replace the existing DOM node\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n\n};\n\nexports.count = CountWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/diff-text.js": {
"title": "$:/core/modules/widgets/diff-text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/diff-text.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display a diff between two texts\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget,\n\tdmp = require(\"$:/core/modules/utils/diff-match-patch/diff_match_patch.js\");\n\nvar DiffTextWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDiffTextWidget.prototype = new Widget();\n\nDiffTextWidget.prototype.invisibleCharacters = {\n\t\"\\n\": \"↩︎\\n\",\n\t\"\\r\": \"⇠\",\n\t\"\\t\": \"⇥\\t\"\n};\n\n/*\nRender this widget into the DOM\n*/\nDiffTextWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create the diff\n\tvar dmpObject = new dmp.diff_match_patch(),\n\t\tdiffs = dmpObject.diff_main(this.getAttribute(\"source\"),this.getAttribute(\"dest\"));\n\t// Apply required cleanup\n\tswitch(this.getAttribute(\"cleanup\",\"semantic\")) {\n\t\tcase \"none\":\n\t\t\t// No cleanup\n\t\t\tbreak;\n\t\tcase \"efficiency\":\n\t\t\tdmpObject.diff_cleanupEfficiency(diffs);\n\t\t\tbreak;\n\t\tdefault: // case \"semantic\"\n\t\t\tdmpObject.diff_cleanupSemantic(diffs);\n\t\t\tbreak;\n\t}\n\t// Create the elements\n\tvar domContainer = this.document.createElement(\"div\"), \n\t\tdomDiff = this.createDiffDom(diffs);\n\tparent.insertBefore(domContainer,nextSibling);\n\t// Set variables\n\tthis.setVariable(\"diff-count\",diffs.reduce(function(acc,diff) {\n\t\tif(diff[0] !== dmp.DIFF_EQUAL) {\n\t\t\tacc++;\n\t\t}\n\t\treturn acc;\n\t},0).toString());\n\t// Render child widgets\n\tthis.renderChildren(domContainer,null);\n\t// Render the diff\n\tdomContainer.appendChild(domDiff);\n\t// Save our container\n\tthis.domNodes.push(domContainer);\n};\n\n/*\nCreate DOM elements representing a list of diffs\n*/\nDiffTextWidget.prototype.createDiffDom = function(diffs) {\n\tvar self = this;\n\t// Create the element and assign the attributes\n\tvar domPre = this.document.createElement(\"pre\"),\n\t\tdomCode = this.document.createElement(\"code\");\n\t$tw.utils.each(diffs,function(diff) {\n\t\tvar tag = diff[0] === dmp.DIFF_INSERT ? \"ins\" : (diff[0] === dmp.DIFF_DELETE ? \"del\" : \"span\"),\n\t\t\tclassName = diff[0] === dmp.DIFF_INSERT ? \"tc-diff-insert\" : (diff[0] === dmp.DIFF_DELETE ? \"tc-diff-delete\" : \"tc-diff-equal\"),\n\t\t\tdom = self.document.createElement(tag),\n\t\t\ttext = diff[1],\n\t\t\tcurrPos = 0,\n\t\t\tre = /([\\x00-\\x1F])/mg,\n\t\t\tmatch = re.exec(text),\n\t\t\tspan,\n\t\t\tprintable;\n\t\tdom.className = className;\n\t\twhile(match) {\n\t\t\tif(currPos < match.index) {\n\t\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos,match.index)));\n\t\t\t}\n\t\t\tspan = self.document.createElement(\"span\");\n\t\t\tspan.className = \"tc-diff-invisible\";\n\t\t\tprintable = self.invisibleCharacters[match[0]] || (\"[0x\" + match[0].charCodeAt(0).toString(16) + \"]\");\n\t\t\tspan.appendChild(self.document.createTextNode(printable));\n\t\t\tdom.appendChild(span);\n\t\t\tcurrPos = match.index + match[0].length;\n\t\t\tmatch = re.exec(text);\n\t\t}\n\t\tif(currPos < text.length) {\n\t\t\tdom.appendChild(self.document.createTextNode(text.slice(currPos)));\n\t\t}\n\t\tdomCode.appendChild(dom);\n\t});\n\tdomPre.appendChild(domCode);\n\treturn domPre;\n};\n\n/*\nCompute the internal state of the widget\n*/\nDiffTextWidget.prototype.execute = function() {\n\t// Make child widgets\n\tvar parseTreeNodes;\n\tif(this.parseTreeNode && this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\tparseTreeNodes = this.parseTreeNode.children;\n\t} else {\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: \"$:/language/Diffs/CountMessage\"}\n\t\t\t}\n\t\t}];\n\t}\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDiffTextWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.dest || changedAttributes.cleanup) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports[\"diff-text\"] = DiffTextWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/draggable.js": {
"title": "$:/core/modules/widgets/draggable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/draggable.js\ntype: application/javascript\nmodule-type: widget\n\nDraggable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DraggableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDraggableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDraggableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Sanitise the specified tag\n\tvar tag = this.draggableTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"div\";\n\t}\n\t// Create our element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = [\"tc-draggable\"];\n\tif(this.draggableClasses) {\n\t\tclasses.push(this.draggableClasses);\n\t}\n\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t// Add event handlers\n\t$tw.utils.makeDraggable({\n\t\tdomNode: domNode,\n\t\tdragTiddlerFn: function() {return self.getAttribute(\"tiddler\");},\n\t\tdragFilterFn: function() {return self.getAttribute(\"filter\");},\n\t\tstartActions: self.startActions,\n\t\tendActions: self.endActions,\n\t\twidget: this\n\t});\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nDraggableWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.draggableTag = this.getAttribute(\"tag\",\"div\");\n\tthis.draggableClasses = this.getAttribute(\"class\");\n\tthis.startActions = this.getAttribute(\"startactions\");\n\tthis.endActions = this.getAttribute(\"endactions\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDraggableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.draggable = DraggableWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/droppable.js": {
"title": "$:/core/modules/widgets/droppable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/droppable.js\ntype: application/javascript\nmodule-type: widget\n\nDroppable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DroppableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDroppableWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDroppableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this,\n\t\ttag = this.parseTreeNode.isBlock ? \"div\" : \"span\",\n\t\tdomNode;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.droppableTag && $tw.config.htmlUnsafeElements.indexOf(this.droppableTag) === -1) {\n\t\ttag = this.droppableTag;\n\t}\n\t// Create element and assign classes\n\tdomNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\t// Add event handlers\n\tif(this.droppableEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"}\n\t\t]);\t\t\n\t} else {\n\t\t$tw.utils.addClass(this.domNode,this.disabledClass);\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDroppableWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDroppableWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally. The hacky second condition is to resolve a problem with Firefox whereby there is an erroneous dragenter event if the node being dragged is within the dropzone\n\tif(this.currentlyEntered.length === 0 || (this.currentlyEntered.length === 1 && this.currentlyEntered[0] === $tw.dragInProgress)) {\n\t\tthis.currentlyEntered = [];\n\t\tif(this.domNodes[0]) {\n\t\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t\t}\n\t}\n};\n\nDroppableWidget.prototype.handleDragEnterEvent = function(event) {\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\t// Set the drop effect\n\tevent.dataTransfer.dropEffect = this.droppableEffect;\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag(event);\n\treturn false;\n};\n\nDroppableWidget.prototype.handleDropEvent = function(event) {\n\tvar self = this;\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\tvar dataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Try to import the various data types we understand\n\t$tw.utils.importDataTransfer(dataTransfer,null,function(fieldsArray) {\n\t\tfieldsArray.forEach(function(fields) {\n\t\t\tself.performActions(fields.title || fields.text,event);\n\t\t});\n\t});\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n\treturn false;\n};\n\nDroppableWidget.prototype.performActions = function(title,event) {\n\tif(this.droppableActions) {\n\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\tthis.invokeActionString(this.droppableActions,this,event,{actionTiddler: title, modifier: modifierKey});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDroppableWidget.prototype.execute = function() {\n\tthis.droppableActions = this.getAttribute(\"actions\");\n\tthis.droppableEffect = this.getAttribute(\"effect\",\"copy\");\n\tthis.droppableTag = this.getAttribute(\"tag\");\n\tthis.droppableEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.disabledClass = this.getAttribute(\"disabledClass\",\"\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nDroppableWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-droppable\");\n\tthis.domNode.className = classes.join(\" \");\t\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDroppableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tag || changedAttributes.enable || changedAttributes.disabledClass || changedAttributes.actions || changedAttributes.effect) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.droppable = DroppableWidget;\n\n})();",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/dropzone.js": {
"title": "$:/core/modules/widgets/dropzone.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/dropzone.js\ntype: application/javascript\nmodule-type: widget\n\nDropzone widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar DropZoneWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nDropZoneWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nDropZoneWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar domNode = this.document.createElement(\"div\");\n\tdomNode.className = this.dropzoneClass || \"tc-dropzone\";\n\t// Add event handlers\n\tif(this.dropzoneEnable) {\n\t\t$tw.utils.addEventListeners(domNode,[\n\t\t\t{name: \"dragenter\", handlerObject: this, handlerMethod: \"handleDragEnterEvent\"},\n\t\t\t{name: \"dragover\", handlerObject: this, handlerMethod: \"handleDragOverEvent\"},\n\t\t\t{name: \"dragleave\", handlerObject: this, handlerMethod: \"handleDragLeaveEvent\"},\n\t\t\t{name: \"drop\", handlerObject: this, handlerMethod: \"handleDropEvent\"},\n\t\t\t{name: \"paste\", handlerObject: this, handlerMethod: \"handlePasteEvent\"},\n\t\t\t{name: \"dragend\", handlerObject: this, handlerMethod: \"handleDragEndEvent\"}\n\t\t]);\t\t\n\t}\n\tdomNode.addEventListener(\"click\",function (event) {\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n\t// Stack of outstanding enter/leave events\n\tthis.currentlyEntered = [];\n};\n\nDropZoneWidget.prototype.enterDrag = function(event) {\n\tif(this.currentlyEntered.indexOf(event.target) === -1) {\n\t\tthis.currentlyEntered.push(event.target);\n\t}\n\t// If we're entering for the first time we need to apply highlighting\n\t$tw.utils.addClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.leaveDrag = function(event) {\n\tvar pos = this.currentlyEntered.indexOf(event.target);\n\tif(pos !== -1) {\n\t\tthis.currentlyEntered.splice(pos,1);\n\t}\n\t// Remove highlighting if we're leaving externally\n\tif(this.currentlyEntered.length === 0) {\n\t\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t}\n};\n\nDropZoneWidget.prototype.handleDragEnterEvent = function(event) {\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tthis.enterDrag(event);\n\t// Tell the browser that we're ready to handle the drop\n\tevent.preventDefault();\n\t// Tell the browser not to ripple the drag up to any parent drop handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handleDragOverEvent = function(event) {\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\t// Tell the browser that we're still interested in the drop\n\tevent.preventDefault();\n\tevent.dataTransfer.dropEffect = \"copy\"; // Explicitly show this is a copy\n};\n\nDropZoneWidget.prototype.handleDragLeaveEvent = function(event) {\n\tthis.leaveDrag(event);\n};\n\nDropZoneWidget.prototype.handleDragEndEvent = function(event) {\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n};\n\nDropZoneWidget.prototype.handleDropEvent = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t};\n\tthis.leaveDrag(event);\n\t// Check for being over a TEXTAREA or INPUT\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) !== -1) {\n\t\treturn false;\n\t}\n\t// Check for this window being the source of the drag\n\tif($tw.dragInProgress) {\n\t\treturn false;\n\t}\n\tvar self = this,\n\t\tdataTransfer = event.dataTransfer;\n\t// Remove highlighting\n\t$tw.utils.removeClass(this.domNodes[0],\"tc-dragover\");\n\t// Import any files in the drop\n\tvar numFiles = 0;\n\tif(dataTransfer.files) {\n\t\tnumFiles = this.wiki.readFiles(dataTransfer.files,{\n\t\t\tcallback: readFileCallback,\n\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t});\n\t}\n\t// Try to import the various data types we understand\n\tif(numFiles === 0) {\n\t\t$tw.utils.importDataTransfer(dataTransfer,this.wiki.generateNewTitle(\"Untitled\"),readFileCallback);\n\t}\n\t// Tell the browser that we handled the drop\n\tevent.preventDefault();\n\t// Stop the drop ripple up to any parent handlers\n\tevent.stopPropagation();\n};\n\nDropZoneWidget.prototype.handlePasteEvent = function(event) {\n\tvar self = this,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify(tiddlerFieldsArray), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t};\n\t// Let the browser handle it if we're in a textarea or input box\n\tif([\"TEXTAREA\",\"INPUT\"].indexOf(event.target.tagName) == -1 && !event.target.isContentEditable) {\n\t\tvar self = this,\n\t\t\titems = event.clipboardData.items;\n\t\t// Enumerate the clipboard items\n\t\tfor(var t = 0; t<items.length; t++) {\n\t\t\tvar item = items[t];\n\t\t\tif(item.kind === \"file\") {\n\t\t\t\t// Import any files\n\t\t\t\tthis.wiki.readFile(item.getAsFile(),{\n\t\t\t\t\tcallback: readFileCallback,\n\t\t\t\t\tdeserializer: this.dropzoneDeserializer\n\t\t\t\t});\n\t\t\t} else if(item.kind === \"string\") {\n\t\t\t\t// Create tiddlers from string items\n\t\t\t\tvar type = item.type;\n\t\t\t\titem.getAsString(function(str) {\n\t\t\t\t\tvar tiddlerFields = {\n\t\t\t\t\t\ttitle: self.wiki.generateNewTitle(\"Untitled\"),\n\t\t\t\t\t\ttext: str,\n\t\t\t\t\t\ttype: type\n\t\t\t\t\t};\n\t\t\t\t\tif($tw.log.IMPORT) {\n\t\t\t\t\t\tconsole.log(\"Importing string '\" + str + \"', type: '\" + type + \"'\");\n\t\t\t\t\t}\n\t\t\t\t\tself.dispatchEvent({type: \"tm-import-tiddlers\", param: JSON.stringify([tiddlerFields]), autoOpenOnImport: self.autoOpenOnImport, importTitle: self.importTitle});\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Tell the browser that we've handled the paste\n\t\tevent.stopPropagation();\n\t\tevent.preventDefault();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nDropZoneWidget.prototype.execute = function() {\n\tthis.dropzoneClass = this.getAttribute(\"class\");\n\tthis.dropzoneDeserializer = this.getAttribute(\"deserializer\");\n\tthis.dropzoneEnable = (this.getAttribute(\"enable\") || \"yes\") === \"yes\";\n\tthis.autoOpenOnImport = this.getAttribute(\"autoOpenOnImport\");\n\tthis.importTitle = this.getAttribute(\"importTitle\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nDropZoneWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.enable || changedAttributes.autoOpenOnImport || changedAttributes.importTitle || changedAttributes.deserializer || changedAttributes.class) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.dropzone = DropZoneWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-binary.js": {
"title": "$:/core/modules/widgets/edit-binary.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-binary.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-binary widget; placeholder for editing binary tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar BINARY_WARNING_MESSAGE = \"$:/core/ui/BinaryWarning\";\nvar EXPORT_BUTTON_IMAGE = \"$:/core/images/export-button\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBinaryWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBinaryWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBinaryWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBinaryWidget.prototype.execute = function() {\n\t// Get our parameters\n\tvar editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tvar tiddler = this.wiki.getTiddler(editTitle);\n\tvar type = tiddler.fields.type;\n\tvar text = tiddler.fields.text;\n\t// Transclude the binary data tiddler warning message\n\tvar warn = {\n\t\ttype: \"element\",\n\t\ttag: \"p\",\n\t\tchildren: [{\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: BINARY_WARNING_MESSAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Create download link based on draft tiddler title\n\tvar link = {\n\t\ttype: \"element\",\n\t\ttag: \"a\",\n\t\tattributes: {\n\t\t\ttitle: {type: \"indirect\", textReference: \"!!draft.title\"},\n\t\t\tdownload: {type: \"indirect\", textReference: \"!!draft.title\"}\n\t\t},\n\t\tchildren: [{\n\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\ttiddler: {type: \"string\", value: EXPORT_BUTTON_IMAGE}\n\t\t\t}\n\t\t}]\n\t};\n\t// Set the link href to internal data URI (no external)\n\tif(text) {\n\t\tlink.attributes.href = {\n\t\t\ttype: \"string\", \n\t\t\tvalue: \"data:\" + type + \";base64,\" + text\n\t\t};\n\t}\n\t// Combine warning message and download link in a div\n\tvar element = {\n\t\ttype: \"element\",\n\t\ttag: \"div\",\n\t\tattributes: {\n\t\t\tclass: {type: \"string\", value: \"tc-binary-warning\"}\n\t\t},\n\t\tchildren: [warn, link]\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets([element]);\n};\n\n/*\nRefresh by refreshing our child widget\n*/\nEditBinaryWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"edit-binary\"] = EditBinaryWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-bitmap.js": {
"title": "$:/core/modules/widgets/edit-bitmap.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-bitmap.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-bitmap widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n// Default image sizes\nvar DEFAULT_IMAGE_WIDTH = 600,\n\tDEFAULT_IMAGE_HEIGHT = 370,\n\tDEFAULT_IMAGE_TYPE = \"image/png\";\n\n// Configuration tiddlers\nvar LINE_WIDTH_TITLE = \"$:/config/BitmapEditor/LineWidth\",\n\tLINE_COLOUR_TITLE = \"$:/config/BitmapEditor/Colour\",\n\tLINE_OPACITY_TITLE = \"$:/config/BitmapEditor/Opacity\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditBitmapWidget = function(parseTreeNode,options) {\n\t// Initialise the editor operations if they've not been done already\n\tif(!this.editorOperations) {\n\t\tEditBitmapWidget.prototype.editorOperations = {};\n\t\t$tw.modules.applyMethods(\"bitmapeditoroperation\",this.editorOperations);\n\t}\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditBitmapWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditBitmapWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create the wrapper for the toolbar and render its content\n\tthis.toolbarNode = this.document.createElement(\"div\");\n\tthis.toolbarNode.className = \"tc-editor-toolbar\";\n\tparent.insertBefore(this.toolbarNode,nextSibling);\n\tthis.domNodes.push(this.toolbarNode);\n\t// Create the on-screen canvas\n\tthis.canvasDomNode = $tw.utils.domMaker(\"canvas\",{\n\t\tdocument: this.document,\n\t\t\"class\":\"tc-edit-bitmapeditor\",\n\t\teventListeners: [{\n\t\t\tname: \"touchstart\", handlerObject: this, handlerMethod: \"handleTouchStartEvent\"\n\t\t},{\n\t\t\tname: \"touchmove\", handlerObject: this, handlerMethod: \"handleTouchMoveEvent\"\n\t\t},{\n\t\t\tname: \"touchend\", handlerObject: this, handlerMethod: \"handleTouchEndEvent\"\n\t\t},{\n\t\t\tname: \"mousedown\", handlerObject: this, handlerMethod: \"handleMouseDownEvent\"\n\t\t},{\n\t\t\tname: \"mousemove\", handlerObject: this, handlerMethod: \"handleMouseMoveEvent\"\n\t\t},{\n\t\t\tname: \"mouseup\", handlerObject: this, handlerMethod: \"handleMouseUpEvent\"\n\t\t}]\n\t});\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Render toolbar child widgets\n\tthis.renderChildren(this.toolbarNode,null);\n\t// // Insert the elements into the DOM\n\tparent.insertBefore(this.canvasDomNode,nextSibling);\n\tthis.domNodes.push(this.canvasDomNode);\n\t// Load the image into the canvas\n\tif($tw.browser) {\n\t\tthis.loadCanvas();\n\t}\n\t// Add widget message listeners\n\tthis.addEventListeners([\n\t\t{type: \"tm-edit-bitmap-operation\", handler: \"handleEditBitmapOperationMessage\"}\n\t]);\n};\n\n/*\nHandle an edit bitmap operation message from the toolbar\n*/\nEditBitmapWidget.prototype.handleEditBitmapOperationMessage = function(event) {\n\t// Invoke the handler\n\tvar handler = this.editorOperations[event.param];\n\tif(handler) {\n\t\thandler.call(this,event);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditBitmapWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nJust refresh the toolbar\n*/\nEditBitmapWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nSet the bitmap size variables and refresh the toolbar\n*/\nEditBitmapWidget.prototype.refreshToolbar = function() {\n\t// Set the width and height variables\n\tthis.setVariable(\"tv-bitmap-editor-width\",this.canvasDomNode.width + \"px\");\n\tthis.setVariable(\"tv-bitmap-editor-height\",this.canvasDomNode.height + \"px\");\n\t// Refresh each of our child widgets\n\t$tw.utils.each(this.children,function(childWidget) {\n\t\tchildWidget.refreshSelf();\n\t});\n};\n\nEditBitmapWidget.prototype.loadCanvas = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle),\n\t\tcurrImage = new Image();\n\t// Set up event handlers for loading the image\n\tvar self = this;\n\tcurrImage.onload = function() {\n\t\t// Copy the image to the on-screen canvas\n\t\tself.initCanvas(self.canvasDomNode,currImage.width,currImage.height,currImage);\n\t\t// And also copy the current bitmap to the off-screen canvas\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,currImage.width,currImage.height,currImage);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\tcurrImage.onerror = function() {\n\t\t// Set the on-screen canvas size and clear it\n\t\tself.initCanvas(self.canvasDomNode,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the off-screen canvas size and clear it\n\t\tself.currCanvas = self.document.createElement(\"canvas\");\n\t\tself.initCanvas(self.currCanvas,DEFAULT_IMAGE_WIDTH,DEFAULT_IMAGE_HEIGHT);\n\t\t// Set the width and height input boxes\n\t\tself.refreshToolbar();\n\t};\n\t// Get the current bitmap into an image object\n\tif(tiddler && tiddler.fields.type && tiddler.fields.text) {\n\t\tcurrImage.src = \"data:\" + tiddler.fields.type + \";base64,\" + tiddler.fields.text;\t\t\n\t} else {\n\t\tcurrImage.width = DEFAULT_IMAGE_WIDTH;\n\t\tcurrImage.height = DEFAULT_IMAGE_HEIGHT;\n\t\tcurrImage.onerror();\n\t}\n};\n\nEditBitmapWidget.prototype.initCanvas = function(canvas,width,height,image) {\n\tcanvas.width = width;\n\tcanvas.height = height;\n\tvar ctx = canvas.getContext(\"2d\");\n\tif(image) {\n\t\tctx.drawImage(image,0,0);\n\t} else {\n\t\tctx.fillStyle = \"#fff\";\n\t\tctx.fillRect(0,0,canvas.width,canvas.height);\n\t}\n};\n\n/*\n** Change the size of the canvas, preserving the current image\n*/\nEditBitmapWidget.prototype.changeCanvasSize = function(newWidth,newHeight) {\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\");\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\n/*\n** Rotate the canvas left by 90 degrees\n*/\nEditBitmapWidget.prototype.rotateCanvasLeft = function() {\n\t// Get the current size of the image\n\tvar origWidth = this.currCanvas.width,\n\t\torigHeight = this.currCanvas.height;\n\t// Create and size a new canvas\n\tvar newCanvas = this.document.createElement(\"canvas\"),\n\t\tnewWidth = origHeight,\n\t\tnewHeight = origWidth;\n\tthis.initCanvas(newCanvas,newWidth,newHeight);\n\t// Copy the old image\n\tvar ctx = newCanvas.getContext(\"2d\");\n\tctx.save();\n\tctx.translate(newWidth / 2,newHeight / 2);\n\tctx.rotate(-Math.PI / 2);\n\tctx.drawImage(this.currCanvas,-origWidth / 2,-origHeight / 2);\n\tctx.restore();\n\t// Set the new canvas as the current one\n\tthis.currCanvas = newCanvas;\n\t// Set the size of the onscreen canvas\n\tthis.canvasDomNode.width = newWidth;\n\tthis.canvasDomNode.height = newHeight;\n\t// Paint the onscreen canvas with the offscreen canvas\n\tctx = this.canvasDomNode.getContext(\"2d\");\n\tctx.drawImage(this.currCanvas,0,0);\n};\n\nEditBitmapWidget.prototype.handleTouchStartEvent = function(event) {\n\tthis.brushDown = true;\n\tthis.strokeStart(event.touches[0].clientX,event.touches[0].clientY);\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.touches[0].clientX,event.touches[0].clientY);\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleTouchEndEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t}\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.strokeStart(event.clientX,event.clientY);\n\tthis.brushDown = true;\n\tevent.preventDefault();\n\tevent.stopPropagation();\n\treturn false;\n};\n\nEditBitmapWidget.prototype.handleMouseMoveEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.strokeMove(event.clientX,event.clientY);\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.handleMouseUpEvent = function(event) {\n\tif(this.brushDown) {\n\t\tthis.brushDown = false;\n\t\tthis.strokeEnd();\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn false;\n\t}\n\treturn true;\n};\n\nEditBitmapWidget.prototype.adjustCoordinates = function(x,y) {\n\tvar canvasRect = this.canvasDomNode.getBoundingClientRect(),\n\t\tscale = this.canvasDomNode.width/canvasRect.width;\n\treturn {x: (x - canvasRect.left) * scale, y: (y - canvasRect.top) * scale};\n};\n\nEditBitmapWidget.prototype.strokeStart = function(x,y) {\n\t// Start off a new stroke\n\tthis.stroke = [this.adjustCoordinates(x,y)];\n};\n\nEditBitmapWidget.prototype.strokeMove = function(x,y) {\n\tvar ctx = this.canvasDomNode.getContext(\"2d\"),\n\t\tt;\n\t// Add the new position to the end of the stroke\n\tthis.stroke.push(this.adjustCoordinates(x,y));\n\t// Redraw the previous image\n\tctx.drawImage(this.currCanvas,0,0);\n\t// Render the stroke\n\tctx.globalAlpha = parseFloat(this.wiki.getTiddlerText(LINE_OPACITY_TITLE,\"1.0\"));\n\tctx.strokeStyle = this.wiki.getTiddlerText(LINE_COLOUR_TITLE,\"#ff0\");\n\tctx.lineWidth = parseFloat(this.wiki.getTiddlerText(LINE_WIDTH_TITLE,\"3\"));\n\tctx.lineCap = \"round\";\n\tctx.lineJoin = \"round\";\n\tctx.beginPath();\n\tctx.moveTo(this.stroke[0].x,this.stroke[0].y);\n\tfor(t=1; t<this.stroke.length-1; t++) {\n\t\tvar s1 = this.stroke[t],\n\t\t\ts2 = this.stroke[t-1],\n\t\t\ttx = (s1.x + s2.x)/2,\n\t\t\tty = (s1.y + s2.y)/2;\n\t\tctx.quadraticCurveTo(s2.x,s2.y,tx,ty);\n\t}\n\tctx.stroke();\n};\n\nEditBitmapWidget.prototype.strokeEnd = function() {\n\t// Copy the bitmap to the off-screen canvas\n\tvar ctx = this.currCanvas.getContext(\"2d\");\n\tctx.drawImage(this.canvasDomNode,0,0);\n\t// Save the image into the tiddler\n\tthis.saveChanges();\n};\n\nEditBitmapWidget.prototype.saveChanges = function() {\n\tvar tiddler = this.wiki.getTiddler(this.editTitle) || new $tw.Tiddler({title: this.editTitle,type: DEFAULT_IMAGE_TYPE});\n\t// data URIs look like \"data:<type>;base64,<text>\"\n\tvar dataURL = this.canvasDomNode.toDataURL(tiddler.fields.type),\n\t\tposColon = dataURL.indexOf(\":\"),\n\t\tposSemiColon = dataURL.indexOf(\";\"),\n\t\tposComma = dataURL.indexOf(\",\"),\n\t\ttype = dataURL.substring(posColon+1,posSemiColon),\n\t\ttext = dataURL.substring(posComma+1);\n\tvar update = {type: type, text: text};\n\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getModificationFields(),tiddler,update,this.wiki.getCreationFields()));\n};\n\nexports[\"edit-bitmap\"] = EditBitmapWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-shortcut.js": {
"title": "$:/core/modules/widgets/edit-shortcut.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-shortcut.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to display an editable keyboard shortcut\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditShortcutWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditShortcutWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditShortcutWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.inputNode = this.document.createElement(\"input\");\n\t// Assign classes\n\tif(this.shortcutClass) {\n\t\tthis.inputNode.className = this.shortcutClass;\t\t\n\t}\n\t// Assign other attributes\n\tif(this.shortcutStyle) {\n\t\tthis.inputNode.setAttribute(\"style\",this.shortcutStyle);\n\t}\n\tif(this.shortcutTooltip) {\n\t\tthis.inputNode.setAttribute(\"title\",this.shortcutTooltip);\n\t}\n\tif(this.shortcutPlaceholder) {\n\t\tthis.inputNode.setAttribute(\"placeholder\",this.shortcutPlaceholder);\n\t}\n\tif(this.shortcutAriaLabel) {\n\t\tthis.inputNode.setAttribute(\"aria-label\",this.shortcutAriaLabel);\n\t}\n\t// Assign the current shortcut\n\tthis.updateInputNode();\n\t// Add event handlers\n\t$tw.utils.addEventListeners(this.inputNode,[\n\t\t{name: \"keydown\", handlerObject: this, handlerMethod: \"handleKeydownEvent\"}\n\t]);\n\t// Link into the DOM\n\tparent.insertBefore(this.inputNode,nextSibling);\n\tthis.domNodes.push(this.inputNode);\n\t// Focus the input Node if focus === \"yes\" or focus === \"true\"\n\tif(this.shortcutFocus === \"yes\" || this.shortcutFocus === \"true\") {\n\t\tthis.focus();\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nEditShortcutWidget.prototype.execute = function() {\n\tthis.shortcutTiddler = this.getAttribute(\"tiddler\");\n\tthis.shortcutField = this.getAttribute(\"field\");\n\tthis.shortcutIndex = this.getAttribute(\"index\");\n\tthis.shortcutPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.shortcutDefault = this.getAttribute(\"default\",\"\");\n\tthis.shortcutClass = this.getAttribute(\"class\");\n\tthis.shortcutStyle = this.getAttribute(\"style\");\n\tthis.shortcutTooltip = this.getAttribute(\"tooltip\");\n\tthis.shortcutAriaLabel = this.getAttribute(\"aria-label\");\n\tthis.shortcutFocus = this.getAttribute(\"focus\");\n};\n\n/*\nUpdate the value of the input node\n*/\nEditShortcutWidget.prototype.updateInputNode = function() {\n\tif(this.shortcutField) {\n\t\tvar tiddler = this.wiki.getTiddler(this.shortcutTiddler);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,this.shortcutField)) {\n\t\t\tthis.inputNode.value = tiddler.getFieldString(this.shortcutField);\n\t\t} else {\n\t\t\tthis.inputNode.value = this.shortcutDefault;\n\t\t}\n\t} else if(this.shortcutIndex) {\n\t\tthis.inputNode.value = this.wiki.extractTiddlerDataItem(this.shortcutTiddler,this.shortcutIndex,this.shortcutDefault);\n\t} else {\n\t\tthis.inputNode.value = this.wiki.getTiddlerText(this.shortcutTiddler,this.shortcutDefault);\n\t}\n};\n\n/*\nHandle a dom \"keydown\" event\n*/\nEditShortcutWidget.prototype.handleKeydownEvent = function(event) {\n\t// Ignore shift, ctrl, meta, alt\n\tif(event.keyCode && $tw.keyboardManager.getModifierKeys().indexOf(event.keyCode) === -1) {\n\t\t// Get the shortcut text representation\n\t\tvar value = $tw.keyboardManager.getPrintableShortcuts([{\n\t\t\tctrlKey: event.ctrlKey,\n\t\t\tshiftKey: event.shiftKey,\n\t\t\taltKey: event.altKey,\n\t\t\tmetaKey: event.metaKey,\n\t\t\tkeyCode: event.keyCode\n\t\t}]);\n\t\tif(value.length > 0) {\n\t\t\tthis.wiki.setText(this.shortcutTiddler,this.shortcutField,this.shortcutIndex,value[0]);\n\t\t}\n\t\t// Ignore the keydown if it was already handled\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t\treturn true;\t\t\n\t} else {\n\t\treturn false;\n\t}\n};\n\n/*\nfocus the input node\n*/\nEditShortcutWidget.prototype.focus = function() {\n\tif(this.inputNode.focus && this.inputNode.select) {\n\t\tthis.inputNode.focus();\n\t\tthis.inputNode.select();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget needed re-rendering\n*/\nEditShortcutWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.placeholder || changedAttributes[\"default\"] || changedAttributes[\"class\"] || changedAttributes.style || changedAttributes.tooltip || changedAttributes[\"aria-label\"] || changedAttributes.focus) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedTiddlers[this.shortcutTiddler]) {\n\t\tthis.updateInputNode();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports[\"edit-shortcut\"] = EditShortcutWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit-text.js": {
"title": "$:/core/modules/widgets/edit-text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit-text.js\ntype: application/javascript\nmodule-type: widget\n\nEdit-text widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar editTextWidgetFactory = require(\"$:/core/modules/editor/factory.js\").editTextWidgetFactory,\n\tFramedEngine = require(\"$:/core/modules/editor/engines/framed.js\").FramedEngine,\n\tSimpleEngine = require(\"$:/core/modules/editor/engines/simple.js\").SimpleEngine;\n\nexports[\"edit-text\"] = editTextWidgetFactory(FramedEngine,SimpleEngine);\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/edit.js": {
"title": "$:/core/modules/widgets/edit.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/edit.js\ntype: application/javascript\nmodule-type: widget\n\nEdit widget is a meta-widget chooses the appropriate actual editting widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EditWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEditWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEditWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n// Mappings from content type to editor type are stored in tiddlers with this prefix\nvar EDITOR_MAPPING_PREFIX = \"$:/config/EditorTypeMappings/\";\n\n/*\nCompute the internal state of the widget\n*/\nEditWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.editTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.editField = this.getAttribute(\"field\",\"text\");\n\tthis.editIndex = this.getAttribute(\"index\");\n\tthis.editClass = this.getAttribute(\"class\");\n\tthis.editPlaceholder = this.getAttribute(\"placeholder\");\n\tthis.editTabIndex = this.getAttribute(\"tabindex\");\n\tthis.editFocus = this.getAttribute(\"focus\",\"\");\n\tthis.editCancelPopups = this.getAttribute(\"cancelPopups\",\"\");\n\tthis.editInputActions = this.getAttribute(\"inputActions\");\n\tthis.editRefreshTitle = this.getAttribute(\"refreshTitle\");\n\tthis.editAutoComplete = this.getAttribute(\"autocomplete\");\n\t// Choose the appropriate edit widget\n\tthis.editorType = this.getEditorType();\n\t// Make the child widgets\n\tthis.makeChildWidgets([{\n\t\ttype: \"edit-\" + this.editorType,\n\t\tattributes: this.parseTreeNode.attributes,\n\t\tchildren: this.parseTreeNode.children\n\t}]);\n};\n\nEditWidget.prototype.getEditorType = function() {\n\t// Get the content type of the thing we're editing\n\tvar type;\n\tif(this.editField === \"text\") {\n\t\tvar tiddler = this.wiki.getTiddler(this.editTitle);\n\t\tif(tiddler) {\n\t\t\ttype = tiddler.fields.type;\n\t\t}\n\t}\n\ttype = type || \"text/vnd.tiddlywiki\";\n\tvar editorType = this.wiki.getTiddlerText(EDITOR_MAPPING_PREFIX + type);\n\tif(!editorType) {\n\t\tvar typeInfo = $tw.config.contentTypeInfo[type];\n\t\tif(typeInfo && typeInfo.encoding === \"base64\") {\n\t\t\teditorType = \"binary\";\n\t\t} else {\n\t\t\teditorType = \"text\";\n\t\t}\n\t}\n\treturn editorType;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEditWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh if an attribute has changed, or the type associated with the target tiddler has changed\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.tabindex || changedAttributes.cancelPopups || changedAttributes.inputActions || changedAttributes.refreshTitle || changedAttributes.autocomplete || (changedTiddlers[this.editTitle] && this.getEditorType() !== this.editorType)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.edit = EditWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/element.js": {
"title": "$:/core/modules/widgets/element.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/element.js\ntype: application/javascript\nmodule-type: widget\n\nElement widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ElementWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nElementWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nElementWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\t// Neuter blacklisted elements\n\tthis.tag = this.parseTreeNode.tag;\n\tif($tw.config.htmlUnsafeElements.indexOf(this.tag) !== -1) {\n\t\tthis.tag = \"safe-\" + this.tag;\n\t}\n\t// Adjust headings by the current base level\n\tvar headingLevel = [\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\"].indexOf(this.tag);\n\tif(headingLevel !== -1) {\n\t\tvar baseLevel = parseInt(this.getVariable(\"tv-adjust-heading-level\",\"0\"),10) || 0;\n\t\theadingLevel = Math.min(Math.max(headingLevel + 1 + baseLevel,1),6);\n\t\tthis.tag = \"h\" + headingLevel;\n\t}\n\t// Select the namespace for the tag\n\tvar tagNamespaces = {\n\t\t\tsvg: \"http://www.w3.org/2000/svg\",\n\t\t\tmath: \"http://www.w3.org/1998/Math/MathML\",\n\t\t\tbody: \"http://www.w3.org/1999/xhtml\"\n\t\t};\n\tthis.namespace = tagNamespaces[this.tag];\n\tif(this.namespace) {\n\t\tthis.setVariable(\"namespace\",this.namespace);\n\t} else {\n\t\tthis.namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"});\n\t}\n\t// Invoke the th-rendering-element hook\n\tvar parseTreeNodes = $tw.hooks.invokeHook(\"th-rendering-element\",null,this);\n\tthis.isReplaced = !!parseTreeNodes;\n\tif(parseTreeNodes) {\n\t\t// Use the parse tree nodes provided by the hook\n\t\tthis.makeChildWidgets(parseTreeNodes);\n\t\tthis.renderChildren(this.parentDomNode,null);\n\t\treturn;\n\t}\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n\t// Create the DOM node and render children\n\tvar domNode = this.document.createElementNS(this.namespace,this.tag);\n\tthis.assignAttributes(domNode,{excludeEventAttributes: true});\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nElementWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\thasChangedAttributes = $tw.utils.count(changedAttributes) > 0;\n\tif(hasChangedAttributes) {\n\t\tif(!this.isReplaced) {\n\t\t\t// Update our attributes\n\t\t\tthis.assignAttributes(this.domNodes[0],{excludeEventAttributes: true});\t\t\t\n\t\t} else {\n\t\t\t// If we were replaced then completely refresh ourselves\n\t\t\treturn this.refreshSelf();\n\t\t}\n\t}\n\treturn this.refreshChildren(changedTiddlers) || hasChangedAttributes;\n};\n\nexports.element = ElementWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/encrypt.js": {
"title": "$:/core/modules/widgets/encrypt.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/encrypt.js\ntype: application/javascript\nmodule-type: widget\n\nEncrypt widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EncryptWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEncryptWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEncryptWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.encryptedText);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEncryptWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.filter = this.getAttribute(\"filter\",\"[!is[system]]\");\n\t// Encrypt the filtered tiddlers\n\tvar tiddlers = this.wiki.filterTiddlers(this.filter),\n\t\tjson = {},\n\t\tself = this;\n\t$tw.utils.each(tiddlers,function(title) {\n\t\tvar tiddler = self.wiki.getTiddler(title),\n\t\t\tjsonTiddler = {};\n\t\tfor(var f in tiddler.fields) {\n\t\t\tjsonTiddler[f] = tiddler.getFieldString(f);\n\t\t}\n\t\tjson[title] = jsonTiddler;\n\t});\n\tthis.encryptedText = $tw.utils.htmlEncode($tw.crypto.encrypt(JSON.stringify(json)));\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEncryptWidget.prototype.refresh = function(changedTiddlers) {\n\t// We don't need to worry about refreshing because the encrypt widget isn't for interactive use\n\treturn false;\n};\n\nexports.encrypt = EncryptWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/entity.js": {
"title": "$:/core/modules/widgets/entity.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/entity.js\ntype: application/javascript\nmodule-type: widget\n\nHTML entity widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EntityWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEntityWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEntityWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar entityString = this.getAttribute(\"entity\",this.parseTreeNode.entity || \"\"),\n\t\ttextNode = this.document.createTextNode($tw.utils.entityDecode(entityString));\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEntityWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEntityWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.entity) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.entity = EntityWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/eventcatcher.js": {
"title": "$:/core/modules/widgets/eventcatcher.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/eventcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nEvent handler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar EventWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nEventWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nEventWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.elementTag && $tw.config.htmlUnsafeElements.indexOf(this.elementTag) === -1) {\n\t\ttag = this.elementTag;\n\t}\t\n\tvar domNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\t// Assign classes\n\tthis.assignDomNodeClasses();\t\n\t// Add our event handler\n\t$tw.utils.each(this.types,function(type) {\n\t\tdomNode.addEventListener(type,function(event) {\n\t\t\tvar selector = self.getAttribute(\"selector\"),\n\t\t\t\tactions = self.getAttribute(\"actions-\"+type),\n\t\t\t\tselectedNode = event.target,\n\t\t\t\tselectedNodeRect,\n\t\t\t\tcatcherNodeRect,\n\t\t\t\tvariables = {};\n\t\t\tif(selector) {\n\t\t\t\t// Search ancestors for a node that matches the selector\n\t\t\t\twhile(!selectedNode.matches(selector) && selectedNode !== domNode) {\n\t\t\t\t\tselectedNode = selectedNode.parentNode;\n\t\t\t\t}\n\t\t\t\t// If we found one, copy the attributes as variables, otherwise exit\n\t\t\t\tif(selectedNode.matches(selector)) {\n\t\t\t\t\t$tw.utils.each(selectedNode.attributes,function(attribute) {\n\t\t\t\t\t\tvariables[\"dom-\" + attribute.name] = attribute.value.toString();\n\t\t\t\t\t});\n\t\t\t\t\t//Add a variable with a popup coordinate string for the selected node\n\t\t\t\t\tvariables[\"tv-popup-coords\"] = \"(\" + selectedNode.offsetLeft + \",\" + selectedNode.offsetTop +\",\" + selectedNode.offsetWidth + \",\" + selectedNode.offsetHeight + \")\";\n\t\t\t\t\t\n\t\t\t\t\t//Add variables for offset of selected node\n\t\t\t\t\tvariables[\"tv-selectednode-posx\"] = selectedNode.offsetLeft.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-posy\"] = selectedNode.offsetTop.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-width\"] = selectedNode.offsetWidth.toString();\n\t\t\t\t\tvariables[\"tv-selectednode-height\"] = selectedNode.offsetHeight.toString();\n\n\t\t\t\t\t//Add variables for event X and Y position relative to selected node\n\t\t\t\t\tselectedNodeRect = selectedNode.getBoundingClientRect();\t\t\t\t\n\t\t\t\t\tvariables[\"event-fromselected-posx\"] = (event.clientX - selectedNodeRect.left).toString();\n\t\t\t\t\tvariables[\"event-fromselected-posy\"] = (event.clientY - selectedNodeRect.top).toString();\n\n\t\t\t\t\t//Add variables for event X and Y position relative to event catcher node\n\t\t\t\t\tcatcherNodeRect = self.domNode.getBoundingClientRect();\n\t\t\t\t\tvariables[\"event-fromcatcher-posx\"] = (event.clientX - catcherNodeRect.left).toString();\n\t\t\t\t\tvariables[\"event-fromcatcher-posy\"] = (event.clientY - catcherNodeRect.top).toString();\n\t\t\t\t} else {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Execute our actions with the variables\n\t\t\tif(actions) {\n\t\t\t\t// Add a variable for the modifier key\n\t\t\t\tvariables.modifier = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\t\t// Add a variable for the mouse button\n\t\t\t\tif(\"button\" in event) {\n\t\t\t\t\tif(event.button === 0) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"left\";\n\t\t\t\t\t} else if(event.button === 1) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"middle\";\n\t\t\t\t\t} else if(event.button === 2) {\n\t\t\t\t\t\tvariables[\"event-mousebutton\"] = \"right\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvariables[\"event-type\"] = event.type.toString();\n\t\t\t\tif(typeof event.detail === \"object\" && !!event.detail) {\n\t\t\t\t\t$tw.utils.each(event.detail,function(detailValue,detail) {\n\t\t\t\t\t\tvariables[\"event-detail-\" + detail] = detailValue.toString();\n\t\t\t\t\t});\n\t\t\t\t} else if(!!event.detail) {\n\t\t\t\t\tvariables[\"event-detail\"] = event.detail.toString();\n\t\t\t\t}\n\t\t\t\tself.invokeActionString(actions,self,event,variables);\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn false;\n\t\t},false);\n\t});\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nEventWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes that require a refresh on change\n\tthis.types = this.getAttribute(\"events\",\"\").split(\" \");\n\tthis.elementTag = this.getAttribute(\"tag\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\nEventWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-eventcatcher\");\n\tthis.domNode.className = classes.join(\" \");\t\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nEventWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"events\"] || changedAttributes[\"tag\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else if(changedAttributes[\"class\"]) {\n\t\tthis.assignDomNodeClasses();\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.eventcatcher = EventWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fieldmangler.js": {
"title": "$:/core/modules/widgets/fieldmangler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/fieldmangler.js\ntype: application/javascript\nmodule-type: widget\n\nField mangler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldManglerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-remove-field\", handler: \"handleRemoveFieldEvent\"},\n\t\t{type: \"tm-add-field\", handler: \"handleAddFieldEvent\"},\n\t\t{type: \"tm-remove-tag\", handler: \"handleRemoveTagEvent\"},\n\t\t{type: \"tm-add-tag\", handler: \"handleAddTagEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldManglerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldManglerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldManglerWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.mangleTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldManglerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nFieldManglerWidget.prototype.handleRemoveFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tdeletion = {};\n\tdeletion[event.param] = undefined;\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,deletion));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddFieldEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\taddition = this.wiki.getModificationFields(),\n\t\thadInvalidFieldName = false,\n\t\taddField = function(name,value) {\n\t\t\tvar trimmedName = name.toLowerCase().trim();\n\t\t\tif(!$tw.utils.isValidFieldName(trimmedName)) {\n\t\t\t\tif(!hadInvalidFieldName) {\n\t\t\t\t\talert($tw.language.getString(\n\t\t\t\t\t\t\"InvalidFieldName\",\n\t\t\t\t\t\t{variables:\n\t\t\t\t\t\t\t{fieldName: trimmedName}\n\t\t\t\t\t\t}\n\t\t\t\t\t));\n\t\t\t\t\thadInvalidFieldName = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif(!value && tiddler) {\n\t\t\t\t\tvalue = tiddler.fields[trimmedName];\n\t\t\t\t}\n\t\t\t\taddition[trimmedName] = value || \"\";\n\t\t\t}\n\t\t\treturn;\n\t\t};\n\taddition.title = this.mangleTitle;\n\tif(typeof event.param === \"string\") {\n\t\taddField(event.param,\"\");\n\t}\n\tif(typeof event.paramObject === \"object\") {\n\t\tfor(var name in event.paramObject) {\n\t\t\taddField(name,event.paramObject[name]);\n\t\t}\n\t}\n\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,addition));\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleRemoveTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && tiddler.fields.tags) {\n\t\tvar p = tiddler.fields.tags.indexOf(event.param);\n\t\tif(p !== -1) {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\tmodification.tags.splice(p,1);\n\t\t\tif(modification.tags.length === 0) {\n\t\t\t\tmodification.tags = undefined;\n\t\t\t}\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\n\t\t}\n\t}\n\treturn true;\n};\n\nFieldManglerWidget.prototype.handleAddTagEvent = function(event) {\n\tvar tiddler = this.wiki.getTiddler(this.mangleTitle),\n\t\tmodification = this.wiki.getModificationFields();\n\tif(tiddler && typeof event.param === \"string\") {\n\t\tvar tag = event.param.trim();\n\t\tif(tag !== \"\") {\n\t\t\tmodification.tags = (tiddler.fields.tags || []).slice(0);\n\t\t\t$tw.utils.pushTop(modification.tags,tag);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,modification));\t\t\t\n\t\t}\n\t} else if(typeof event.param === \"string\" && event.param.trim() !== \"\" && this.mangleTitle.trim() !== \"\") {\n\t\tvar tag = [];\n\t\ttag.push(event.param.trim());\n\t\tthis.wiki.addTiddler(new $tw.Tiddler({title: this.mangleTitle, tags: tag},modification));\n\t}\n\treturn true;\n};\n\nexports.fieldmangler = FieldManglerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/fields.js": {
"title": "$:/core/modules/widgets/fields.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/fields.js\ntype: application/javascript\nmodule-type: widget\n\nFields widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar FieldsWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nFieldsWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nFieldsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar textNode = this.document.createTextNode(this.text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nFieldsWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.template = this.getAttribute(\"template\");\n\tthis.sort = this.getAttribute(\"sort\",\"yes\") === \"yes\";\n\tthis.sortReverse = this.getAttribute(\"sortReverse\",\"no\") === \"yes\";\n\tthis.exclude = this.getAttribute(\"exclude\");\n\tthis.include = this.getAttribute(\"include\",null);\n\tthis.stripTitlePrefix = this.getAttribute(\"stripTitlePrefix\",\"no\") === \"yes\";\n\t// Get the value to display\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\n\t// Get the inclusion and exclusion list\n\tvar excludeArr = (this.exclude) ? this.exclude.split(\" \") : [\"text\"];\n\t// Include takes precedence\n\tvar includeArr = (this.include) ? this.include.split(\" \") : null;\n\n\t// Compose the template\n\tvar text = [];\n\tif(this.template && tiddler) {\n\t\tvar fields = [];\n\t\tif (includeArr) { // Include takes precedence\n\t\t\tfor(var i=0; i<includeArr.length; i++) {\n\t\t\t\tif(tiddler.fields[includeArr[i]]) {\n\t\t\t\t\tfields.push(includeArr[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor(var fieldName in tiddler.fields) {\n\t\t\t\tif(excludeArr.indexOf(fieldName) === -1) {\n\t\t\t\t\tfields.push(fieldName);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.sort) fields.sort();\n\t\tif (this.sortReverse) fields.reverse();\n\t\tfor(var f=0, fmax=fields.length; f<fmax; f++) {\n\t\t\tfieldName = fields[f];\n\t\t\tvar row = this.template,\n\t\t\t\tvalue = tiddler.getFieldString(fieldName);\n\t\t\tif(this.stripTitlePrefix && fieldName === \"title\") {\n\t\t\t\tvar reStrip = /^\\{[^\\}]+\\}(.+)/mg,\n\t\t\t\t\treMatch = reStrip.exec(value);\n\t\t\t\tif(reMatch) {\n\t\t\t\t\tvalue = reMatch[1];\n\t\t\t\t}\n\t\t\t}\n\t\t\trow = $tw.utils.replaceString(row,\"$name$\",fieldName);\n\t\t\trow = $tw.utils.replaceString(row,\"$value$\",value);\n\t\t\trow = $tw.utils.replaceString(row,\"$encoded_value$\",$tw.utils.htmlEncode(value));\n\t\t\ttext.push(row);\n\t\t}\n\t}\n\tthis.text = text.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nFieldsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif( changedAttributes.tiddler || changedAttributes.template || changedAttributes.exclude ||\n\t\tchangedAttributes.include || changedAttributes.sort || changedAttributes.sortReverse ||\n\t\tchangedTiddlers[this.tiddlerTitle] || changedAttributes.stripTitlePrefix) {\n\t\t\tthis.refreshSelf();\n\t\t\treturn true;\n\t} else {\n\t\treturn false;\n\t}\n};\n\nexports.fields = FieldsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/image.js": {
"title": "$:/core/modules/widgets/image.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/image.js\ntype: application/javascript\nmodule-type: widget\n\nThe image widget displays an image referenced with an external URI or with a local tiddler title.\n\n```\n<$image src=\"TiddlerTitle\" width=\"320\" height=\"400\" class=\"classnames\">\n```\n\nThe image source can be the title of an existing tiddler or the URL of an external image.\n\nExternal images always generate an HTML `<img>` tag.\n\nTiddlers that have a _canonical_uri field generate an HTML `<img>` tag with the src attribute containing the URI.\n\nTiddlers that contain image data generate an HTML `<img>` tag with the src attribute containing a base64 representation of the image.\n\nTiddlers that contain wikitext could be rendered to a DIV of the usual size of a tiddler, and then transformed to the size requested.\n\nThe width and height attributes are interpreted as a number of pixels, and do not need to include the \"px\" suffix.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImageWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImageWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImageWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create element\n\t// Determine what type of image it is\n\tvar tag = \"img\", src = \"\",\n\t\ttiddler = this.wiki.getTiddler(this.imageSource);\n\tif(!tiddler) {\n\t\t// The source isn't the title of a tiddler, so we'll assume it's a URL\n\t\tsrc = this.getVariable(\"tv-get-export-image-link\",{params: [{name: \"src\",value: this.imageSource}],defaultValue: this.imageSource});\n\t} else {\n\t\t// Check if it is an image tiddler\n\t\tif(this.wiki.isImageTiddler(this.imageSource)) {\n\t\t\tvar type = tiddler.fields.type,\n\t\t\t\ttext = tiddler.fields.text,\n\t\t\t\t_canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t// If the tiddler has body text then it doesn't need to be lazily loaded\n\t\t\tif(text) {\n\t\t\t\t// Render the appropriate element for the image type\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = \"data:application/pdf;base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = \"data:image/svg+xml,\" + encodeURIComponent(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = \"data:\" + type + \";base64,\" + text;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if(_canonical_uri) {\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase \"application/pdf\":\n\t\t\t\t\t\ttag = \"embed\";\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"image/svg+xml\":\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tsrc = _canonical_uri;\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\t\n\t\t\t} else {\n\t\t\t\t// Just trigger loading of the tiddler\n\t\t\t\tthis.wiki.getTiddlerText(this.imageSource);\n\t\t\t}\n\t\t}\n\t}\n\t// Create the element and assign the attributes\n\tvar domNode = this.document.createElement(tag);\n\tdomNode.setAttribute(\"src\",src);\n\tif(this.imageClass) {\n\t\tdomNode.setAttribute(\"class\",this.imageClass);\t\t\n\t}\n\tif(this.imageWidth) {\n\t\tdomNode.setAttribute(\"width\",this.imageWidth);\n\t}\n\tif(this.imageHeight) {\n\t\tdomNode.setAttribute(\"height\",this.imageHeight);\n\t}\n\tif(this.imageTooltip) {\n\t\tdomNode.setAttribute(\"title\",this.imageTooltip);\t\t\n\t}\n\tif(this.imageAlt) {\n\t\tdomNode.setAttribute(\"alt\",this.imageAlt);\t\t\n\t}\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.domNodes.push(domNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImageWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.imageSource = this.getAttribute(\"source\");\n\tthis.imageWidth = this.getAttribute(\"width\");\n\tthis.imageHeight = this.getAttribute(\"height\");\n\tthis.imageClass = this.getAttribute(\"class\");\n\tthis.imageTooltip = this.getAttribute(\"tooltip\");\n\tthis.imageAlt = this.getAttribute(\"alt\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImageWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.source || changedAttributes.width || changedAttributes.height || changedAttributes[\"class\"] || changedAttributes.tooltip || changedTiddlers[this.imageSource]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\t\n\t}\n};\n\nexports.image = ImageWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/importvariables.js": {
"title": "$:/core/modules/widgets/importvariables.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/importvariables.js\ntype: application/javascript\nmodule-type: widget\n\nImport variable definitions from other tiddlers\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ImportVariablesWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nImportVariablesWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nImportVariablesWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nImportVariablesWidget.prototype.execute = function(tiddlerList) {\n\tvar widgetPointer = this;\n\t// Got to flush all the accumulated variables\n\tthis.variables = new this.variablesConstructor();\n\t// Get our parameters\n\tthis.filter = this.getAttribute(\"filter\");\n\t// Compute the filter\n\tthis.tiddlerList = tiddlerList || this.wiki.filterTiddlers(this.filter,this);\n\t// Accumulate the <$set> widgets from each tiddler\n\t$tw.utils.each(this.tiddlerList,function(title) {\n\t\tvar parser = widgetPointer.wiki.parseTiddler(title);\n\t\tif(parser) {\n\t\t\tvar parseTreeNode = parser.tree[0];\n\t\t\twhile(parseTreeNode && parseTreeNode.type === \"set\") {\n\t\t\t\tvar node = {\n\t\t\t\t\ttype: \"set\",\n\t\t\t\t\tattributes: parseTreeNode.attributes,\n\t\t\t\t\tparams: parseTreeNode.params,\n\t\t\t\t\tisMacroDefinition: parseTreeNode.isMacroDefinition\n\t\t\t\t};\n\t\t\t\tif (parseTreeNode.isMacroDefinition) {\n\t\t\t\t\t// Macro definitions can be folded into\n\t\t\t\t\t// current widget instead of adding\n\t\t\t\t\t// another link to the chain.\n\t\t\t\t\tvar widget = widgetPointer.makeChildWidget(node);\n\t\t\t\t\twidget.computeAttributes();\n\t\t\t\t\twidget.execute();\n\t\t\t\t\t// We SHALLOW copy over all variables\n\t\t\t\t\t// in widget. We can't use\n\t\t\t\t\t// $tw.utils.assign, because that copies\n\t\t\t\t\t// up the prototype chain, which we\n\t\t\t\t\t// don't want.\n\t\t\t\t\t$tw.utils.each(Object.keys(widget.variables), function(key) {\n\t\t\t\t\t\twidgetPointer.variables[key] = widget.variables[key];\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\twidgetPointer.children = [widgetPointer.makeChildWidget(node)];\n\t\t\t\t\t// No more regenerating children for\n\t\t\t\t\t// this widget. If it needs to refresh,\n\t\t\t\t\t// it'll do so along with the the whole\n\t\t\t\t\t// importvariable tree.\n\t\t\t\t\tif (widgetPointer != this) {\n\t\t\t\t\t\twidgetPointer.makeChildWidgets = function(){};\n\t\t\t\t\t}\n\t\t\t\t\twidgetPointer = widgetPointer.children[0];\n\t\t\t\t}\n\t\t\t\tparseTreeNode = parseTreeNode.children && parseTreeNode.children[0];\n\t\t\t}\n\t\t} \n\t});\n\n\tif (widgetPointer != this) {\n\t\twidgetPointer.parseTreeNode.children = this.parseTreeNode.children;\n\t} else {\n\t\twidgetPointer.makeChildWidgets();\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nImportVariablesWidget.prototype.refresh = function(changedTiddlers) {\n\t// Recompute our attributes and the filter list\n\tvar changedAttributes = this.computeAttributes(),\n\t\ttiddlerList = this.wiki.filterTiddlers(this.getAttribute(\"filter\"),this);\n\t// Refresh if the filter has changed, or the list of tiddlers has changed, or any of the tiddlers in the list has changed\n\tfunction haveListedTiddlersChanged() {\n\t\tvar changed = false;\n\t\ttiddlerList.forEach(function(title) {\n\t\t\tif(changedTiddlers[title]) {\n\t\t\t\tchanged = true;\n\t\t\t}\n\t\t});\n\t\treturn changed;\n\t}\n\tif(changedAttributes.filter || !$tw.utils.isArrayEqual(this.tiddlerList,tiddlerList) || haveListedTiddlersChanged()) {\n\t\t// Compute the filter\n\t\tthis.removeChildDomNodes();\n\t\tthis.execute(tiddlerList);\n\t\tthis.renderChildren(this.parentDomNode,this.findNextSiblingDomNode());\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.importvariables = ImportVariablesWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/keyboard.js": {
"title": "$:/core/modules/widgets/keyboard.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/keyboard.js\ntype: application/javascript\nmodule-type: widget\n\nKeyboard shortcut widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar KeyboardWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nKeyboardWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nKeyboardWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.tag && $tw.config.htmlUnsafeElements.indexOf(this.tag) === -1) {\n\t\ttag = this.tag;\n\t}\n\t// Create element\n\tvar domNode = this.document.createElement(tag);\n\t// Assign classes\n\tvar classes = (this[\"class\"] || \"\").split(\" \");\n\tclasses.push(\"tc-keyboard\");\n\tdomNode.className = classes.join(\" \");\n\t// Add a keyboard event handler\n\tdomNode.addEventListener(\"keydown\",function (event) {\n\t\tif($tw.keyboardManager.checkKeyDescriptors(event,self.keyInfoArray)) {\n\t\t\tvar handled = self.invokeActions(self,event);\n\t\t\tif(self.actions) {\n\t\t\t\tself.invokeActionString(self.actions,self,event);\n\t\t\t}\n\t\t\tself.dispatchMessage(event);\n\t\t\tif(handled || self.actions || self.message) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tevent.stopPropagation();\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\treturn false;\n\t},false);\n\t// Insert element\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nKeyboardWidget.prototype.dispatchMessage = function(event) {\n\tthis.dispatchEvent({type: this.message, param: this.param, tiddlerTitle: this.getVariable(\"currentTiddler\")});\n};\n\n/*\nCompute the internal state of the widget\n*/\nKeyboardWidget.prototype.execute = function() {\n\tvar self = this;\n\t// Get attributes\n\tthis.actions = this.getAttribute(\"actions\",\"\");\n\tthis.message = this.getAttribute(\"message\",\"\");\n\tthis.param = this.getAttribute(\"param\",\"\");\n\tthis.key = this.getAttribute(\"key\",\"\");\n\tthis.tag = this.getAttribute(\"tag\",\"\");\n\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\tthis[\"class\"] = this.getAttribute(\"class\",\"\");\n\tif(this.key.substr(0,2) === \"((\" && this.key.substr(-2,2) === \"))\") {\n\t\tthis.shortcutTiddlers = [];\n\t\tvar name = this.key.substring(2,this.key.length -2);\n\t\t$tw.utils.each($tw.keyboardManager.lookupNames,function(platformDescriptor) {\n\t\t\tself.shortcutTiddlers.push(\"$:/config/\" + platformDescriptor + \"/\" + name);\n\t\t});\n\t}\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nKeyboardWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.message || changedAttributes.param || changedAttributes.key || changedAttributes[\"class\"] || changedAttributes.tag) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\t// Update the keyInfoArray if one of its shortcut-config-tiddlers has changed\n\tif(this.shortcutTiddlers && $tw.utils.hopArray(changedTiddlers,this.shortcutTiddlers)) {\n\t\tthis.keyInfoArray = $tw.keyboardManager.parseKeyDescriptors(this.key);\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.keyboard = KeyboardWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/link.js": {
"title": "$:/core/modules/widgets/link.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/link.js\ntype: application/javascript\nmodule-type: widget\n\nLink widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the value of the tv-wikilinks configuration macro\n\tvar wikiLinksMacro = this.getVariable(\"tv-wikilinks\"),\n\t\tuseWikiLinks = wikiLinksMacro ? (wikiLinksMacro.trim() !== \"no\") : true,\n\t\tmissingLinksEnabled = !(this.hideMissingLinks && this.isMissing && !this.isShadow);\n\t// Render the link if required\n\tif(useWikiLinks && missingLinksEnabled) {\n\t\tthis.renderLink(parent,nextSibling);\n\t} else {\n\t\t// Just insert the link text\n\t\tvar domNode = this.document.createElement(\"span\");\n\t\tparent.insertBefore(domNode,nextSibling);\n\t\tthis.renderChildren(domNode,null);\n\t\tthis.domNodes.push(domNode);\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nLinkWidget.prototype.renderLink = function(parent,nextSibling) {\n\tvar self = this;\n\t// Sanitise the specified tag\n\tvar tag = this.linkTag;\n\tif($tw.config.htmlUnsafeElements.indexOf(tag) !== -1) {\n\t\ttag = \"a\";\n\t}\n\t// Create our element\n\tvar namespace = this.getVariable(\"namespace\",{defaultValue: \"http://www.w3.org/1999/xhtml\"}),\n\t\tdomNode = this.document.createElementNS(namespace,tag);\n\t// Assign classes\n\tvar classes = [];\n\tif(this.overrideClasses === undefined) {\n\t\tclasses.push(\"tc-tiddlylink\");\n\t\tif(this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-shadow\");\n\t\t}\n\t\tif(this.isMissing && !this.isShadow) {\n\t\t\tclasses.push(\"tc-tiddlylink-missing\");\n\t\t} else {\n\t\t\tif(!this.isMissing) {\n\t\t\t\tclasses.push(\"tc-tiddlylink-resolves\");\n\t\t\t}\n\t\t}\n\t\tif(this.linkClasses) {\n\t\t\tclasses.push(this.linkClasses);\t\t\t\n\t\t}\n\t} else if(this.overrideClasses !== \"\") {\n\t\tclasses.push(this.overrideClasses)\n\t}\n\tif(classes.length > 0) {\n\t\tdomNode.setAttribute(\"class\",classes.join(\" \"));\n\t}\n\t// Set an href\n\tvar wikilinkTransformFilter = this.getVariable(\"tv-filter-export-link\"),\n\t\twikiLinkText;\n\tif(wikilinkTransformFilter) {\n\t\t// Use the filter to construct the href\n\t\twikiLinkText = this.wiki.filterTiddlers(wikilinkTransformFilter,this,function(iterator) {\n\t\t\titerator(self.wiki.getTiddler(self.to),self.to)\n\t\t})[0];\n\t} else {\n\t\t// Expand the tv-wikilink-template variable to construct the href\n\t\tvar wikiLinkTemplateMacro = this.getVariable(\"tv-wikilink-template\"),\n\t\t\twikiLinkTemplate = wikiLinkTemplateMacro ? wikiLinkTemplateMacro.trim() : \"#$uri_encoded$\";\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkTemplate,\"$uri_encoded$\",encodeURIComponent(this.to));\n\t\twikiLinkText = $tw.utils.replaceString(wikiLinkText,\"$uri_doubleencoded$\",encodeURIComponent(encodeURIComponent(this.to)));\n\t}\n\t// Override with the value of tv-get-export-link if defined\n\twikiLinkText = this.getVariable(\"tv-get-export-link\",{params: [{name: \"to\",value: this.to}],defaultValue: wikiLinkText});\n\tif(tag === \"a\") {\n\t\tvar namespaceHref = (namespace === \"http://www.w3.org/2000/svg\") ? \"http://www.w3.org/1999/xlink\" : undefined;\n\t\tdomNode.setAttributeNS(namespaceHref,\"href\",wikiLinkText);\n\t}\n\t// Set the tabindex\n\tif(this.tabIndex) {\n\t\tdomNode.setAttribute(\"tabindex\",this.tabIndex);\n\t}\n\t// Set the tooltip\n\t// HACK: Performance issues with re-parsing the tooltip prevent us defaulting the tooltip to \"<$transclude field='tooltip'><$transclude field='title'/></$transclude>\"\n\tvar tooltipWikiText = this.tooltip || this.getVariable(\"tv-wikilink-tooltip\");\n\tif(tooltipWikiText) {\n\t\tvar tooltipText = this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",tooltipWikiText,{\n\t\t\t\tparseAsInline: true,\n\t\t\t\tvariables: {\n\t\t\t\t\tcurrentTiddler: this.to\n\t\t\t\t},\n\t\t\t\tparentWidget: this\n\t\t\t});\n\t\tdomNode.setAttribute(\"title\",tooltipText);\n\t}\n\tif(this[\"aria-label\"]) {\n\t\tdomNode.setAttribute(\"aria-label\",this[\"aria-label\"]);\n\t}\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"click\", handlerObject: this, handlerMethod: \"handleClickEvent\"},\n\t]);\n\t// Make the link draggable if required\n\tif(this.draggable === \"yes\") {\n\t\t$tw.utils.makeDraggable({\n\t\t\tdomNode: domNode,\n\t\t\tdragTiddlerFn: function() {return self.to;},\n\t\t\twidget: this\n\t\t});\n\t}\n\t// Insert the link into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nLinkWidget.prototype.handleClickEvent = function(event) {\n\t// Send the click on its way as a navigate event\n\tvar bounds = this.domNodes[0].getBoundingClientRect();\n\tthis.dispatchEvent({\n\t\ttype: \"tm-navigate\",\n\t\tnavigateTo: this.to,\n\t\tnavigateFromTitle: this.getVariable(\"storyTiddler\"),\n\t\tnavigateFromNode: this,\n\t\tnavigateFromClientRect: { top: bounds.top, left: bounds.left, width: bounds.width, right: bounds.right, bottom: bounds.bottom, height: bounds.height\n\t\t},\n\t\tnavigateSuppressNavigation: event.metaKey || event.ctrlKey || (event.button === 1),\n\t\tmetaKey: event.metaKey,\n\t\tctrlKey: event.ctrlKey,\n\t\taltKey: event.altKey,\n\t\tshiftKey: event.shiftKey,\n\t\tevent: event\n\t});\n\tif(this.domNodes[0].hasAttribute(\"href\")) {\n\t\tevent.preventDefault();\n\t}\n\tevent.stopPropagation();\n\treturn false;\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkWidget.prototype.execute = function() {\n\t// Pick up our attributes\n\tthis.to = this.getAttribute(\"to\",this.getVariable(\"currentTiddler\"));\n\tthis.tooltip = this.getAttribute(\"tooltip\");\n\tthis[\"aria-label\"] = this.getAttribute(\"aria-label\");\n\tthis.linkClasses = this.getAttribute(\"class\");\n\tthis.overrideClasses = this.getAttribute(\"overrideClass\");\n\tthis.tabIndex = this.getAttribute(\"tabindex\");\n\tthis.draggable = this.getAttribute(\"draggable\",\"yes\");\n\tthis.linkTag = this.getAttribute(\"tag\",\"a\");\n\t// Determine the link characteristics\n\tthis.isMissing = !this.wiki.tiddlerExists(this.to);\n\tthis.isShadow = this.wiki.isShadowTiddler(this.to);\n\tthis.hideMissingLinks = (this.getVariable(\"tv-show-missing-links\") || \"yes\") === \"no\";\n\t// Make the child widgets\n\tvar templateTree;\n\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\ttemplateTree = this.parseTreeNode.children;\n\t} else {\n\t\t// Default template is a link to the title\n\t\ttemplateTree = [{type: \"text\", text: this.to}];\n\t}\n\tthis.makeChildWidgets(templateTree);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedTiddlers[this.to] || changedAttributes[\"aria-label\"] || changedAttributes.tooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.link = LinkWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/linkcatcher.js": {
"title": "$:/core/modules/widgets/linkcatcher.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/linkcatcher.js\ntype: application/javascript\nmodule-type: widget\n\nLinkcatcher widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar LinkCatcherWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nLinkCatcherWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nLinkCatcherWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nLinkCatcherWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.catchTo = this.getAttribute(\"to\");\n\tthis.catchMessage = this.getAttribute(\"message\");\n\tthis.catchSet = this.getAttribute(\"set\");\n\tthis.catchSetTo = this.getAttribute(\"setTo\");\n\tthis.catchActions = this.getAttribute(\"actions\");\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n\t// When executing actions we avoid trapping navigate events, so that we don't trigger ourselves recursively\n\tthis.executingActions = false;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nLinkCatcherWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.to || changedAttributes.message || changedAttributes.set || changedAttributes.setTo) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\n/*\nHandle a tm-navigate event\n*/\nLinkCatcherWidget.prototype.handleNavigateEvent = function(event) {\n\tif(!this.executingActions) {\n\t\t// Execute the actions\n\t\tif(this.catchTo) {\n\t\t\tthis.wiki.setTextReference(this.catchTo,event.navigateTo,this.getVariable(\"currentTiddler\"));\n\t\t}\n\t\tif(this.catchMessage && this.parentWidget) {\n\t\t\tthis.parentWidget.dispatchEvent({\n\t\t\t\ttype: this.catchMessage,\n\t\t\t\tparam: event.navigateTo,\n\t\t\t\tnavigateTo: event.navigateTo\n\t\t\t});\n\t\t}\n\t\tif(this.catchSet) {\n\t\t\tvar tiddler = this.wiki.getTiddler(this.catchSet);\n\t\t\tthis.wiki.addTiddler(new $tw.Tiddler(tiddler,{title: this.catchSet, text: this.catchSetTo}));\n\t\t}\n\t\tif(this.catchActions) {\n\t\t\tthis.executingActions = true;\n\t\t\tvar modifierKey = $tw.keyboardManager.getEventModifierKeyDescriptor(event);\n\t\t\tthis.invokeActionString(this.catchActions,this,event,{navigateTo: event.navigateTo, modifier: modifierKey});\n\t\t\tthis.executingActions = false;\n\t\t}\n\t} else {\n\t\t// This is a navigate event generated by the actions of this linkcatcher, so we don't trap it again, but just pass it to the parent\n\t\tthis.parentWidget.dispatchEvent({\n\t\t\ttype: \"tm-navigate\",\n\t\t\tparam: event.navigateTo,\n\t\t\tnavigateTo: event.navigateTo\n\t\t});\n\t}\n\treturn false;\n};\n\nexports.linkcatcher = LinkCatcherWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/list.js": {
"title": "$:/core/modules/widgets/list.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/list.js\ntype: application/javascript\nmodule-type: widget\n\nList and list item widgets\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\n/*\nThe list widget creates list element sub-widgets that reach back into the list widget for their configuration\n*/\n\nvar ListWidget = function(parseTreeNode,options) {\n\t// Initialise the storyviews if they've not been done already\n\tif(!this.storyViews) {\n\t\tListWidget.prototype.storyViews = {};\n\t\t$tw.modules.applyMethods(\"storyview\",this.storyViews);\n\t}\n\t// Main initialisation inherited from widget.js\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\t// Construct the storyview\n\tvar StoryView = this.storyViews[this.storyViewName];\n\tif(this.storyViewName && !StoryView) {\n\t\tStoryView = this.storyViews[\"classic\"];\n\t}\n\tif(StoryView && !this.document.isTiddlyWikiFakeDom) {\n\t\tthis.storyview = new StoryView(this);\n\t} else {\n\t\tthis.storyview = null;\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nListWidget.prototype.execute = function() {\n\t// Get our attributes\n\tthis.template = this.getAttribute(\"template\");\n\tthis.editTemplate = this.getAttribute(\"editTemplate\");\n\tthis.variableName = this.getAttribute(\"variable\",\"currentTiddler\");\n\tthis.storyViewName = this.getAttribute(\"storyview\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\t// Compose the list elements\n\tthis.list = this.getTiddlerList();\n\tvar members = [],\n\t\tself = this;\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\tmembers = this.getEmptyMessage();\n\t} else {\n\t\t$tw.utils.each(this.list,function(title,index) {\n\t\t\tmembers.push(self.makeItemTemplate(title));\n\t\t});\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(members);\n\t// Clear the last history\n\tthis.history = [];\n};\n\nListWidget.prototype.getTiddlerList = function() {\n\tvar defaultFilter = \"[!is[system]sort[title]]\";\n\treturn this.wiki.filterTiddlers(this.getAttribute(\"filter\",defaultFilter),this);\n};\n\nListWidget.prototype.getEmptyMessage = function() {\n\tvar parser,\n\t\temptyMessage = this.getAttribute(\"emptyMessage\",\"\");\n\t// this.wiki.parseText() calls \n\t// new Parser(..), which should only be done, if needed, because it's heavy!\n\tif (emptyMessage === \"\") {\n\t\treturn [];\n\t}\n\tparser = this.wiki.parseText(\"text/vnd.tiddlywiki\",emptyMessage,{parseAsInline: true});\n\tif(parser) {\n\t\treturn parser.tree;\n\t} else {\n\t\treturn [];\n\t}\n};\n\n/*\nCompose the template for a list item\n*/\nListWidget.prototype.makeItemTemplate = function(title) {\n\t// Check if the tiddler is a draft\n\tvar tiddler = this.wiki.getTiddler(title),\n\t\tisDraft = tiddler && tiddler.hasField(\"draft.of\"),\n\t\ttemplate = this.template,\n\t\ttemplateTree;\n\tif(isDraft && this.editTemplate) {\n\t\ttemplate = this.editTemplate;\n\t}\n\t// Compose the transclusion of the template\n\tif(template) {\n\t\ttemplateTree = [{type: \"transclude\", attributes: {tiddler: {type: \"string\", value: template}}}];\n\t} else {\n\t\tif(this.parseTreeNode.children && this.parseTreeNode.children.length > 0) {\n\t\t\ttemplateTree = this.parseTreeNode.children;\n\t\t} else {\n\t\t\t// Default template is a link to the title\n\t\t\ttemplateTree = [{type: \"element\", tag: this.parseTreeNode.isBlock ? \"div\" : \"span\", children: [{type: \"link\", attributes: {to: {type: \"string\", value: title}}, children: [\n\t\t\t\t\t{type: \"text\", text: title}\n\t\t\t]}]}];\n\t\t}\n\t}\n\t// Return the list item\n\treturn {type: \"listitem\", itemTitle: title, variableName: this.variableName, children: templateTree};\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tresult;\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshStart) {\n\t\tthis.storyview.refreshStart(changedTiddlers,changedAttributes);\n\t}\n\t// Completely refresh if any of our attributes have changed\n\tif(changedAttributes.filter || changedAttributes.template || changedAttributes.editTemplate || changedAttributes.emptyMessage || changedAttributes.storyview || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\tresult = true;\n\t} else {\n\t\t// Handle any changes to the list\n\t\tresult = this.handleListChanges(changedTiddlers);\n\t\t// Handle any changes to the history stack\n\t\tif(this.historyTitle && changedTiddlers[this.historyTitle]) {\n\t\t\tthis.handleHistoryChanges();\n\t\t}\n\t}\n\t// Call the storyview\n\tif(this.storyview && this.storyview.refreshEnd) {\n\t\tthis.storyview.refreshEnd(changedTiddlers,changedAttributes);\n\t}\n\treturn result;\n};\n\n/*\nHandle any changes to the history list\n*/\nListWidget.prototype.handleHistoryChanges = function() {\n\t// Get the history data\n\tvar newHistory = this.wiki.getTiddlerDataCached(this.historyTitle,[]);\n\t// Ignore any entries of the history that match the previous history\n\tvar entry = 0;\n\twhile(entry < newHistory.length && entry < this.history.length && newHistory[entry].title === this.history[entry].title) {\n\t\tentry++;\n\t}\n\t// Navigate forwards to each of the new tiddlers\n\twhile(entry < newHistory.length) {\n\t\tif(this.storyview && this.storyview.navigateTo) {\n\t\t\tthis.storyview.navigateTo(newHistory[entry]);\n\t\t}\n\t\tentry++;\n\t}\n\t// Update the history\n\tthis.history = newHistory;\n};\n\n/*\nProcess any changes to the list\n*/\nListWidget.prototype.handleListChanges = function(changedTiddlers) {\n\t// Get the new list\n\tvar prevList = this.list;\n\tthis.list = this.getTiddlerList();\n\t// Check for an empty list\n\tif(this.list.length === 0) {\n\t\t// Check if it was empty before\n\t\tif(prevList.length === 0) {\n\t\t\t// If so, just refresh the empty message\n\t\t\treturn this.refreshChildren(changedTiddlers);\n\t\t} else {\n\t\t\t// Replace the previous content with the empty message\n\t\t\tfor(t=this.children.length-1; t>=0; t--) {\n\t\t\t\tthis.removeListItem(t);\n\t\t\t}\n\t\t\tvar nextSibling = this.findNextSiblingDomNode();\n\t\t\tthis.makeChildWidgets(this.getEmptyMessage());\n\t\t\tthis.renderChildren(this.parentDomNode,nextSibling);\n\t\t\treturn true;\n\t\t}\n\t} else {\n\t\t// If the list was empty then we need to remove the empty message\n\t\tif(prevList.length === 0) {\n\t\t\tthis.removeChildDomNodes();\n\t\t\tthis.children = [];\n\t\t}\n\t\t// Cycle through the list, inserting and removing list items as needed\n\t\tvar hasRefreshed = false;\n\t\tfor(var t=0; t<this.list.length; t++) {\n\t\t\tvar index = this.findListItem(t,this.list[t]);\n\t\t\tif(index === undefined) {\n\t\t\t\t// The list item must be inserted\n\t\t\t\tthis.insertListItem(t,this.list[t]);\n\t\t\t\thasRefreshed = true;\n\t\t\t} else {\n\t\t\t\t// There are intervening list items that must be removed\n\t\t\t\tfor(var n=index-1; n>=t; n--) {\n\t\t\t\t\tthis.removeListItem(n);\n\t\t\t\t\thasRefreshed = true;\n\t\t\t\t}\n\t\t\t\t// Refresh the item we're reusing\n\t\t\t\tvar refreshed = this.children[t].refresh(changedTiddlers);\n\t\t\t\thasRefreshed = hasRefreshed || refreshed;\n\t\t\t}\n\t\t}\n\t\t// Remove any left over items\n\t\tfor(t=this.children.length-1; t>=this.list.length; t--) {\n\t\t\tthis.removeListItem(t);\n\t\t\thasRefreshed = true;\n\t\t}\n\t\treturn hasRefreshed;\n\t}\n};\n\n/*\nFind the list item with a given title, starting from a specified position\n*/\nListWidget.prototype.findListItem = function(startIndex,title) {\n\twhile(startIndex < this.children.length) {\n\t\tif(this.children[startIndex].parseTreeNode.itemTitle === title) {\n\t\t\treturn startIndex;\n\t\t}\n\t\tstartIndex++;\n\t}\n\treturn undefined;\n};\n\n/*\nInsert a new list item at the specified index\n*/\nListWidget.prototype.insertListItem = function(index,title) {\n\t// Create, insert and render the new child widgets\n\tvar widget = this.makeChildWidget(this.makeItemTemplate(title));\n\twidget.parentDomNode = this.parentDomNode; // Hack to enable findNextSiblingDomNode() to work\n\tthis.children.splice(index,0,widget);\n\tvar nextSibling = widget.findNextSiblingDomNode();\n\twidget.render(this.parentDomNode,nextSibling);\n\t// Animate the insertion if required\n\tif(this.storyview && this.storyview.insert) {\n\t\tthis.storyview.insert(widget);\n\t}\n\treturn true;\n};\n\n/*\nRemove the specified list item\n*/\nListWidget.prototype.removeListItem = function(index) {\n\tvar widget = this.children[index];\n\t// Animate the removal if required\n\tif(this.storyview && this.storyview.remove) {\n\t\tthis.storyview.remove(widget);\n\t} else {\n\t\twidget.removeChildDomNodes();\n\t}\n\t// Remove the child widget\n\tthis.children.splice(index,1);\n};\n\nexports.list = ListWidget;\n\nvar ListItemWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nListItemWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nListItemWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nListItemWidget.prototype.execute = function() {\n\t// Set the current list item title\n\tthis.setVariable(this.parseTreeNode.variableName,this.parseTreeNode.itemTitle);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nListItemWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.listitem = ListItemWidget;\n\n})();",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/log.js": {
"title": "$:/core/modules/widgets/log.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/log.js\ntype: application/javascript\nmodule-type: widget-subclass\n\nWidget to log debug messages\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nexports.baseClass = \"action-log\";\n\nexports.name = \"log\";\n\nexports.constructor = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n}\n\nexports.prototype = {};\n\nexports.prototype.render = function(event) {\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).render.call(this,event);\t\n\tObject.getPrototypeOf(Object.getPrototypeOf(this)).log.call(this);\n}\n\n})();",
"type": "application/javascript",
"module-type": "widget-subclass"
},
"$:/core/modules/widgets/macrocall.js": {
"title": "$:/core/modules/widgets/macrocall.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/macrocall.js\ntype: application/javascript\nmodule-type: widget\n\nMacrocall widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar MacroCallWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nMacroCallWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nMacroCallWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nMacroCallWidget.prototype.execute = function() {\n\t// Get the parse type if specified\n\tthis.parseType = this.getAttribute(\"$type\",\"text/vnd.tiddlywiki\");\n\tthis.renderOutput = this.getAttribute(\"$output\",\"text/html\");\n\t// Merge together the parameters specified in the parse tree with the specified attributes\n\tvar params = this.parseTreeNode.params ? this.parseTreeNode.params.slice(0) : [];\n\t$tw.utils.each(this.attributes,function(attribute,name) {\n\t\tif(name.charAt(0) !== \"$\") {\n\t\t\tparams.push({name: name, value: attribute});\t\t\t\n\t\t}\n\t});\n\t// Get the macro value\n\tvar macroName = this.parseTreeNode.name || this.getAttribute(\"$name\"),\n\t\tvariableInfo = this.getVariableInfo(macroName,{params: params}),\n\t\ttext = variableInfo.text,\n\t\tparseTreeNodes;\n\t// Are we rendering to HTML?\n\tif(this.renderOutput === \"text/html\") {\n\t\t// If so we'll return the parsed macro\n\t\t// Check if we've already cached parsing this macro\n\t\tvar mode = this.parseTreeNode.isBlock ? \"blockParser\" : \"inlineParser\",\n\t\t\tparser;\n\t\tif(variableInfo.srcVariable && variableInfo.srcVariable[mode]) {\n\t\t\tparser = variableInfo.srcVariable[mode];\n\t\t} else {\n\t\t\tparser = this.wiki.parseText(this.parseType,text,\n\t\t\t\t\t\t\t\t{parseAsInline: !this.parseTreeNode.isBlock});\n\t\t\tif(variableInfo.isCacheable && variableInfo.srcVariable) {\n\t\t\t\tvariableInfo.srcVariable[mode] = parser;\n\t\t\t}\n\t\t}\n\t\tvar parseTreeNodes = parser ? parser.tree : [];\n\t\t// Wrap the parse tree in a vars widget assigning the parameters to variables named \"__paramname__\"\n\t\tvar attributes = {};\n\t\t$tw.utils.each(variableInfo.params,function(param) {\n\t\t\tvar name = \"__\" + param.name + \"__\";\n\t\t\tattributes[name] = {\n\t\t\t\tname: name,\n\t\t\t\ttype: \"string\",\n\t\t\t\tvalue: param.value\n\t\t\t};\n\t\t});\n\t\tparseTreeNodes = [{\n\t\t\ttype: \"vars\",\n\t\t\tattributes: attributes,\n\t\t\tchildren: parseTreeNodes\n\t\t}];\n\t} else if(this.renderOutput === \"text/raw\") {\n\t\tparseTreeNodes = [{type: \"text\", text: text}];\n\t} else {\n\t\t// Otherwise, we'll render the text\n\t\tvar plainText = this.wiki.renderText(\"text/plain\",this.parseType,text,{parentWidget: this});\n\t\tparseTreeNodes = [{type: \"text\", text: plainText}];\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nMacroCallWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\t// Rerender ourselves\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.macrocall = MacroCallWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/navigator.js": {
"title": "$:/core/modules/widgets/navigator.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/navigator.js\ntype: application/javascript\nmodule-type: widget\n\nNavigator widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar IMPORT_TITLE = \"$:/Import\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar NavigatorWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.addEventListeners([\n\t\t{type: \"tm-navigate\", handler: \"handleNavigateEvent\"},\n\t\t{type: \"tm-edit-tiddler\", handler: \"handleEditTiddlerEvent\"},\n\t\t{type: \"tm-delete-tiddler\", handler: \"handleDeleteTiddlerEvent\"},\n\t\t{type: \"tm-save-tiddler\", handler: \"handleSaveTiddlerEvent\"},\n\t\t{type: \"tm-cancel-tiddler\", handler: \"handleCancelTiddlerEvent\"},\n\t\t{type: \"tm-close-tiddler\", handler: \"handleCloseTiddlerEvent\"},\n\t\t{type: \"tm-close-all-tiddlers\", handler: \"handleCloseAllTiddlersEvent\"},\n\t\t{type: \"tm-close-other-tiddlers\", handler: \"handleCloseOtherTiddlersEvent\"},\n\t\t{type: \"tm-new-tiddler\", handler: \"handleNewTiddlerEvent\"},\n\t\t{type: \"tm-import-tiddlers\", handler: \"handleImportTiddlersEvent\"},\n\t\t{type: \"tm-perform-import\", handler: \"handlePerformImportEvent\"},\n\t\t{type: \"tm-fold-tiddler\", handler: \"handleFoldTiddlerEvent\"},\n\t\t{type: \"tm-fold-other-tiddlers\", handler: \"handleFoldOtherTiddlersEvent\"},\n\t\t{type: \"tm-fold-all-tiddlers\", handler: \"handleFoldAllTiddlersEvent\"},\n\t\t{type: \"tm-unfold-all-tiddlers\", handler: \"handleUnfoldAllTiddlersEvent\"},\n\t\t{type: \"tm-rename-tiddler\", handler: \"handleRenameTiddlerEvent\"}\n\t]);\n};\n\n/*\nInherit from the base widget class\n*/\nNavigatorWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nNavigatorWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nNavigatorWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.storyTitle = this.getAttribute(\"story\");\n\tthis.historyTitle = this.getAttribute(\"history\");\n\tthis.setVariable(\"tv-story-list\",this.storyTitle);\n\tthis.setVariable(\"tv-history-list\",this.historyTitle);\n\tthis.story = new $tw.Story({\n\t\twiki: this.wiki,\n\t\tstoryTitle: this.storyTitle,\n\t\thistoryTitle: this.historyTitle\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nNavigatorWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.story || changedAttributes.history) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nNavigatorWidget.prototype.getStoryList = function() {\n\treturn this.storyTitle ? this.wiki.getTiddlerList(this.storyTitle) : null;\n};\n\nNavigatorWidget.prototype.saveStoryList = function(storyList) {\n\tif(this.storyTitle) {\n\t\tvar storyTiddler = this.wiki.getTiddler(this.storyTitle);\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(\n\t\t\t{title: this.storyTitle},\n\t\t\tstoryTiddler,\n\t\t\t{list: storyList}\n\t\t));\t\t\n\t}\n};\n\nNavigatorWidget.prototype.removeTitleFromStory = function(storyList,title) {\n\tif(storyList) {\n\t\tvar p = storyList.indexOf(title);\n\t\twhile(p !== -1) {\n\t\t\tstoryList.splice(p,1);\n\t\t\tp = storyList.indexOf(title);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.replaceFirstTitleInStory = function(storyList,oldTitle,newTitle) {\n\tif(storyList) {\n\t\tvar pos = storyList.indexOf(oldTitle);\n\t\tif(pos !== -1) {\n\t\t\tstoryList[pos] = newTitle;\n\t\t\tdo {\n\t\t\t\tpos = storyList.indexOf(oldTitle,pos + 1);\n\t\t\t\tif(pos !== -1) {\n\t\t\t\t\tstoryList.splice(pos,1);\n\t\t\t\t}\n\t\t\t} while(pos !== -1);\n\t\t} else {\n\t\t\tstoryList.splice(0,0,newTitle);\n\t\t}\t\t\n\t}\n};\n\nNavigatorWidget.prototype.addToStory = function(title,fromTitle) {\n\tif(this.storyTitle) {\n\t\tthis.story.addToStory(title,fromTitle,{\n\t\t\topenLinkFromInsideRiver: this.getAttribute(\"openLinkFromInsideRiver\",\"top\"),\n\t\t\topenLinkFromOutsideRiver: this.getAttribute(\"openLinkFromOutsideRiver\",\"top\")\n\t\t});\n\t}\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\n*/\nNavigatorWidget.prototype.addToHistory = function(title,fromPageRect) {\n\tthis.story.addToHistory(title,fromPageRect,this.historyTitle);\n};\n\n/*\nHandle a tm-navigate event\n*/\nNavigatorWidget.prototype.handleNavigateEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-navigating\",event);\n\tif(event.navigateTo) {\n\t\tthis.addToStory(event.navigateTo,event.navigateFromTitle);\n\t\tif(!event.navigateSuppressNavigation) {\n\t\t\tthis.addToHistory(event.navigateTo,event.navigateFromClientRect);\n\t\t}\n\t}\n\treturn false;\n};\n\n// Close a specified tiddler\nNavigatorWidget.prototype.handleCloseTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\tstoryList = this.getStoryList();\n\t// Look for tiddlers with this title to close\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\treturn false;\n};\n\n// Close all tiddlers\nNavigatorWidget.prototype.handleCloseAllTiddlersEvent = function(event) {\n\tthis.saveStoryList([]);\n\treturn false;\n};\n\n// Close other tiddlers\nNavigatorWidget.prototype.handleCloseOtherTiddlersEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle;\n\tthis.saveStoryList([title]);\n\treturn false;\n};\n\n// Place a tiddler in edit mode\nNavigatorWidget.prototype.handleEditTiddlerEvent = function(event) {\n\tvar editTiddler = $tw.hooks.invokeHook(\"th-editing-tiddler\",event);\n\tif(!editTiddler) {\n\t\treturn false;\n\t}\n\tvar self = this;\n\tfunction isUnmodifiedShadow(title) {\n\t\treturn self.wiki.isShadowTiddler(title) && !self.wiki.tiddlerExists(title);\n\t}\n\tfunction confirmEditShadow(title) {\n\t\treturn confirm($tw.language.getString(\n\t\t\t\"ConfirmEditShadowTiddler\",\n\t\t\t{variables:\n\t\t\t\t{title: title}\n\t\t\t}\n\t\t));\n\t}\n\tvar title = event.param || event.tiddlerTitle;\n\tif(isUnmodifiedShadow(title) && !confirmEditShadow(title)) {\n\t\treturn false;\n\t}\n\t// Replace the specified tiddler with a draft in edit mode\n\tvar draftTiddler = this.makeDraftTiddler(title);\n\t// Update the story and history if required\n\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\tvar draftTitle = draftTiddler.fields.title,\n\t\t\tstoryList = this.getStoryList();\n\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\tthis.saveStoryList(storyList);\n\t\treturn false;\n\t}\n};\n\n// Delete a tiddler\nNavigatorWidget.prototype.handleDeleteTiddlerEvent = function(event) {\n\t// Get the tiddler we're deleting\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList(),\n\t\toriginalTitle = tiddler ? tiddler.fields[\"draft.of\"] : \"\",\n\t\toriginalTiddler = originalTitle ? this.wiki.getTiddler(originalTitle) : undefined,\n\t\tconfirmationTitle;\n\tif(!tiddler) {\n\t\treturn false;\n\t}\n\t// Check if the tiddler we're deleting is in draft mode\n\tif(originalTitle) {\n\t\t// If so, we'll prompt for confirmation referencing the original tiddler\n\t\tconfirmationTitle = originalTitle;\n\t} else {\n\t\t// If not a draft, then prompt for confirmation referencing the specified tiddler\n\t\tconfirmationTitle = title;\n\t}\n\t// Seek confirmation\n\tif((this.wiki.getTiddler(originalTitle) || (tiddler.fields.text || \"\") !== \"\") && !confirm($tw.language.getString(\n\t\t\t\t\"ConfirmDeleteTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: confirmationTitle}\n\t\t\t\t}\n\t\t\t))) {\n\t\treturn false;\n\t}\n\t// Delete the original tiddler\n\tif(originalTitle) {\n\t\tif(originalTiddler) {\n\t\t\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",originalTiddler);\n\t\t}\n\t\tthis.wiki.deleteTiddler(originalTitle);\n\t\tthis.removeTitleFromStory(storyList,originalTitle);\n\t}\n\t// Invoke the hook function and delete this tiddler\n\t$tw.hooks.invokeHook(\"th-deleting-tiddler\",tiddler);\n\tthis.wiki.deleteTiddler(title);\n\t// Remove the closed tiddler from the story\n\tthis.removeTitleFromStory(storyList,title);\n\tthis.saveStoryList(storyList);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\treturn false;\n};\n\n/*\nCreate/reuse the draft tiddler for a given title\n*/\nNavigatorWidget.prototype.makeDraftTiddler = function(targetTitle) {\n\t// See if there is already a draft tiddler for this tiddler\n\tvar draftTitle = this.wiki.findDraft(targetTitle);\n\tif(draftTitle) {\n\t\treturn this.wiki.getTiddler(draftTitle);\n\t}\n\t// Get the current value of the tiddler we're editing\n\tvar tiddler = this.wiki.getTiddler(targetTitle);\n\t// Save the initial value of the draft tiddler\n\tdraftTitle = this.generateDraftTitle(targetTitle);\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\t\ttext: \"\",\n\t\t\t},\n\t\t\ttiddler,\n\t\t\t{\n\t\t\t\ttitle: draftTitle,\n\t\t\t\t\"draft.title\": targetTitle,\n\t\t\t\t\"draft.of\": targetTitle\n\t\t\t},\n\t\t\tthis.wiki.getModificationFields()\n\t\t);\n\tthis.wiki.addTiddler(draftTiddler);\n\treturn draftTiddler;\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nNavigatorWidget.prototype.generateDraftTitle = function(title) {\n\treturn this.wiki.generateDraftTitle(title);\n};\n\n// Take a tiddler out of edit mode, saving the changes\nNavigatorWidget.prototype.handleSaveTiddlerEvent = function(event) {\n\tvar title = event.param || event.tiddlerTitle,\n\t\ttiddler = this.wiki.getTiddler(title),\n\t\tstoryList = this.getStoryList();\n\t// Replace the original tiddler with the draft\n\tif(tiddler) {\n\t\tvar draftTitle = (tiddler.fields[\"draft.title\"] || \"\").trim(),\n\t\t\tdraftOf = (tiddler.fields[\"draft.of\"] || \"\").trim();\n\t\tif(draftTitle) {\n\t\t\tvar isRename = draftOf !== draftTitle,\n\t\t\t\tisConfirmed = true;\n\t\t\tif(isRename && this.wiki.tiddlerExists(draftTitle)) {\n\t\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\t\"ConfirmOverwriteTiddler\",\n\t\t\t\t\t{variables:\n\t\t\t\t\t\t{title: draftTitle}\n\t\t\t\t\t}\n\t\t\t\t));\n\t\t\t}\n\t\t\tif(isConfirmed) {\n\t\t\t\t// Create the new tiddler and pass it through the th-saving-tiddler hook\n\t\t\t\tvar newTiddler = new $tw.Tiddler(this.wiki.getCreationFields(),tiddler,{\n\t\t\t\t\ttitle: draftTitle,\n\t\t\t\t\t\"draft.title\": undefined,\n\t\t\t\t\t\"draft.of\": undefined\n\t\t\t\t},this.wiki.getModificationFields());\n\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-saving-tiddler\",newTiddler,tiddler);\n\t\t\t\tthis.wiki.addTiddler(newTiddler);\n\t\t\t\t// If enabled, relink references to renamed tiddler\n\t\t\t\tvar shouldRelink = this.getAttribute(\"relinkOnRename\",\"no\").toLowerCase().trim() === \"yes\";\n\t\t\t\tif(isRename && shouldRelink && this.wiki.tiddlerExists(draftOf)) {\n\t\t\t\t\tthis.wiki.relinkTiddler(draftOf,draftTitle);\n\t\t\t\t}\n\t\t\t\t// Remove the draft tiddler\n\t\t\t\tthis.wiki.deleteTiddler(title);\n\t\t\t\t// Remove the original tiddler if we're renaming it\n\t\t\t\tif(isRename) {\n\t\t\t\t\tthis.wiki.deleteTiddler(draftOf);\n\t\t\t\t}\n\t\t\t\t// #2381 always remove new title & old\n\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\tthis.removeTitleFromStory(storyList,draftOf);\n\t\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\t\t// Replace the draft in the story with the original\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,title,draftTitle);\n\t\t\t\t\tthis.addToHistory(draftTitle,event.navigateFromClientRect);\n\t\t\t\t\tif(draftTitle !== this.storyTitle) {\n\t\t\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Trigger an autosave\n\t\t\t\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Take a tiddler out of edit mode without saving the changes\nNavigatorWidget.prototype.handleCancelTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-cancelling-tiddler\", event);\n\t// Flip the specified tiddler from draft back to the original\n\tvar draftTitle = event.param || event.tiddlerTitle,\n\t\tdraftTiddler = this.wiki.getTiddler(draftTitle),\n\t\toriginalTitle = draftTiddler && draftTiddler.fields[\"draft.of\"];\n\tif(draftTiddler && originalTitle) {\n\t\t// Ask for confirmation if the tiddler text has changed\n\t\tvar isConfirmed = true,\n\t\t\toriginalTiddler = this.wiki.getTiddler(originalTitle),\n\t\t\tstoryList = this.getStoryList();\n\t\tif(this.wiki.isDraftModified(draftTitle)) {\n\t\t\tisConfirmed = confirm($tw.language.getString(\n\t\t\t\t\"ConfirmCancelTiddler\",\n\t\t\t\t{variables:\n\t\t\t\t\t{title: draftTitle}\n\t\t\t\t}\n\t\t\t));\n\t\t}\n\t\t// Remove the draft tiddler\n\t\tif(isConfirmed) {\n\t\t\tthis.wiki.deleteTiddler(draftTitle);\n\t\t\tif(!event.paramObject || event.paramObject.suppressNavigation !== \"yes\") {\n\t\t\t\tif(originalTiddler) {\n\t\t\t\t\tthis.replaceFirstTitleInStory(storyList,draftTitle,originalTitle);\n\t\t\t\t\tthis.addToHistory(originalTitle,event.navigateFromClientRect);\n\t\t\t\t} else {\n\t\t\t\t\tthis.removeTitleFromStory(storyList,draftTitle);\n\t\t\t\t}\n\t\t\t\tthis.saveStoryList(storyList);\n\t\t\t}\n\t\t}\n\t}\n\treturn false;\n};\n\n// Create a new draft tiddler\n// event.param can either be the title of a template tiddler, or a hashmap of fields.\n//\n// The title of the newly created tiddler follows these rules:\n// * If a hashmap was used and a title field was specified, use that title\n// * If a hashmap was used without a title field, use a default title, if necessary making it unique with a numeric suffix\n// * If a template tiddler was used, use the title of the template, if necessary making it unique with a numeric suffix\n//\n// If a draft of the target tiddler already exists then it is reused\nNavigatorWidget.prototype.handleNewTiddlerEvent = function(event) {\n\tevent = $tw.hooks.invokeHook(\"th-new-tiddler\", event);\n\t// Get the story details\n\tvar storyList = this.getStoryList(),\n\t\ttemplateTiddler, additionalFields, title, draftTitle, existingTiddler;\n\t// Get the template tiddler (if any)\n\tif(typeof event.param === \"string\") {\n\t\t// Get the template tiddler\n\t\ttemplateTiddler = this.wiki.getTiddler(event.param);\n\t\t// Generate a new title\n\t\ttitle = this.wiki.generateNewTitle(event.param || $tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t}\n\t// Get the specified additional fields\n\tif(typeof event.paramObject === \"object\") {\n\t\tadditionalFields = event.paramObject;\n\t}\n\tif(typeof event.param === \"object\") { // Backwards compatibility with 5.1.3\n\t\tadditionalFields = event.param;\n\t}\n\tif(additionalFields && additionalFields.title) {\n\t\ttitle = additionalFields.title;\n\t}\n\t// Make a copy of the additional fields excluding any blank ones\n\tvar filteredAdditionalFields = $tw.utils.extend({},additionalFields);\n\tObject.keys(filteredAdditionalFields).forEach(function(fieldName) {\n\t\tif(filteredAdditionalFields[fieldName] === \"\") {\n\t\t\tdelete filteredAdditionalFields[fieldName];\n\t\t}\n\t});\n\t// Generate a title if we don't have one\n\ttitle = title || this.wiki.generateNewTitle($tw.language.getString(\"DefaultNewTiddlerTitle\"));\n\t// Find any existing draft for this tiddler\n\tdraftTitle = this.wiki.findDraft(title);\n\t// Pull in any existing tiddler\n\tif(draftTitle) {\n\t\texistingTiddler = this.wiki.getTiddler(draftTitle);\n\t} else {\n\t\tdraftTitle = this.generateDraftTitle(title);\n\t\texistingTiddler = this.wiki.getTiddler(title);\n\t}\n\t// Merge the tags\n\tvar mergedTags = [];\n\tif(existingTiddler && existingTiddler.fields.tags) {\n\t\t$tw.utils.pushTop(mergedTags,existingTiddler.fields.tags);\n\t}\n\tif(additionalFields && additionalFields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,$tw.utils.parseStringArray(additionalFields.tags));\n\t}\n\tif(templateTiddler && templateTiddler.fields.tags) {\n\t\t// Merge tags\n\t\tmergedTags = $tw.utils.pushTop(mergedTags,templateTiddler.fields.tags);\n\t}\n\t// Save the draft tiddler\n\tvar draftTiddler = new $tw.Tiddler({\n\t\t\ttext: \"\",\n\t\t\t\"draft.title\": title\n\t\t},\n\t\ttemplateTiddler,\n\t\tadditionalFields,\n\t\tthis.wiki.getCreationFields(),\n\t\texistingTiddler,\n\t\tfilteredAdditionalFields,\n\t\t{\n\t\t\ttitle: draftTitle,\n\t\t\t\"draft.of\": title,\n\t\t\ttags: mergedTags\n\t\t},this.wiki.getModificationFields());\n\tthis.wiki.addTiddler(draftTiddler);\n\t// Update the story to insert the new draft at the top and remove any existing tiddler\n\tif(storyList && storyList.indexOf(draftTitle) === -1) {\n\t\tvar slot = storyList.indexOf(event.navigateFromTitle);\n\t\tif(slot === -1) {\n\t\t\tslot = this.getAttribute(\"openLinkFromOutsideRiver\",\"top\") === \"bottom\" ? storyList.length - 1 : slot;\n\t\t}\n\t\tstoryList.splice(slot + 1,0,draftTitle);\n\t}\n\tif(storyList && storyList.indexOf(title) !== -1) {\n\t\tstoryList.splice(storyList.indexOf(title),1);\n\t}\n\tthis.saveStoryList(storyList);\n\t// Add a new record to the top of the history stack\n\tthis.addToHistory(draftTitle);\n\treturn false;\n};\n\n// Import JSON tiddlers into a pending import tiddler\nNavigatorWidget.prototype.handleImportTiddlersEvent = function(event) {\n\t// Get the tiddlers\n\tvar tiddlers = [];\n\ttry {\n\t\ttiddlers = JSON.parse(event.param);\n\t} catch(e) {\n\t}\n\t// Get the current $:/Import tiddler\n\tvar importTitle = event.importTitle ? event.importTitle : IMPORT_TITLE,\n\t\timportTiddler = this.wiki.getTiddler(importTitle),\n\t\timportData = this.wiki.getTiddlerData(importTitle,{}),\n\t\tnewFields = new Object({\n\t\t\ttitle: importTitle,\n\t\t\ttype: \"application/json\",\n\t\t\t\"plugin-type\": \"import\",\n\t\t\t\"status\": \"pending\"\n\t\t}),\n\t\tincomingTiddlers = [];\n\t// Process each tiddler\n\timportData.tiddlers = importData.tiddlers || {};\n\t$tw.utils.each(tiddlers,function(tiddlerFields) {\n\t\ttiddlerFields.title = $tw.utils.trim(tiddlerFields.title);\n\t\tvar title = tiddlerFields.title;\n\t\tif(title) {\n\t\t\tincomingTiddlers.push(title);\n\t\t\timportData.tiddlers[title] = tiddlerFields;\n\t\t}\n\t});\n\t// Give the active upgrader modules a chance to process the incoming tiddlers\n\tvar messages = this.wiki.invokeUpgraders(incomingTiddlers,importData.tiddlers);\n\t$tw.utils.each(messages,function(message,title) {\n\t\tnewFields[\"message-\" + title] = message;\n\t});\n\t// Deselect any suppressed tiddlers\n\t$tw.utils.each(importData.tiddlers,function(tiddler,title) {\n\t\tif($tw.utils.count(tiddler) === 0) {\n\t\t\tnewFields[\"selection-\" + title] = \"unchecked\";\n\t\t\tnewFields[\"suppressed-\" + title] = \"yes\";\n\t\t}\n\t});\n\t// Save the $:/Import tiddler\n\tnewFields.text = JSON.stringify(importData,null,$tw.config.preferences.jsonSpaces);\n\tthis.wiki.addTiddler(new $tw.Tiddler(importTiddler,newFields));\n\t// Update the story and history details\n\tvar autoOpenOnImport = event.autoOpenOnImport ? event.autoOpenOnImport : this.getVariable(\"tv-auto-open-on-import\"); \n\tif(autoOpenOnImport !== \"no\") {\n\t\tvar storyList = this.getStoryList(),\n\t\t\thistory = [];\n\t\t// Add it to the story\n\t\tif(storyList && storyList.indexOf(importTitle) === -1) {\n\t\t\tstoryList.unshift(importTitle);\n\t\t}\n\t\t// And to history\n\t\thistory.push(importTitle);\n\t\t// Save the updated story and history\n\t\tthis.saveStoryList(storyList);\n\t\tthis.addToHistory(history);\n\t}\n\treturn false;\n};\n\n//\nNavigatorWidget.prototype.handlePerformImportEvent = function(event) {\n\tvar self = this,\n\t\timportTiddler = this.wiki.getTiddler(event.param),\n\t\timportData = this.wiki.getTiddlerDataCached(event.param,{tiddlers: {}}),\n\t\timportReport = [];\n\t// Add the tiddlers to the store\n\timportReport.push($tw.language.getString(\"Import/Imported/Hint\") + \"\\n\");\n\t$tw.utils.each(importData.tiddlers,function(tiddlerFields) {\n\t\tvar title = tiddlerFields.title;\n\t\tif(title && importTiddler && importTiddler.fields[\"selection-\" + title] !== \"unchecked\") {\n\t\t\tif($tw.utils.hop(importTiddler.fields,[\"rename-\" + title])) {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields,{title : importTiddler.fields[\"rename-\" + title]});\n\t\t\t} else {\n\t\t\t\tvar tiddler = new $tw.Tiddler(tiddlerFields);\n\t\t\t}\n\t\t\ttiddler = $tw.hooks.invokeHook(\"th-importing-tiddler\",tiddler);\n\t\t\tself.wiki.addTiddler(tiddler);\n\t\t\timportReport.push(\"# [[\" + tiddler.fields.title + \"]]\");\n\t\t}\n\t});\n\t// Replace the $:/Import tiddler with an import report\n\tthis.wiki.addTiddler(new $tw.Tiddler({\n\t\ttitle: event.param,\n\t\ttext: importReport.join(\"\\n\"),\n\t\t\"status\": \"complete\"\n\t}));\n\t// Navigate to the $:/Import tiddler\n\tthis.addToHistory([event.param]);\n\t// Trigger an autosave\n\t$tw.rootWidget.dispatchEvent({type: \"tm-auto-save-wiki\"});\n};\n\nNavigatorWidget.prototype.handleFoldTiddlerEvent = function(event) {\n\tvar paramObject = event.paramObject || {};\n\tif(paramObject.foldedState) {\n\t\tvar foldedState = this.wiki.getTiddlerText(paramObject.foldedState,\"show\") === \"show\" ? \"hide\" : \"show\";\n\t\tthis.wiki.setText(paramObject.foldedState,\"text\",null,foldedState);\n\t}\n};\n\nNavigatorWidget.prototype.handleFoldOtherTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,event.param === title ? \"show\" : \"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleFoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix || \"$:/state/folded/\";\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"hide\");\n\t});\n};\n\nNavigatorWidget.prototype.handleUnfoldAllTiddlersEvent = function(event) {\n\tvar self = this,\n\t\tparamObject = event.paramObject || {},\n\t\tprefix = paramObject.foldedStatePrefix;\n\t$tw.utils.each(this.getStoryList(),function(title) {\n\t\tself.wiki.setText(prefix + title,\"text\",null,\"show\");\n\t});\n};\n\nNavigatorWidget.prototype.handleRenameTiddlerEvent = function(event) {\n\tvar options = {},\n\t\tparamObject = event.paramObject || {},\n\t\tfrom = paramObject.from || event.tiddlerTitle,\n\t\tto = paramObject.to;\n\toptions.dontRenameInTags = (paramObject.renameInTags === \"false\" || paramObject.renameInTags === \"no\") ? true : false;\n\toptions.dontRenameInLists = (paramObject.renameInLists === \"false\" || paramObject.renameInLists === \"no\") ? true : false;\n\tthis.wiki.renameTiddler(from,to,options);\n};\n\nexports.navigator = NavigatorWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/password.js": {
"title": "$:/core/modules/widgets/password.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/password.js\ntype: application/javascript\nmodule-type: widget\n\nPassword widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar PasswordWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nPasswordWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nPasswordWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Get the current password\n\tvar password = $tw.browser ? $tw.utils.getPassword(this.passwordName) || \"\" : \"\";\n\t// Create our element\n\tvar domNode = this.document.createElement(\"input\");\n\tdomNode.setAttribute(\"type\",\"password\");\n\tdomNode.setAttribute(\"value\",password);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(domNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tthis.domNodes.push(domNode);\n};\n\nPasswordWidget.prototype.handleChangeEvent = function(event) {\n\tvar password = this.domNodes[0].value;\n\treturn $tw.utils.savePassword(this.passwordName,password);\n};\n\n/*\nCompute the internal state of the widget\n*/\nPasswordWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.passwordName = this.getAttribute(\"name\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nPasswordWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.password = PasswordWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/qualify.js": {
"title": "$:/core/modules/widgets/qualify.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/qualify.js\ntype: application/javascript\nmodule-type: widget\n\nQualify text to a variable \n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar QualifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nQualifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nQualifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nQualifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.qualifyName = this.getAttribute(\"name\");\n\tthis.qualifyTitle = this.getAttribute(\"title\");\n\t// Set context variable\n\tif(this.qualifyName) {\n\t\tthis.setVariable(this.qualifyName,this.qualifyTitle + \"-\" + this.getStateQualifier());\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nQualifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.title) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.qualify = QualifyWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/radio.js": {
"title": "$:/core/modules/widgets/radio.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/radio.js\ntype: application/javascript\nmodule-type: widget\n\nSet a field or index at a given tiddler via radio buttons\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\nvar RadioWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRadioWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRadioWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\tvar isChecked = this.getValue() === this.radioValue;\n\t// Create our elements\n\tthis.labelDomNode = this.document.createElement(\"label\");\n\tthis.labelDomNode.setAttribute(\"class\",\n\t\t\"tc-radio \" + this.radioClass + (isChecked ? \" tc-radio-selected\" : \"\")\n\t);\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"radio\");\n\tif(isChecked) {\n\t\tthis.inputDomNode.setAttribute(\"checked\",\"true\");\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.labelDomNode.appendChild(this.inputDomNode);\n\tthis.spanDomNode = this.document.createElement(\"span\");\n\tthis.labelDomNode.appendChild(this.spanDomNode);\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.labelDomNode,nextSibling);\n\tthis.renderChildren(this.spanDomNode,null);\n\tthis.domNodes.push(this.labelDomNode);\n};\n\nRadioWidget.prototype.getValue = function() {\n\tvar value,\n\t\ttiddler = this.wiki.getTiddler(this.radioTitle);\n\tif (this.radioIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.radioTitle,this.radioIndex);\n\t} else {\n\t\tvalue = tiddler && tiddler.getFieldString(this.radioField);\n\t}\n\treturn value;\n};\n\nRadioWidget.prototype.setValue = function() {\n\tif(this.radioIndex) {\n\t\tthis.wiki.setText(this.radioTitle,\"\",this.radioIndex,this.radioValue);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.radioTitle),\n\t\t\taddition = {};\n\t\taddition[this.radioField] = this.radioValue;\n\t\tthis.wiki.addTiddler(new $tw.Tiddler(this.wiki.getCreationFields(),{title: this.radioTitle},tiddler,addition,this.wiki.getModificationFields()));\n\t}\n};\n\nRadioWidget.prototype.handleChangeEvent = function(event) {\n\tif(this.inputDomNode.checked) {\n\t\tthis.setValue();\n\t}\n\t// Trigger actions\n\tif(this.radioActions) {\n\t\tthis.invokeActionString(this.radioActions,this,event,{\"actionValue\": this.radioValue});\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRadioWidget.prototype.execute = function() {\n\t// Get the parameters from the attributes\n\tthis.radioTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.radioField = this.getAttribute(\"field\",\"text\");\n\tthis.radioIndex = this.getAttribute(\"index\");\n\tthis.radioValue = this.getAttribute(\"value\");\n\tthis.radioClass = this.getAttribute(\"class\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\tthis.radioActions = this.getAttribute(\"actions\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRadioWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(($tw.utils.count(changedAttributes) > 0) || changedTiddlers[this.radioTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.radio = RadioWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/range.js": {
"title": "$:/core/modules/widgets/range.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/range.js\ntype: application/javascript\nmodule-type: widget\n\nRange widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RangeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRangeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRangeWidget.prototype.render = function(parent,nextSibling) {\n\t// Save the parent dom node\n\tthis.parentDomNode = parent;\n\t// Compute our attributes\n\tthis.computeAttributes();\n\t// Execute our logic\n\tthis.execute();\n\t// Create our elements\n\tthis.inputDomNode = this.document.createElement(\"input\");\n\tthis.inputDomNode.setAttribute(\"type\",\"range\");\n\tthis.inputDomNode.setAttribute(\"class\",this.elementClass);\n\tif(this.minValue){\n\t\tthis.inputDomNode.setAttribute(\"min\", this.minValue);\n\t}\n\tif(this.maxValue){\n\t\tthis.inputDomNode.setAttribute(\"max\", this.maxValue);\n\t}\n\tif(this.increment){\n\t\tthis.inputDomNode.setAttribute(\"step\", this.increment);\n\t}\n\tif(this.isDisabled === \"yes\") {\n\t\tthis.inputDomNode.setAttribute(\"disabled\",true);\n\t}\n\tthis.inputDomNode.value = this.getValue();\n\t// Add a click event handler\n\t$tw.utils.addEventListeners(this.inputDomNode,[\n\t\t{name:\"mousedown\", handlerObject:this, handlerMethod:\"handleMouseDownEvent\"},\n\t\t{name:\"mouseup\", handlerObject:this, handlerMethod:\"handleMouseUpEvent\"},\n\t\t{name:\"change\", handlerObject:this, handlerMethod:\"handleChangeEvent\"},\n\t\t{name:\"input\", handlerObject:this, handlerMethod:\"handleInputEvent\"},\n\t]);\n\t// Insert the label into the DOM and render any children\n\tparent.insertBefore(this.inputDomNode,nextSibling);\n\tthis.domNodes.push(this.inputDomNode);\n};\n\nRangeWidget.prototype.getValue = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle),\n\t\tfieldName = this.tiddlerField,\n\t\tvalue = this.defaultValue;\n\tif(tiddler) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(tiddler,this.tiddlerIndex,this.defaultValue);\n\t\t} else {\n\t\t\tif($tw.utils.hop(tiddler.fields,fieldName)) {\n\t\t\t\tvalue = tiddler.fields[fieldName] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = this.defaultValue;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nRangeWidget.prototype.getActionVariables = function(options) {\n\toptions = options || {};\n\tvar hasChanged = (this.startValue !== this.inputDomNode.value) ? \"yes\" : \"no\";\n\t// Trigger actions. Use variables = {key:value, key:value ...}\n\t// the \"value\" is needed.\n\treturn $tw.utils.extend({\"actionValue\": this.inputDomNode.value, \"actionValueHasChanged\": hasChanged}, options);\n}\n\n// actionsStart\nRangeWidget.prototype.handleMouseDownEvent = function(event) {\n\tthis.mouseDown = true; // TODO remove once IE is gone.\n\tthis.startValue = this.inputDomNode.value; // TODO remove this line once IE is gone!\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseDown) {\n\t\tvar variables = this.getActionVariables() // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsMouseDown,this,event,variables);\n\t}\n}\n\n// actionsStop\nRangeWidget.prototype.handleMouseUpEvent = function(event) {\n\tthis.mouseDown = false; // TODO remove once IE is gone.\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsMouseUp) {\n\t\tvar variables = this.getActionVariables()\n\t\tthis.invokeActionString(this.actionsMouseUp,this,event,variables);\n\t}\n\t// TODO remove the following if() once IE is gone!\n\tif ($tw.browser.isIE) {\n\t\tif (this.startValue !== this.inputDomNode.value) {\n\t\t\tthis.handleChangeEvent(event);\n\t\t\tthis.startValue = this.inputDomNode.value;\n\t\t}\n\t}\n}\n\nRangeWidget.prototype.handleChangeEvent = function(event) {\n\tif (this.mouseDown) { // TODO refactor this function once IE is gone.\n\t\tthis.handleInputEvent(event);\n\t}\n};\n\nRangeWidget.prototype.handleInputEvent = function(event) {\n\tthis.handleEvent(event);\n\t// Trigger actions\n\tif(this.actionsInput) {\n\t\t// \"tiddler\" parameter may be missing. See .execute() below\n\t\tvar variables = this.getActionVariables({\"actionValueHasChanged\": \"yes\"}) // TODO this line will go into the function call below.\n\t\tthis.invokeActionString(this.actionsInput,this,event,variables);\n\t}\n};\n\nRangeWidget.prototype.handleEvent = function(event) {\n\tif(this.getValue() !== this.inputDomNode.value) {\n\t\tif(this.tiddlerIndex) {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,\"\",this.tiddlerIndex,this.inputDomNode.value);\n\t\t} else {\n\t\t\tthis.wiki.setText(this.tiddlerTitle,this.tiddlerField,null,this.inputDomNode.value);\n\t\t}\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nRangeWidget.prototype.execute = function() {\n\t// TODO remove the next 1 lines once IE is gone!\n\tthis.mouseUp = true; // Needed for IE10\n\t// Get the parameters from the attributes\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.tiddlerField = this.getAttribute(\"field\",\"text\");\n\tthis.tiddlerIndex = this.getAttribute(\"index\");\n\tthis.minValue = this.getAttribute(\"min\");\n\tthis.maxValue = this.getAttribute(\"max\");\n\tthis.increment = this.getAttribute(\"increment\");\n\tthis.defaultValue = this.getAttribute(\"default\",\"\");\n\tthis.elementClass = this.getAttribute(\"class\",\"\");\n\tthis.isDisabled = this.getAttribute(\"disabled\",\"no\");\n\t// Actions since 5.1.23\n\t// Next 2 only fire once!\n\tthis.actionsMouseDown = this.getAttribute(\"actionsStart\",\"\");\n\tthis.actionsMouseUp = this.getAttribute(\"actionsStop\",\"\");\n\t// Input fires very often!\n\tthis.actionsInput = this.getAttribute(\"actions\",\"\");\n\t// Make the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRangeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif($tw.utils.count(changedAttributes) > 0) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar refreshed = false;\n\t\tif(changedTiddlers[this.tiddlerTitle]) {\n\t\t\tvar value = this.getValue();\n\t\t\tif(this.inputDomNode.value !== value) {\n\t\t\t\tthis.inputDomNode.value = value;\n\t\t\t}\n\t\t\trefreshed = true;\n\t\t}\n\t\treturn this.refreshChildren(changedTiddlers) || refreshed;\n\t}\n};\n\nexports.range = RangeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/raw.js": {
"title": "$:/core/modules/widgets/raw.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/raw.js\ntype: application/javascript\nmodule-type: widget\n\nRaw widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RawWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRawWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRawWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tvar div = this.document.createElement(\"div\");\n\tdiv.innerHTML=this.parseTreeNode.html;\n\tparent.insertBefore(div,nextSibling);\n\tthis.domNodes.push(div);\t\n};\n\n/*\nCompute the internal state of the widget\n*/\nRawWidget.prototype.execute = function() {\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRawWidget.prototype.refresh = function(changedTiddlers) {\n\treturn false;\n};\n\nexports.raw = RawWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/reveal.js": {
"title": "$:/core/modules/widgets/reveal.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/reveal.js\ntype: application/javascript\nmodule-type: widget\n\nReveal widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar RevealWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nRevealWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nRevealWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar tag = this.parseTreeNode.isBlock ? \"div\" : \"span\";\n\tif(this.revealTag && $tw.config.htmlUnsafeElements.indexOf(this.revealTag) === -1) {\n\t\ttag = this.revealTag;\n\t}\n\tvar domNode = this.document.createElement(tag);\n\tthis.domNode = domNode;\n\tthis.assignDomNodeClasses();\n\tif(this.style) {\n\t\tdomNode.setAttribute(\"style\",this.style);\n\t}\n\tparent.insertBefore(domNode,nextSibling);\n\tthis.renderChildren(domNode,null);\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\t}\n\tif(!this.isOpen) {\n\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t}\n\tthis.domNodes.push(domNode);\n};\n\nRevealWidget.prototype.positionPopup = function(domNode) {\n\tdomNode.style.position = \"absolute\";\n\tdomNode.style.zIndex = \"1000\";\n\tvar left,top;\n\tswitch(this.position) {\n\t\tcase \"left\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"above\":\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"aboveright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height - domNode.offsetHeight;\n\t\t\tbreak;\n\t\tcase \"belowright\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\t\t\t\n\t\tcase \"right\":\n\t\t\tleft = this.popup.left + this.popup.width;\n\t\t\ttop = this.popup.top;\n\t\t\tbreak;\n\t\tcase \"belowleft\":\n\t\t\tleft = this.popup.left + this.popup.width - domNode.offsetWidth;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t\tcase \"aboveleft\":\n\t\t\tleft = this.popup.left - domNode.offsetWidth;\n\t\t\ttop = this.popup.top - domNode.offsetHeight;\n\t\t\tbreak;\t\t\t\n\t\tdefault: // Below\n\t\t\tleft = this.popup.left;\n\t\t\ttop = this.popup.top + this.popup.height;\n\t\t\tbreak;\n\t}\n\tif(!this.positionAllowNegative) {\n\t\tleft = Math.max(0,left);\n\t\ttop = Math.max(0,top);\n\t}\n\tdomNode.style.left = left + \"px\";\n\tdomNode.style.top = top + \"px\";\n};\n\n/*\nCompute the internal state of the widget\n*/\nRevealWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.state = this.getAttribute(\"state\");\n\tthis.revealTag = this.getAttribute(\"tag\");\n\tthis.type = this.getAttribute(\"type\");\n\tthis.text = this.getAttribute(\"text\");\n\tthis.position = this.getAttribute(\"position\");\n\tthis.positionAllowNegative = this.getAttribute(\"positionAllowNegative\") === \"yes\";\n\t// class attribute handled in assignDomNodeClasses()\n\tthis.style = this.getAttribute(\"style\",\"\");\n\tthis[\"default\"] = this.getAttribute(\"default\",\"\");\n\tthis.animate = this.getAttribute(\"animate\",\"no\");\n\tthis.retain = this.getAttribute(\"retain\",\"no\");\n\tthis.openAnimation = this.animate === \"no\" ? undefined : \"open\";\n\tthis.closeAnimation = this.animate === \"no\" ? undefined : \"close\";\n\tthis.updatePopupPosition = this.getAttribute(\"updatePopupPosition\",\"no\") === \"yes\";\n\t// Compute the title of the state tiddler and read it\n\tthis.stateTiddlerTitle = this.state;\n\tthis.stateTitle = this.getAttribute(\"stateTitle\");\n\tthis.stateField = this.getAttribute(\"stateField\");\n\tthis.stateIndex = this.getAttribute(\"stateIndex\");\n\tthis.readState();\n\t// Construct the child widgets\n\tvar childNodes = this.isOpen ? this.parseTreeNode.children : [];\n\tthis.hasChildNodes = this.isOpen;\n\tthis.makeChildWidgets(childNodes);\n};\n\n/*\nRead the state tiddler\n*/\nRevealWidget.prototype.readState = function() {\n\t// Read the information from the state tiddler\n\tvar state,\n\t defaultState = this[\"default\"];\n\tif(this.stateTitle) {\n\t\tvar stateTitleTiddler = this.wiki.getTiddler(this.stateTitle);\n\t\tif(this.stateField) {\n\t\t\tstate = stateTitleTiddler ? stateTitleTiddler.getFieldString(this.stateField) || defaultState : defaultState;\n\t\t} else if(this.stateIndex) {\n\t\t\tstate = stateTitleTiddler ? this.wiki.extractTiddlerDataItem(this.stateTitle,this.stateIndex) || defaultState : defaultState;\n\t\t} else if(stateTitleTiddler) {\n\t\t\tstate = this.wiki.getTiddlerText(this.stateTitle) || defaultState;\n\t\t} else {\n\t\t\tstate = defaultState;\n\t\t}\n\t} else {\n\t\tstate = this.stateTiddlerTitle ? this.wiki.getTextReference(this.state,this[\"default\"],this.getVariable(\"currentTiddler\")) : this[\"default\"];\n\t}\n\tif(state === null) {\n\t\tstate = this[\"default\"];\n\t}\n\tswitch(this.type) {\n\t\tcase \"popup\":\n\t\t\tthis.readPopupState(state);\n\t\t\tbreak;\n\t\tcase \"match\":\n\t\t\tthis.isOpen = this.text === state;\n\t\t\tbreak;\n\t\tcase \"nomatch\":\n\t\t\tthis.isOpen = this.text !== state;\n\t\t\tbreak;\n\t\tcase \"lt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t\tcase \"gt\":\n\t\t\tthis.isOpen = !!(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"lteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) > 0);\n\t\t\tbreak;\n\t\tcase \"gteq\":\n\t\t\tthis.isOpen = !(this.compareStateText(state) < 0);\n\t\t\tbreak;\n\t}\n};\n\nRevealWidget.prototype.compareStateText = function(state) {\n\treturn state.localeCompare(this.text,undefined,{numeric: true,sensitivity: \"case\"});\n};\n\nRevealWidget.prototype.readPopupState = function(state) {\n\tvar popupLocationRegExp = /^\\((-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+),(-?[0-9\\.E]+)\\)$/,\n\t\tmatch = popupLocationRegExp.exec(state);\n\t// Check if the state matches the location regexp\n\tif(match) {\n\t\t// If so, we're open\n\t\tthis.isOpen = true;\n\t\t// Get the location\n\t\tthis.popup = {\n\t\t\tleft: parseFloat(match[1]),\n\t\t\ttop: parseFloat(match[2]),\n\t\t\twidth: parseFloat(match[3]),\n\t\t\theight: parseFloat(match[4])\n\t\t};\n\t} else {\n\t\t// If not, we're closed\n\t\tthis.isOpen = false;\n\t}\n};\n\nRevealWidget.prototype.assignDomNodeClasses = function() {\n\tvar classes = this.getAttribute(\"class\",\"\").split(\" \");\n\tclasses.push(\"tc-reveal\");\n\tthis.domNode.className = classes.join(\" \");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nRevealWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.state || changedAttributes.type || changedAttributes.text || changedAttributes.position || changedAttributes.positionAllowNegative || changedAttributes[\"default\"] || changedAttributes.animate || changedAttributes.stateTitle || changedAttributes.stateField || changedAttributes.stateIndex) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\tvar currentlyOpen = this.isOpen;\n\t\tthis.readState();\n\t\tif(this.isOpen !== currentlyOpen) {\n\t\t\tif(this.retain === \"yes\") {\n\t\t\t\tthis.updateState();\n\t\t\t} else {\n\t\t\t\tthis.refreshSelf();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} else if(this.type === \"popup\" && this.updatePopupPosition && (changedTiddlers[this.state] || changedTiddlers[this.stateTitle])) {\n\t\t\tthis.positionPopup(this.domNode);\n\t\t}\n\t\tif(changedAttributes.style) {\n\t\t\tthis.domNode.style = this.getAttribute(\"style\",\"\");\n\t\t}\n\t\tif(changedAttributes[\"class\"]) {\n\t\t\tthis.assignDomNodeClasses();\n\t\t}\t\t\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\n/*\nCalled by refresh() to dynamically show or hide the content\n*/\nRevealWidget.prototype.updateState = function() {\n\tvar self = this;\n\t// Read the current state\n\tthis.readState();\n\t// Construct the child nodes if needed\n\tvar domNode = this.domNodes[0];\n\tif(this.isOpen && !this.hasChildNodes) {\n\t\tthis.hasChildNodes = true;\n\t\tthis.makeChildWidgets(this.parseTreeNode.children);\n\t\tthis.renderChildren(domNode,null);\n\t}\n\t// Animate our DOM node\n\tif(!domNode.isTiddlyWikiFakeDom && this.type === \"popup\" && this.isOpen) {\n\t\tthis.positionPopup(domNode);\n\t\t$tw.utils.addClass(domNode,\"tc-popup\"); // Make sure that clicks don't dismiss popups within the revealed content\n\n\t}\n\tif(this.isOpen) {\n\t\tdomNode.removeAttribute(\"hidden\");\n $tw.anim.perform(this.openAnimation,domNode);\n\t} else {\n\t\t$tw.anim.perform(this.closeAnimation,domNode,{callback: function() {\n\t\t\t//make sure that the state hasn't changed during the close animation\n\t\t\tself.readState()\n\t\t\tif(!self.isOpen) {\n\t\t\t\tdomNode.setAttribute(\"hidden\",\"true\");\n\t\t\t}\n\t\t}});\n\t}\n};\n\nexports.reveal = RevealWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/scrollable.js": {
"title": "$:/core/modules/widgets/scrollable.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/scrollable.js\ntype: application/javascript\nmodule-type: widget\n\nScrollable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ScrollableWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n\tthis.scaleFactor = 1;\n\tthis.addEventListeners([\n\t\t{type: \"tm-scroll\", handler: \"handleScrollEvent\"}\n\t]);\n\tif($tw.browser) {\n\t\tthis.requestAnimationFrame = window.requestAnimationFrame ||\n\t\t\twindow.webkitRequestAnimationFrame ||\n\t\t\twindow.mozRequestAnimationFrame ||\n\t\t\tfunction(callback) {\n\t\t\t\treturn window.setTimeout(callback, 1000/60);\n\t\t\t};\n\t\tthis.cancelAnimationFrame = window.cancelAnimationFrame ||\n\t\t\twindow.webkitCancelAnimationFrame ||\n\t\t\twindow.webkitCancelRequestAnimationFrame ||\n\t\t\twindow.mozCancelAnimationFrame ||\n\t\t\twindow.mozCancelRequestAnimationFrame ||\n\t\t\tfunction(id) {\n\t\t\t\twindow.clearTimeout(id);\n\t\t\t};\n\t}\n};\n\n/*\nInherit from the base widget class\n*/\nScrollableWidget.prototype = new Widget();\n\nScrollableWidget.prototype.cancelScroll = function() {\n\tif(this.idRequestFrame) {\n\t\tthis.cancelAnimationFrame.call(window,this.idRequestFrame);\n\t\tthis.idRequestFrame = null;\n\t}\n};\n\n/*\nHandle a scroll event\n*/\nScrollableWidget.prototype.handleScrollEvent = function(event) {\n\t// Pass the scroll event through if our offsetsize is larger than our scrollsize\n\tif(this.outerDomNode.scrollWidth <= this.outerDomNode.offsetWidth && this.outerDomNode.scrollHeight <= this.outerDomNode.offsetHeight && this.fallthrough === \"yes\") {\n\t\treturn true;\n\t}\n\tif(event.paramObject && event.paramObject.selector) {\n\t\tthis.scrollSelectorIntoView(null,event.paramObject.selector);\n\t} else {\n\t\tthis.scrollIntoView(event.target);\t\t\t\n\t}\n\treturn false; // Handled event\n};\n\n/*\nScroll an element into view\n*/\nScrollableWidget.prototype.scrollIntoView = function(element) {\n\tvar duration = $tw.utils.getAnimationDuration(),\n\tsrcWindow = element ? element.ownerDocument.defaultView : window;\n\tthis.cancelScroll();\n\tthis.startTime = Date.now();\n\tvar scrollPosition = {\n\t\tx: this.outerDomNode.scrollLeft,\n\t\ty: this.outerDomNode.scrollTop\n\t};\n\t// Get the client bounds of the element and adjust by the scroll position\n\tvar scrollableBounds = this.outerDomNode.getBoundingClientRect(),\n\t\tclientTargetBounds = element.getBoundingClientRect(),\n\t\tbounds = {\n\t\t\tleft: clientTargetBounds.left + scrollPosition.x - scrollableBounds.left,\n\t\t\ttop: clientTargetBounds.top + scrollPosition.y - scrollableBounds.top,\n\t\t\twidth: clientTargetBounds.width,\n\t\t\theight: clientTargetBounds.height\n\t\t};\n\t// We'll consider the horizontal and vertical scroll directions separately via this function\n\tvar getEndPos = function(targetPos,targetSize,currentPos,currentSize) {\n\t\t\t// If the target is already visible then stay where we are\n\t\t\tif(targetPos >= currentPos && (targetPos + targetSize) <= (currentPos + currentSize)) {\n\t\t\t\treturn currentPos;\n\t\t\t// If the target is above/left of the current view, then scroll to its top/left\n\t\t\t} else if(targetPos <= currentPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// If the target is smaller than the window and the scroll position is too far up, then scroll till the target is at the bottom of the window\n\t\t\t} else if(targetSize < currentSize && currentPos < (targetPos + targetSize - currentSize)) {\n\t\t\t\treturn targetPos + targetSize - currentSize;\n\t\t\t// If the target is big, then just scroll to the top\n\t\t\t} else if(currentPos < targetPos) {\n\t\t\t\treturn targetPos;\n\t\t\t// Otherwise, stay where we are\n\t\t\t} else {\n\t\t\t\treturn currentPos;\n\t\t\t}\n\t\t},\n\t\tendX = getEndPos(bounds.left,bounds.width,scrollPosition.x,this.outerDomNode.offsetWidth),\n\t\tendY = getEndPos(bounds.top,bounds.height,scrollPosition.y,this.outerDomNode.offsetHeight);\n\t// Only scroll if necessary\n\tif(endX !== scrollPosition.x || endY !== scrollPosition.y) {\n\t\tvar self = this,\n\t\t\tdrawFrame;\n\t\tdrawFrame = function () {\n\t\t\tvar t;\n\t\t\tif(duration <= 0) {\n\t\t\t\tt = 1;\n\t\t\t} else {\n\t\t\t\tt = ((Date.now()) - self.startTime) / duration;\t\n\t\t\t}\n\t\t\tif(t >= 1) {\n\t\t\t\tself.cancelScroll();\n\t\t\t\tt = 1;\n\t\t\t}\n\t\t\tt = $tw.utils.slowInSlowOut(t);\n\t\t\tself.outerDomNode.scrollLeft = scrollPosition.x + (endX - scrollPosition.x) * t;\n\t\t\tself.outerDomNode.scrollTop = scrollPosition.y + (endY - scrollPosition.y) * t;\n\t\t\tif(t < 1) {\n\t\t\t\tself.idRequestFrame = self.requestAnimationFrame.call(srcWindow,drawFrame);\n\t\t\t}\n\t\t};\n\t\tdrawFrame();\n\t}\n};\n\nScrollableWidget.prototype.scrollSelectorIntoView = function(baseElement,selector,callback) {\n\tbaseElement = baseElement || document.body;\n\tvar element = baseElement.querySelector(selector);\n\tif(element) {\n\t\tthis.scrollIntoView(element,callback);\t\t\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nScrollableWidget.prototype.render = function(parent,nextSibling) {\n\tvar self = this;\n\t// Remember parent\n\tthis.parentDomNode = parent;\n\t// Compute attributes and execute state\n\tthis.computeAttributes();\n\tthis.execute();\n\t// Create elements\n\tthis.outerDomNode = this.document.createElement(\"div\");\n\t$tw.utils.setStyle(this.outerDomNode,[\n\t\t{overflowY: \"auto\"},\n\t\t{overflowX: \"auto\"},\n\t\t{webkitOverflowScrolling: \"touch\"}\n\t]);\n\tthis.innerDomNode = this.document.createElement(\"div\");\n\tthis.outerDomNode.appendChild(this.innerDomNode);\n\t// Assign classes\n\tthis.outerDomNode.className = this[\"class\"] || \"\";\n\t// Insert element\n\tparent.insertBefore(this.outerDomNode,nextSibling);\n\tthis.renderChildren(this.innerDomNode,null);\n\tthis.domNodes.push(this.outerDomNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nScrollableWidget.prototype.execute = function() {\n\t// Get attributes\n\tthis.fallthrough = this.getAttribute(\"fallthrough\",\"yes\");\n\tthis[\"class\"] = this.getAttribute(\"class\");\n\t// Make child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nScrollableWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes[\"class\"]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports.scrollable = ScrollableWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/select.js": {
"title": "$:/core/modules/widgets/select.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/select.js\ntype: application/javascript\nmodule-type: widget\n\nSelect widget:\n\n```\n<$select tiddler=\"MyTiddler\" field=\"text\">\n<$list filter=\"[tag[chapter]]\">\n<option value=<<currentTiddler>>>\n<$view field=\"description\"/>\n</option>\n</$list>\n</$select>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SelectWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSelectWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSelectWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n\tthis.setSelectValue();\n\t$tw.utils.addEventListeners(this.getSelectDomNode(),[\n\t\t{name: \"change\", handlerObject: this, handlerMethod: \"handleChangeEvent\"}\n\t]);\n};\n\n/*\nHandle a change event\n*/\nSelectWidget.prototype.handleChangeEvent = function(event) {\n\t// Get the new value and assign it to the tiddler\n\tif(this.selectMultiple == false) {\n\t\tvar value = this.getSelectDomNode().value;\n\t} else {\n\t\tvar value = this.getSelectValues()\n\t\t\t\tvalue = $tw.utils.stringifyList(value);\n\t}\n\tthis.wiki.setText(this.selectTitle,this.selectField,this.selectIndex,value);\n\t// Trigger actions\n\tif(this.selectActions) {\n\t\tthis.invokeActionString(this.selectActions,this,event);\n\t}\n};\n\n/*\nIf necessary, set the value of the select element to the current value\n*/\nSelectWidget.prototype.setSelectValue = function() {\n\tvar value = this.selectDefault;\n\t// Get the value\n\tif(this.selectIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.selectTitle,this.selectIndex,value);\n\t} else {\n\t\tvar tiddler = this.wiki.getTiddler(this.selectTitle);\n\t\tif(tiddler) {\n\t\t\tif(this.selectField === \"text\") {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.selectTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.selectField)) {\n\t\t\t\t\tvalue = tiddler.getFieldString(this.selectField);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.selectField === \"title\") {\n\t\t\t\tvalue = this.selectTitle;\n\t\t\t}\n\t\t}\n\t}\n\t// Assign it to the select element if it's different than the current value\n\tif (this.selectMultiple) {\n\t\tvalue = value === undefined ? \"\" : value;\n\t\tvar select = this.getSelectDomNode();\n\t\tvar values = Array.isArray(value) ? value : $tw.utils.parseStringArray(value);\n\t\tfor(var i=0; i < select.children.length; i++){\n\t\t\tselect.children[i].selected = values.indexOf(select.children[i].value) !== -1\n\t\t}\n\t} else {\n\t\tvar domNode = this.getSelectDomNode();\n\t\tif(domNode.value !== value) {\n\t\t\tdomNode.value = value;\n\t\t}\n\t}\n};\n\n/*\nGet the DOM node of the select element\n*/\nSelectWidget.prototype.getSelectDomNode = function() {\n\treturn this.children[0].domNodes[0];\n};\n\n// Return an array of the selected opion values\n// select is an HTML select element\nSelectWidget.prototype.getSelectValues = function() {\n\tvar select, result, options, opt;\n\tselect = this.getSelectDomNode();\n\tresult = [];\n\toptions = select && select.options;\n\tfor (var i=0; i<options.length; i++) {\n\t\topt = options[i];\n\t\tif (opt.selected) {\n\t\t\tresult.push(opt.value || opt.text);\n\t\t}\n\t}\n\treturn result;\n}\n\n/*\nCompute the internal state of the widget\n*/\nSelectWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.selectActions = this.getAttribute(\"actions\");\n\tthis.selectTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.selectField = this.getAttribute(\"field\",\"text\");\n\tthis.selectIndex = this.getAttribute(\"index\");\n\tthis.selectClass = this.getAttribute(\"class\");\n\tthis.selectDefault = this.getAttribute(\"default\");\n\tthis.selectMultiple = this.getAttribute(\"multiple\", false);\n\tthis.selectSize = this.getAttribute(\"size\");\n\tthis.selectTooltip = this.getAttribute(\"tooltip\");\n\t// Make the child widgets\n\tvar selectNode = {\n\t\ttype: \"element\",\n\t\ttag: \"select\",\n\t\tchildren: this.parseTreeNode.children\n\t};\n\tif(this.selectClass) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"class\",this.selectClass);\n\t}\n\tif(this.selectMultiple) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"multiple\",\"multiple\");\n\t}\n\tif(this.selectSize) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"size\",this.selectSize);\n\t}\n\tif(this.selectTooltip) {\n\t\t$tw.utils.addAttributeToParseTreeNode(selectNode,\"title\",this.selectTooltip);\n\t}\n\tthis.makeChildWidgets([selectNode]);\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSelectWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// If we're using a different tiddler/field/index then completely refresh ourselves\n\tif(changedAttributes.selectTitle || changedAttributes.selectField || changedAttributes.selectIndex || changedAttributes.selectTooltip) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t// If the target tiddler value has changed, just update setting and refresh the children\n\t} else {\n\t\tvar childrenRefreshed = this.refreshChildren(changedTiddlers);\n\t\tif(changedTiddlers[this.selectTitle] || childrenRefreshed) {\n\t\t\tthis.setSelectValue();\n\t\t} \n\t\treturn childrenRefreshed;\n\t}\n};\n\nexports.select = SelectWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/set.js": {
"title": "$:/core/modules/widgets/set.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/set.js\ntype: application/javascript\nmodule-type: widget\n\nSet variable widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar SetWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nSetWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nSetWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nSetWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.setName = this.getAttribute(\"name\",\"currentTiddler\");\n\tthis.setFilter = this.getAttribute(\"filter\");\n\tthis.setSelect = this.getAttribute(\"select\");\n\tthis.setTiddler = this.getAttribute(\"tiddler\");\n\tthis.setSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.setField = this.getAttribute(\"field\");\n\tthis.setIndex = this.getAttribute(\"index\");\n\tthis.setValue = this.getAttribute(\"value\");\n\tthis.setEmptyValue = this.getAttribute(\"emptyValue\");\n\t// Set context variable\n\tthis.setVariable(this.setName,this.getValue(),this.parseTreeNode.params,!!this.parseTreeNode.isMacroDefinition);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nGet the value to be assigned\n*/\nSetWidget.prototype.getValue = function() {\n\tvar value = this.setValue;\n\tif(this.setTiddler) {\n\t\tvar tiddler;\n\t\tif(this.setSubTiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.setTiddler,this.setSubTiddler);\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.setTiddler);\t\t\t\n\t\t}\n\t\tif(!tiddler) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t} else if(this.setField) {\n\t\t\tvalue = tiddler.getFieldString(this.setField) || this.setEmptyValue;\n\t\t} else if(this.setIndex) {\n\t\t\tvalue = this.wiki.extractTiddlerDataItem(this.setTiddler,this.setIndex,this.setEmptyValue);\n\t\t} else {\n\t\t\tvalue = tiddler.fields.text || this.setEmptyValue ;\n\t\t}\n\t} else if(this.setFilter) {\n\t\tvar results = this.wiki.filterTiddlers(this.setFilter,this);\n\t\tif(this.setValue == null) {\n\t\t\tvar select;\n\t\t\tif(this.setSelect) {\n\t\t\t\tselect = parseInt(this.setSelect,10);\n\t\t\t}\n\t\t\tif(select !== undefined) {\n\t\t\t\tvalue = results[select] || \"\";\n\t\t\t} else {\n\t\t\t\tvalue = $tw.utils.stringifyList(results);\t\t\t\n\t\t\t}\n\t\t}\n\t\tif(results.length === 0 && this.setEmptyValue !== undefined) {\n\t\t\tvalue = this.setEmptyValue;\n\t\t}\n\t} else if(!value && this.setEmptyValue) {\n\t\tvalue = this.setEmptyValue;\n\t}\n\treturn value || \"\";\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nSetWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.name || changedAttributes.filter || changedAttributes.select || changedAttributes.tiddler || (this.setTiddler && changedTiddlers[this.setTiddler]) || changedAttributes.field || changedAttributes.index || changedAttributes.value || changedAttributes.emptyValue ||\n\t (this.setFilter && this.getValue() != this.variables[this.setName].value)) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.setvariable = SetWidget;\nexports.set = SetWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/text.js": {
"title": "$:/core/modules/widgets/text.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/text.js\ntype: application/javascript\nmodule-type: widget\n\nText node widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TextNodeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTextNodeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTextNodeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tvar text = this.getAttribute(\"text\",this.parseTreeNode.text || \"\");\n\ttext = text.replace(/\\r/mg,\"\");\n\tvar textNode = this.document.createTextNode(text);\n\tparent.insertBefore(textNode,nextSibling);\n\tthis.domNodes.push(textNode);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTextNodeWidget.prototype.execute = function() {\n\t// Nothing to do for a text node\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTextNodeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.text) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.text = TextNodeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/tiddler.js": {
"title": "$:/core/modules/widgets/tiddler.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/tiddler.js\ntype: application/javascript\nmodule-type: widget\n\nTiddler widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TiddlerWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTiddlerWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTiddlerWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTiddlerWidget.prototype.execute = function() {\n\tthis.tiddlerState = this.computeTiddlerState();\n\tthis.setVariable(\"currentTiddler\",this.tiddlerState.currentTiddler);\n\tthis.setVariable(\"missingTiddlerClass\",this.tiddlerState.missingTiddlerClass);\n\tthis.setVariable(\"shadowTiddlerClass\",this.tiddlerState.shadowTiddlerClass);\n\tthis.setVariable(\"systemTiddlerClass\",this.tiddlerState.systemTiddlerClass);\n\tthis.setVariable(\"tiddlerTagClasses\",this.tiddlerState.tiddlerTagClasses);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nCompute the tiddler state flags\n*/\nTiddlerWidget.prototype.computeTiddlerState = function() {\n\t// Get our parameters\n\tthis.tiddlerTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\t// Compute the state\n\tvar state = {\n\t\tcurrentTiddler: this.tiddlerTitle || \"\",\n\t\tmissingTiddlerClass: (this.wiki.tiddlerExists(this.tiddlerTitle) || this.wiki.isShadowTiddler(this.tiddlerTitle)) ? \"tc-tiddler-exists\" : \"tc-tiddler-missing\",\n\t\tshadowTiddlerClass: this.wiki.isShadowTiddler(this.tiddlerTitle) ? \"tc-tiddler-shadow\" : \"\",\n\t\tsystemTiddlerClass: this.wiki.isSystemTiddler(this.tiddlerTitle) ? \"tc-tiddler-system\" : \"\",\n\t\ttiddlerTagClasses: this.getTagClasses()\n\t};\n\t// Compute a simple hash to make it easier to detect changes\n\tstate.hash = state.currentTiddler + state.missingTiddlerClass + state.shadowTiddlerClass + state.systemTiddlerClass + state.tiddlerTagClasses;\n\treturn state;\n};\n\n/*\nCreate a string of CSS classes derived from the tags of the current tiddler\n*/\nTiddlerWidget.prototype.getTagClasses = function() {\n\tvar tiddler = this.wiki.getTiddler(this.tiddlerTitle);\n\tif(tiddler) {\n\t\tvar tags = [];\n\t\t$tw.utils.each(tiddler.fields.tags,function(tag) {\n\t\t\ttags.push(\"tc-tagged-\" + encodeURIComponent(tag));\n\t\t});\n\t\treturn tags.join(\" \");\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTiddlerWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes(),\n\t\tnewTiddlerState = this.computeTiddlerState();\n\tif(changedAttributes.tiddler || newTiddlerState.hash !== this.tiddlerState.hash) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.tiddler = TiddlerWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/transclude.js": {
"title": "$:/core/modules/widgets/transclude.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/transclude.js\ntype: application/javascript\nmodule-type: widget\n\nTransclude widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar TranscludeWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nTranscludeWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nTranscludeWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nTranscludeWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.transcludeTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.transcludeSubTiddler = this.getAttribute(\"subtiddler\");\n\tthis.transcludeField = this.getAttribute(\"field\");\n\tthis.transcludeIndex = this.getAttribute(\"index\");\n\tthis.transcludeMode = this.getAttribute(\"mode\");\n\tthis.recursionMarker = this.getAttribute(\"recursionMarker\",\"yes\");\n\t// Parse the text reference\n\tvar parseAsInline = !this.parseTreeNode.isBlock;\n\tif(this.transcludeMode === \"inline\") {\n\t\tparseAsInline = true;\n\t} else if(this.transcludeMode === \"block\") {\n\t\tparseAsInline = false;\n\t}\n\tvar parser = this.wiki.parseTextReference(\n\t\t\t\t\t\tthis.transcludeTitle,\n\t\t\t\t\t\tthis.transcludeField,\n\t\t\t\t\t\tthis.transcludeIndex,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tparseAsInline: parseAsInline,\n\t\t\t\t\t\t\tsubTiddler: this.transcludeSubTiddler\n\t\t\t\t\t\t}),\n\t\tparseTreeNodes = parser ? parser.tree : this.parseTreeNode.children;\n\t// Set context variables for recursion detection\n\tvar recursionMarker = this.makeRecursionMarker();\n\tif(this.recursionMarker === \"yes\") {\n\t\tthis.setVariable(\"transclusion\",recursionMarker);\n\t}\n\t// Check for recursion\n\tif(parser) {\n\t\tif(this.parentWidget && this.parentWidget.hasVariable(\"transclusion\",recursionMarker)) {\n\t\t\tparseTreeNodes = [{type: \"element\", tag: \"span\", attributes: {\n\t\t\t\t\"class\": {type: \"string\", value: \"tc-error\"}\n\t\t\t}, children: [\n\t\t\t\t{type: \"text\", text: $tw.language.getString(\"Error/RecursiveTransclusion\")}\n\t\t\t]}];\n\t\t}\n\t}\n\t// Construct the child widgets\n\tthis.makeChildWidgets(parseTreeNodes);\n};\n\n/*\nCompose a string comprising the title, field and/or index to identify this transclusion for recursion detection\n*/\nTranscludeWidget.prototype.makeRecursionMarker = function() {\n\tvar output = [];\n\toutput.push(\"{\");\n\toutput.push(this.getVariable(\"currentTiddler\",{defaultValue: \"\"}));\n\toutput.push(\"|\");\n\toutput.push(this.transcludeTitle || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeField || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeIndex || \"\");\n\toutput.push(\"|\");\n\toutput.push(this.transcludeSubTiddler || \"\");\n\toutput.push(\"}\");\n\treturn output.join(\"\");\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nTranscludeWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedTiddlers[this.transcludeTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn this.refreshChildren(changedTiddlers);\t\t\n\t}\n};\n\nexports.transclude = TranscludeWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/vars.js": {
"title": "$:/core/modules/widgets/vars.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/vars.js\ntype: application/javascript\nmodule-type: widget\n\nThis widget allows multiple variables to be set in one go:\n\n```\n\\define helloworld() Hello world!\n<$vars greeting=\"Hi\" me={{!!title}} sentence=<<helloworld>>>\n <<greeting>>! I am <<me>> and I say: <<sentence>>\n</$vars>\n```\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar VarsWidget = function(parseTreeNode,options) {\n\t// Call the constructor\n\tWidget.call(this);\n\t// Initialise\t\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nVarsWidget.prototype = Object.create(Widget.prototype);\n\n/*\nRender this widget into the DOM\n*/\nVarsWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nVarsWidget.prototype.execute = function() {\n\t// Parse variables\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(val,key) {\n\t\tif(key.charAt(0) !== \"$\") {\n\t\t\tself.setVariable(key,val);\n\t\t}\n\t});\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nRefresh the widget by ensuring our attributes are up to date\n*/\nVarsWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(Object.keys(changedAttributes).length) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t}\n\treturn this.refreshChildren(changedTiddlers);\n};\n\nexports[\"vars\"] = VarsWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/view.js": {
"title": "$:/core/modules/widgets/view.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/view.js\ntype: application/javascript\nmodule-type: widget\n\nView widget\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar ViewWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nViewWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nViewWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tif(this.text) {\n\t\tvar textNode = this.document.createTextNode(this.text);\n\t\tparent.insertBefore(textNode,nextSibling);\n\t\tthis.domNodes.push(textNode);\n\t} else {\n\t\tthis.makeChildWidgets();\n\t\tthis.renderChildren(parent,nextSibling);\n\t}\n};\n\n/*\nCompute the internal state of the widget\n*/\nViewWidget.prototype.execute = function() {\n\t// Get parameters from our attributes\n\tthis.viewTitle = this.getAttribute(\"tiddler\",this.getVariable(\"currentTiddler\"));\n\tthis.viewSubtiddler = this.getAttribute(\"subtiddler\");\n\tthis.viewField = this.getAttribute(\"field\",\"text\");\n\tthis.viewIndex = this.getAttribute(\"index\");\n\tthis.viewFormat = this.getAttribute(\"format\",\"text\");\n\tthis.viewTemplate = this.getAttribute(\"template\",\"\");\n\tthis.viewMode = this.getAttribute(\"mode\",\"block\");\n\tswitch(this.viewFormat) {\n\t\tcase \"htmlwikified\":\n\t\t\tthis.text = this.getValueAsHtmlWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"plainwikified\":\n\t\t\tthis.text = this.getValueAsPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencodedplainwikified\":\n\t\t\tthis.text = this.getValueAsHtmlEncodedPlainWikified(this.viewMode);\n\t\t\tbreak;\n\t\tcase \"htmlencoded\":\n\t\t\tthis.text = this.getValueAsHtmlEncoded();\n\t\t\tbreak;\n\t\tcase \"urlencoded\":\n\t\t\tthis.text = this.getValueAsUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"doubleurlencoded\":\n\t\t\tthis.text = this.getValueAsDoubleUrlEncoded();\n\t\t\tbreak;\n\t\tcase \"date\":\n\t\t\tthis.text = this.getValueAsDate(this.viewTemplate);\n\t\t\tbreak;\n\t\tcase \"relativedate\":\n\t\t\tthis.text = this.getValueAsRelativeDate();\n\t\t\tbreak;\n\t\tcase \"stripcomments\":\n\t\t\tthis.text = this.getValueAsStrippedComments();\n\t\t\tbreak;\n\t\tcase \"jsencoded\":\n\t\t\tthis.text = this.getValueAsJsEncoded();\n\t\t\tbreak;\n\t\tdefault: // \"text\"\n\t\t\tthis.text = this.getValueAsText();\n\t\t\tbreak;\n\t}\n};\n\n/*\nThe various formatter functions are baked into this widget for the moment. Eventually they will be replaced by macro functions\n*/\n\n/*\nRetrieve the value of the widget. Options are:\nasString: Optionally return the value as a string\n*/\nViewWidget.prototype.getValue = function(options) {\n\toptions = options || {};\n\tvar value = options.asString ? \"\" : undefined;\n\tif(this.viewIndex) {\n\t\tvalue = this.wiki.extractTiddlerDataItem(this.viewTitle,this.viewIndex);\n\t} else {\n\t\tvar tiddler;\n\t\tif(this.viewSubtiddler) {\n\t\t\ttiddler = this.wiki.getSubTiddler(this.viewTitle,this.viewSubtiddler);\t\n\t\t} else {\n\t\t\ttiddler = this.wiki.getTiddler(this.viewTitle);\n\t\t}\n\t\tif(tiddler) {\n\t\t\tif(this.viewField === \"text\" && !this.viewSubtiddler) {\n\t\t\t\t// Calling getTiddlerText() triggers lazy loading of skinny tiddlers\n\t\t\t\tvalue = this.wiki.getTiddlerText(this.viewTitle);\n\t\t\t} else {\n\t\t\t\tif($tw.utils.hop(tiddler.fields,this.viewField)) {\n\t\t\t\t\tif(options.asString) {\n\t\t\t\t\t\tvalue = tiddler.getFieldString(this.viewField);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = tiddler.fields[this.viewField];\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tif(this.viewField === \"title\") {\n\t\t\t\tvalue = this.viewTitle;\n\t\t\t}\n\t\t}\n\t}\n\treturn value;\n};\n\nViewWidget.prototype.getValueAsText = function() {\n\treturn this.getValue({asString: true});\n};\n\nViewWidget.prototype.getValueAsHtmlWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/html\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsPlainWikified = function(mode) {\n\treturn this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t});\n};\n\nViewWidget.prototype.getValueAsHtmlEncodedPlainWikified = function(mode) {\n\treturn $tw.utils.htmlEncode(this.wiki.renderText(\"text/plain\",\"text/vnd.tiddlywiki\",this.getValueAsText(),{\n\t\tparseAsInline: mode !== \"block\",\n\t\tparentWidget: this\n\t}));\n};\n\nViewWidget.prototype.getValueAsHtmlEncoded = function() {\n\treturn $tw.utils.htmlEncode(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsUrlEncoded = function() {\n\treturn encodeURIComponent(this.getValueAsText());\n};\n\nViewWidget.prototype.getValueAsDoubleUrlEncoded = function() {\n\treturn encodeURIComponent(encodeURIComponent(this.getValueAsText()));\n};\n\nViewWidget.prototype.getValueAsDate = function(format) {\n\tformat = format || \"YYYY MM DD 0hh:0mm\";\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.formatDateString(value,format);\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsRelativeDate = function(format) {\n\tvar value = $tw.utils.parseDate(this.getValue());\n\tif(value && $tw.utils.isDate(value) && value.toString() !== \"Invalid Date\") {\n\t\treturn $tw.utils.getRelativeDate((new Date()) - (new Date(value))).description;\n\t} else {\n\t\treturn \"\";\n\t}\n};\n\nViewWidget.prototype.getValueAsStrippedComments = function() {\n\tvar lines = this.getValueAsText().split(\"\\n\"),\n\t\tout = [];\n\tfor(var line=0; line<lines.length; line++) {\n\t\tvar text = lines[line];\n\t\tif(!/^\\s*\\/\\/#/.test(text)) {\n\t\t\tout.push(text);\n\t\t}\n\t}\n\treturn out.join(\"\\n\");\n};\n\nViewWidget.prototype.getValueAsJsEncoded = function() {\n\treturn $tw.utils.stringify(this.getValueAsText());\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nViewWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\tif(changedAttributes.tiddler || changedAttributes.field || changedAttributes.index || changedAttributes.template || changedAttributes.format || changedTiddlers[this.viewTitle]) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\treturn false;\t\n\t}\n};\n\nexports.view = ViewWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/widget.js": {
"title": "$:/core/modules/widgets/widget.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/widget.js\ntype: application/javascript\nmodule-type: widget\n\nWidget base class\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nCreate a widget object for a parse tree node\n\tparseTreeNode: reference to the parse tree node to be rendered\n\toptions: see below\nOptions include:\n\twiki: mandatory reference to wiki associated with this render tree\n\tparentWidget: optional reference to a parent renderer node for the context chain\n\tdocument: optional document object to use instead of global document\n*/\nvar Widget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInitialise widget properties. These steps are pulled out of the constructor so that we can reuse them in subclasses\n*/\nWidget.prototype.initialise = function(parseTreeNode,options) {\n\t// Bail if parseTreeNode is undefined, meaning that the widget constructor was called without any arguments so that it can be subclassed\n\tif(parseTreeNode === undefined) {\n\t\treturn;\n\t}\n\toptions = options || {};\n\t// Save widget info\n\tthis.parseTreeNode = parseTreeNode;\n\tthis.wiki = options.wiki;\n\tthis.parentWidget = options.parentWidget;\n\tthis.variablesConstructor = function() {};\n\tthis.variablesConstructor.prototype = this.parentWidget ? this.parentWidget.variables : {};\n\tthis.variables = new this.variablesConstructor();\n\tthis.document = options.document;\n\tthis.attributes = {};\n\tthis.children = [];\n\tthis.domNodes = [];\n\tthis.eventListeners = {};\n\t// Hashmap of the widget classes\n\tif(!this.widgetClasses) {\n\t\t// Get widget classes\n\t\tWidget.prototype.widgetClasses = $tw.modules.applyMethods(\"widget\");\n\t\t// Process any subclasses\n\t\t$tw.modules.forEachModuleOfType(\"widget-subclass\",function(title,module) {\n\t\t\tif(module.baseClass) {\n\t\t\t\tvar baseClass = Widget.prototype.widgetClasses[module.baseClass];\n\t\t\t\tif(!baseClass) {\n\t\t\t\t\tthrow \"Module '\" + title + \"' is attemping to extend a non-existent base class '\" + module.baseClass + \"'\";\n\t\t\t\t}\n\t\t\t\tvar subClass = module.constructor;\n\t\t\t\tsubClass.prototype = new baseClass();\n\t\t\t\t$tw.utils.extend(subClass.prototype,module.prototype);\n\t\t\t\tWidget.prototype.widgetClasses[module.name || module.baseClass] = subClass;\n\t\t\t}\n\t\t});\n\t}\n};\n\n/*\nRender this widget into the DOM\n*/\nWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWidget.prototype.execute = function() {\n\tthis.makeChildWidgets();\n};\n\n/*\nSet the value of a context variable\nname: name of the variable\nvalue: value of the variable\nparams: array of {name:, default:} for each parameter\nisMacroDefinition: true if the variable is set via a \\define macro pragma (and hence should have variable substitution performed)\n*/\nWidget.prototype.setVariable = function(name,value,params,isMacroDefinition) {\n\tthis.variables[name] = {value: value, params: params, isMacroDefinition: !!isMacroDefinition};\n};\n\n/*\nGet the prevailing value of a context variable\nname: name of variable\noptions: see below\nOptions include\nparams: array of {name:, value:} for each parameter\ndefaultValue: default value if the variable is not defined\n\nReturns an object with the following fields:\n\nparams: array of {name:,value:} of parameters passed to wikitext variables\ntext: text of variable, with parameters properly substituted\n*/\nWidget.prototype.getVariableInfo = function(name,options) {\n\toptions = options || {};\n\tvar actualParams = options.params || [],\n\t\tparentWidget = this.parentWidget;\n\t// Check for the variable defined in the parent widget (or an ancestor in the prototype chain)\n\tif(parentWidget && name in parentWidget.variables) {\n\t\tvar variable = parentWidget.variables[name],\n\t\t\toriginalValue = variable.value,\n\t\t\tvalue = originalValue,\n\t\t\tparams = this.resolveVariableParameters(variable.params,actualParams);\n\t\t// Substitute any parameters specified in the definition\n\t\t$tw.utils.each(params,function(param) {\n\t\t\tvalue = $tw.utils.replaceString(value,new RegExp(\"\\\\$\" + $tw.utils.escapeRegExp(param.name) + \"\\\\$\",\"mg\"),param.value);\n\t\t});\n\t\t// Only substitute variable references if this variable was defined with the \\define pragma\n\t\tif(variable.isMacroDefinition) {\n\t\t\tvalue = this.substituteVariableReferences(value);\t\t\t\n\t\t}\n\t\treturn {\n\t\t\ttext: value,\n\t\t\tparams: params,\n\t\t\tsrcVariable: variable,\n\t\t\tisCacheable: originalValue === value\n\t\t};\n\t}\n\t// If the variable doesn't exist in the parent widget then look for a macro module\n\treturn {\n\t\ttext: this.evaluateMacroModule(name,actualParams,options.defaultValue)\n\t};\n};\n\n/*\nSimplified version of getVariableInfo() that just returns the text\n*/\nWidget.prototype.getVariable = function(name,options) {\n\treturn this.getVariableInfo(name,options).text;\n};\n\nWidget.prototype.resolveVariableParameters = function(formalParams,actualParams) {\n\tformalParams = formalParams || [];\n\tactualParams = actualParams || [];\n\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\tparamInfo, paramValue,\n\t\tresults = [];\n\t// Step through each of the parameters in the macro definition\n\tfor(var p=0; p<formalParams.length; p++) {\n\t\t// Check if we've got a macro call parameter with the same name\n\t\tparamInfo = formalParams[p];\n\t\tparamValue = undefined;\n\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t}\n\t\t}\n\t\t// If not, use the next available anonymous macro call parameter\n\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\tnextAnonParameter++;\n\t\t}\n\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t}\n\t\t// If we've still not got a value, use the default, if any\n\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t// Store the parameter name and value\n\t\tresults.push({name: paramInfo.name, value: paramValue});\n\t}\n\treturn results;\n};\n\nWidget.prototype.substituteVariableReferences = function(text) {\n\tvar self = this;\n\treturn (text || \"\").replace(/\\$\\(([^\\)\\$]+)\\)\\$/g,function(match,p1,offset,string) {\n\t\treturn self.getVariable(p1,{defaultValue: \"\"});\n\t});\n};\n\nWidget.prototype.evaluateMacroModule = function(name,actualParams,defaultValue) {\n\tif($tw.utils.hop($tw.macros,name)) {\n\t\tvar macro = $tw.macros[name],\n\t\t\targs = [];\n\t\tif(macro.params.length > 0) {\n\t\t\tvar nextAnonParameter = 0, // Next candidate anonymous parameter in macro call\n\t\t\t\tparamInfo, paramValue;\n\t\t\t// Step through each of the parameters in the macro definition\n\t\t\tfor(var p=0; p<macro.params.length; p++) {\n\t\t\t\t// Check if we've got a macro call parameter with the same name\n\t\t\t\tparamInfo = macro.params[p];\n\t\t\t\tparamValue = undefined;\n\t\t\t\tfor(var m=0; m<actualParams.length; m++) {\n\t\t\t\t\tif(actualParams[m].name === paramInfo.name) {\n\t\t\t\t\t\tparamValue = actualParams[m].value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If not, use the next available anonymous macro call parameter\n\t\t\t\twhile(nextAnonParameter < actualParams.length && actualParams[nextAnonParameter].name) {\n\t\t\t\t\tnextAnonParameter++;\n\t\t\t\t}\n\t\t\t\tif(paramValue === undefined && nextAnonParameter < actualParams.length) {\n\t\t\t\t\tparamValue = actualParams[nextAnonParameter++].value;\n\t\t\t\t}\n\t\t\t\t// If we've still not got a value, use the default, if any\n\t\t\t\tparamValue = paramValue || paramInfo[\"default\"] || \"\";\n\t\t\t\t// Save the parameter\n\t\t\t\targs.push(paramValue);\n\t\t\t}\n\t\t}\n\t\telse for(var i=0; i<actualParams.length; ++i) {\n\t\t\targs.push(actualParams[i].value);\n\t\t}\n\t\treturn (macro.run.apply(this,args) || \"\").toString();\n\t} else {\n\t\treturn defaultValue;\n\t}\n};\n\n/*\nCheck whether a given context variable value exists in the parent chain\n*/\nWidget.prototype.hasVariable = function(name,value) {\n\tvar node = this;\n\twhile(node) {\n\t\tif($tw.utils.hop(node.variables,name) && node.variables[name].value === value) {\n\t\t\treturn true;\n\t\t}\n\t\tnode = node.parentWidget;\n\t}\n\treturn false;\n};\n\n/*\nConstruct a qualifying string based on a hash of concatenating the values of a given variable in the parent chain\n*/\nWidget.prototype.getStateQualifier = function(name) {\n\tthis.qualifiers = this.qualifiers || Object.create(null);\n\tname = name || \"transclusion\";\n\tif(this.qualifiers[name]) {\n\t\treturn this.qualifiers[name];\n\t} else {\n\t\tvar output = [],\n\t\t\tnode = this;\n\t\twhile(node && node.parentWidget) {\n\t\t\tif($tw.utils.hop(node.parentWidget.variables,name)) {\n\t\t\t\toutput.push(node.getVariable(name));\n\t\t\t}\n\t\t\tnode = node.parentWidget;\n\t\t}\n\t\tvar value = $tw.utils.hashString(output.join(\"\"));\n\t\tthis.qualifiers[name] = value;\n\t\treturn value;\n\t}\n};\n\n/*\nCompute the current values of the attributes of the widget. Returns a hashmap of the names of the attributes that have changed\n*/\nWidget.prototype.computeAttributes = function() {\n\tvar changedAttributes = {},\n\t\tself = this,\n\t\tvalue;\n\t$tw.utils.each(this.parseTreeNode.attributes,function(attribute,name) {\n\t\tif(attribute.type === \"filtered\") {\n\t\t\tvalue = self.wiki.filterTiddlers(attribute.filter,self)[0] || \"\";\n\t\t} else if(attribute.type === \"indirect\") {\n\t\t\tvalue = self.wiki.getTextReference(attribute.textReference,\"\",self.getVariable(\"currentTiddler\"));\n\t\t} else if(attribute.type === \"macro\") {\n\t\t\tvalue = self.getVariable(attribute.value.name,{params: attribute.value.params});\n\t\t} else { // String attribute\n\t\t\tvalue = attribute.value;\n\t\t}\n\t\t// Check whether the attribute has changed\n\t\tif(self.attributes[name] !== value) {\n\t\t\tself.attributes[name] = value;\n\t\t\tchangedAttributes[name] = true;\n\t\t}\n\t});\n\treturn changedAttributes;\n};\n\n/*\nCheck for the presence of an attribute\n*/\nWidget.prototype.hasAttribute = function(name) {\n\treturn $tw.utils.hop(this.attributes,name);\n};\n\n/*\nGet the value of an attribute\n*/\nWidget.prototype.getAttribute = function(name,defaultText) {\n\tif($tw.utils.hop(this.attributes,name)) {\n\t\treturn this.attributes[name];\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nAssign the computed attributes of the widget to a domNode\noptions include:\nexcludeEventAttributes: ignores attributes whose name begins with \"on\"\n*/\nWidget.prototype.assignAttributes = function(domNode,options) {\n\toptions = options || {};\n\tvar self = this;\n\t$tw.utils.each(this.attributes,function(v,a) {\n\t\t// Check exclusions\n\t\tif(options.excludeEventAttributes && a.substr(0,2) === \"on\") {\n\t\t\tv = undefined;\n\t\t}\n\t\tif(v !== undefined) {\n\t\t\tvar b = a.split(\":\");\n\t\t\t// Setting certain attributes can cause a DOM error (eg xmlns on the svg element)\n\t\t\ttry {\n\t\t\t\tif (b.length == 2 && b[0] == \"xlink\"){\n\t\t\t\t\tdomNode.setAttributeNS(\"http://www.w3.org/1999/xlink\",b[1],v);\n\t\t\t\t} else {\n\t\t\t\t\tdomNode.setAttributeNS(null,a,v);\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t}\n\t\t}\n\t});\n};\n\n/*\nMake child widgets correspondng to specified parseTreeNodes\n*/\nWidget.prototype.makeChildWidgets = function(parseTreeNodes) {\n\tthis.children = [];\n\tvar self = this;\n\t$tw.utils.each(parseTreeNodes || (this.parseTreeNode && this.parseTreeNode.children),function(childNode) {\n\t\tself.children.push(self.makeChildWidget(childNode));\n\t});\n};\n\n/*\nConstruct the widget object for a parse tree node\n*/\nWidget.prototype.makeChildWidget = function(parseTreeNode) {\n\tvar WidgetClass = this.widgetClasses[parseTreeNode.type];\n\tif(!WidgetClass) {\n\t\tWidgetClass = this.widgetClasses.text;\n\t\tparseTreeNode = {type: \"text\", text: \"Undefined widget '\" + parseTreeNode.type + \"'\"};\n\t}\n\treturn new WidgetClass(parseTreeNode,{\n\t\twiki: this.wiki,\n\t\tvariables: {},\n\t\tparentWidget: this,\n\t\tdocument: this.document\n\t});\n};\n\n/*\nGet the next sibling of this widget\n*/\nWidget.prototype.nextSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index < this.parentWidget.children.length-1) {\n\t\t\treturn this.parentWidget.children[index+1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nGet the previous sibling of this widget\n*/\nWidget.prototype.previousSibling = function() {\n\tif(this.parentWidget) {\n\t\tvar index = this.parentWidget.children.indexOf(this);\n\t\tif(index !== -1 && index > 0) {\n\t\t\treturn this.parentWidget.children[index-1];\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRender the children of this widget into the DOM\n*/\nWidget.prototype.renderChildren = function(parent,nextSibling) {\n\tvar children = this.children;\n\tfor(var i = 0; i < children.length; i++) {\n\t\tchildren[i].render(parent,nextSibling);\n\t};\n};\n\n/*\nAdd a list of event listeners from an array [{type:,handler:},...]\n*/\nWidget.prototype.addEventListeners = function(listeners) {\n\tvar self = this;\n\t$tw.utils.each(listeners,function(listenerInfo) {\n\t\tself.addEventListener(listenerInfo.type,listenerInfo.handler);\n\t});\n};\n\n/*\nAdd an event listener\n*/\nWidget.prototype.addEventListener = function(type,handler) {\n\tvar self = this;\n\tif(typeof handler === \"string\") { // The handler is a method name on this widget\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn self[handler].call(self,event);\n\t\t};\n\t} else { // The handler is a function\n\t\tthis.eventListeners[type] = function(event) {\n\t\t\treturn handler.call(self,event);\n\t\t};\n\t}\n};\n\n/*\nDispatch an event to a widget. If the widget doesn't handle the event then it is also dispatched to the parent widget\n*/\nWidget.prototype.dispatchEvent = function(event) {\n\tevent.widget = event.widget || this;\n\t// Dispatch the event if this widget handles it\n\tvar listener = this.eventListeners[event.type];\n\tif(listener) {\n\t\t// Don't propagate the event if the listener returned false\n\t\tif(!listener(event)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Dispatch the event to the parent widget\n\tif(this.parentWidget) {\n\t\treturn this.parentWidget.dispatchEvent(event);\n\t}\n\treturn true;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWidget.prototype.refresh = function(changedTiddlers) {\n\treturn this.refreshChildren(changedTiddlers);\n};\n\n/*\nRebuild a previously rendered widget\n*/\nWidget.prototype.refreshSelf = function() {\n\tvar nextSibling = this.findNextSiblingDomNode();\n\tthis.removeChildDomNodes();\n\tthis.render(this.parentDomNode,nextSibling);\n};\n\n/*\nRefresh all the children of a widget\n*/\nWidget.prototype.refreshChildren = function(changedTiddlers) {\n\tvar children = this.children,\n\t\trefreshed = false;\n\tfor (var i = 0; i < children.length; i++) {\n\t\trefreshed = children[i].refresh(changedTiddlers) || refreshed;\n\t}\n\treturn refreshed;\n};\n\n/*\nFind the next sibling in the DOM to this widget. This is done by scanning the widget tree through all next siblings and their descendents that share the same parent DOM node\n*/\nWidget.prototype.findNextSiblingDomNode = function(startIndex) {\n\t// Refer to this widget by its index within its parents children\n\tvar parent = this.parentWidget,\n\t\tindex = startIndex !== undefined ? startIndex : parent.children.indexOf(this);\nif(index === -1) {\n\tthrow \"node not found in parents children\";\n}\n\t// Look for a DOM node in the later siblings\n\twhile(++index < parent.children.length) {\n\t\tvar domNode = parent.children[index].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\t// Go back and look for later siblings of our parent if it has the same parent dom node\n\tvar grandParent = parent.parentWidget;\n\tif(grandParent && parent.parentDomNode === this.parentDomNode) {\n\t\tindex = grandParent.children.indexOf(parent);\n\t\tif(index !== -1) {\n\t\t\treturn parent.findNextSiblingDomNode(index);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nFind the first DOM node generated by a widget or its children\n*/\nWidget.prototype.findFirstDomNode = function() {\n\t// Return the first dom node of this widget, if we've got one\n\tif(this.domNodes.length > 0) {\n\t\treturn this.domNodes[0];\n\t}\n\t// Otherwise, recursively call our children\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar domNode = this.children[t].findFirstDomNode();\n\t\tif(domNode) {\n\t\t\treturn domNode;\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRemove any DOM nodes created by this widget or its children\n*/\nWidget.prototype.removeChildDomNodes = function() {\n\t// If this widget has directly created DOM nodes, delete them and exit. This assumes that any child widgets are contained within the created DOM nodes, which would normally be the case\n\tif(this.domNodes.length > 0) {\n\t\t$tw.utils.each(this.domNodes,function(domNode) {\n\t\t\tdomNode.parentNode.removeChild(domNode);\n\t\t});\n\t\tthis.domNodes = [];\n\t} else {\n\t\t// Otherwise, ask the child widgets to delete their DOM nodes\n\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\tchildWidget.removeChildDomNodes();\n\t\t});\n\t}\n};\n\n/*\nInvoke the action widgets that are descendents of the current widget.\n*/\nWidget.prototype.invokeActions = function(triggeringWidget,event) {\n\tvar handled = false;\n\t// For each child widget\n\tfor(var t=0; t<this.children.length; t++) {\n\t\tvar child = this.children[t];\n\t\t// Invoke the child if it is an action widget\n\t\tif(child.invokeAction) {\n\t\t\tchild.refreshSelf();\n\t\t\tif(child.invokeAction(triggeringWidget,event)) {\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\t\t// Propagate through through the child if it permits it\n\t\tif(child.allowActionPropagation() && child.invokeActions(triggeringWidget,event)) {\n\t\t\thandled = true;\n\t\t}\n\t}\n\treturn handled;\n};\n\n/*\nInvoke the action widgets defined in a string\n*/\nWidget.prototype.invokeActionString = function(actions,triggeringWidget,event,variables) {\n\tactions = actions || \"\";\n\tvar parser = this.wiki.parseText(\"text/vnd.tiddlywiki\",actions,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document\n\t\t}),\n\t\twidgetNode = this.wiki.makeWidget(parser,{\n\t\t\tparentWidget: this,\n\t\t\tdocument: this.document,\n\t\t\tvariables: variables\n\t\t});\n\tvar container = this.document.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn widgetNode.invokeActions(this,event);\n};\n\n/*\nExecute action tiddlers by tag\n*/\nWidget.prototype.invokeActionsByTag = function(tag,event,variables) {\n\tvar self = this;\n\t$tw.utils.each(self.wiki.filterTiddlers(\"[all[shadows+tiddlers]tag[\" + tag + \"]!has[draft.of]]\"),function(title) {\n\t\tself.invokeActionString(self.wiki.getTiddlerText(title),self,event,variables);\n\t});\n};\n\nWidget.prototype.allowActionPropagation = function() {\n\treturn true;\n};\n\nexports.widget = Widget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/widgets/wikify.js": {
"title": "$:/core/modules/widgets/wikify.js",
"text": "/*\\\ntitle: $:/core/modules/widgets/wikify.js\ntype: application/javascript\nmodule-type: widget\n\nWidget to wikify text into a variable\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar Widget = require(\"$:/core/modules/widgets/widget.js\").widget;\n\nvar WikifyWidget = function(parseTreeNode,options) {\n\tthis.initialise(parseTreeNode,options);\n};\n\n/*\nInherit from the base widget class\n*/\nWikifyWidget.prototype = new Widget();\n\n/*\nRender this widget into the DOM\n*/\nWikifyWidget.prototype.render = function(parent,nextSibling) {\n\tthis.parentDomNode = parent;\n\tthis.computeAttributes();\n\tthis.execute();\n\tthis.renderChildren(parent,nextSibling);\n};\n\n/*\nCompute the internal state of the widget\n*/\nWikifyWidget.prototype.execute = function() {\n\t// Get our parameters\n\tthis.wikifyName = this.getAttribute(\"name\");\n\tthis.wikifyText = this.getAttribute(\"text\");\n\tthis.wikifyType = this.getAttribute(\"type\");\n\tthis.wikifyMode = this.getAttribute(\"mode\",\"block\");\n\tthis.wikifyOutput = this.getAttribute(\"output\",\"text\");\n\t// Create the parse tree\n\tthis.wikifyParser = this.wiki.parseText(this.wikifyType,this.wikifyText,{\n\t\t\tparseAsInline: this.wikifyMode === \"inline\"\n\t\t});\n\t// Create the widget tree \n\tthis.wikifyWidgetNode = this.wiki.makeWidget(this.wikifyParser,{\n\t\t\tdocument: $tw.fakeDocument,\n\t\t\tparentWidget: this\n\t\t});\n\t// Render the widget tree to the container\n\tthis.wikifyContainer = $tw.fakeDocument.createElement(\"div\");\n\tthis.wikifyWidgetNode.render(this.wikifyContainer,null);\n\tthis.wikifyResult = this.getResult();\n\t// Set context variable\n\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t// Construct the child widgets\n\tthis.makeChildWidgets();\n};\n\n/*\nReturn the result string\n*/\nWikifyWidget.prototype.getResult = function() {\n\tvar result;\n\tswitch(this.wikifyOutput) {\n\t\tcase \"text\":\n\t\t\tresult = this.wikifyContainer.textContent;\n\t\t\tbreak;\n\t\tcase \"formattedtext\":\n\t\t\tresult = this.wikifyContainer.formattedTextContent;\n\t\t\tbreak;\n\t\tcase \"html\":\n\t\t\tresult = this.wikifyContainer.innerHTML;\n\t\t\tbreak;\n\t\tcase \"parsetree\":\n\t\t\tresult = JSON.stringify(this.wikifyParser.tree,0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t\tcase \"widgettree\":\n\t\t\tresult = JSON.stringify(this.getWidgetTree(),0,$tw.config.preferences.jsonSpaces);\n\t\t\tbreak;\n\t}\n\treturn result;\n};\n\n/*\nReturn a string of the widget tree\n*/\nWikifyWidget.prototype.getWidgetTree = function() {\n\tvar copyNode = function(widgetNode,resultNode) {\n\t\t\tvar type = widgetNode.parseTreeNode.type;\n\t\t\tresultNode.type = type;\n\t\t\tswitch(type) {\n\t\t\t\tcase \"element\":\n\t\t\t\t\tresultNode.tag = widgetNode.parseTreeNode.tag;\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"text\":\n\t\t\t\t\tresultNode.text = widgetNode.parseTreeNode.text;\n\t\t\t\t\tbreak;\t\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.attributes || {}).length > 0) {\n\t\t\t\tresultNode.attributes = {};\n\t\t\t\t$tw.utils.each(widgetNode.attributes,function(attr,attrName) {\n\t\t\t\t\tresultNode.attributes[attrName] = widgetNode.getAttribute(attrName);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif(Object.keys(widgetNode.children || {}).length > 0) {\n\t\t\t\tresultNode.children = [];\n\t\t\t\t$tw.utils.each(widgetNode.children,function(widgetChildNode) {\n\t\t\t\t\tvar node = {};\n\t\t\t\t\tresultNode.children.push(node);\n\t\t\t\t\tcopyNode(widgetChildNode,node);\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\tresults = {};\n\tcopyNode(this.wikifyWidgetNode,results);\n\treturn results;\n};\n\n/*\nSelectively refreshes the widget if needed. Returns true if the widget or any of its children needed re-rendering\n*/\nWikifyWidget.prototype.refresh = function(changedTiddlers) {\n\tvar changedAttributes = this.computeAttributes();\n\t// Refresh ourselves entirely if any of our attributes have changed\n\tif(changedAttributes.name || changedAttributes.text || changedAttributes.type || changedAttributes.mode || changedAttributes.output) {\n\t\tthis.refreshSelf();\n\t\treturn true;\n\t} else {\n\t\t// Refresh the widget tree\n\t\tif(this.wikifyWidgetNode.refresh(changedTiddlers)) {\n\t\t\t// Check if there was any change\n\t\t\tvar result = this.getResult();\n\t\t\tif(result !== this.wikifyResult) {\n\t\t\t\t// If so, save the change\n\t\t\t\tthis.wikifyResult = result;\n\t\t\t\tthis.setVariable(this.wikifyName,this.wikifyResult);\n\t\t\t\t// Refresh each of our child widgets\n\t\t\t\t$tw.utils.each(this.children,function(childWidget) {\n\t\t\t\t\tchildWidget.refreshSelf();\n\t\t\t\t});\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\t// Just refresh the children\n\t\treturn this.refreshChildren(changedTiddlers);\n\t}\n};\n\nexports.wikify = WikifyWidget;\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/core/modules/wiki-bulkops.js": {
"title": "$:/core/modules/wiki-bulkops.js",
"text": "/*\\\ntitle: $:/core/modules/wiki-bulkops.js\ntype: application/javascript\nmodule-type: wikimethod\n\nBulk tiddler operations such as rename.\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\n/*\nRename a tiddler, and relink any tags or lists that reference it.\n*/\nfunction renameTiddler(fromTitle,toTitle,options) {\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\t// Rename the tiddler itself\n\t\tvar oldTiddler = this.getTiddler(fromTitle),\n\t\t\tnewTiddler = new $tw.Tiddler(oldTiddler,{title: toTitle},this.getModificationFields());\n\t\tnewTiddler = $tw.hooks.invokeHook(\"th-renaming-tiddler\",newTiddler,oldTiddler);\n\t\tthis.addTiddler(newTiddler);\n\t\tthis.deleteTiddler(fromTitle);\n\t\t// Rename any tags or lists that reference it\n\t\tthis.relinkTiddler(fromTitle,toTitle,options)\n\t}\n}\n\n/*\nRelink any tags or lists that reference a given tiddler\n*/\nfunction relinkTiddler(fromTitle,toTitle,options) {\n\tvar self = this;\n\tfromTitle = (fromTitle || \"\").trim();\n\ttoTitle = (toTitle || \"\").trim();\n\toptions = options || {};\n\tif(fromTitle && toTitle && fromTitle !== toTitle) {\n\t\tthis.each(function(tiddler,title) {\n\t\t\tvar type = tiddler.fields.type || \"\";\n\t\t\t// Don't touch plugins or JavaScript modules\n\t\t\tif(!tiddler.fields[\"plugin-type\"] && type !== \"application/javascript\") {\n\t\t\t\tvar tags = tiddler.fields.tags ? tiddler.fields.tags.slice(0) : undefined,\n\t\t\t\t\tlist = tiddler.fields.list ? tiddler.fields.list.slice(0) : undefined,\n\t\t\t\t\tisModified = false;\n\t\t\t\tif(!options.dontRenameInTags) {\n\t\t\t\t\t// Rename tags\n\t\t\t\t\t$tw.utils.each(tags,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming tag '\" + tags[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\ttags[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(!options.dontRenameInLists) {\n\t\t\t\t\t// Rename lists\n\t\t\t\t\t$tw.utils.each(list,function (title,index) {\n\t\t\t\t\t\tif(title === fromTitle) {\nconsole.log(\"Renaming list item '\" + list[index] + \"' to '\" + toTitle + \"' of tiddler '\" + tiddler.fields.title + \"'\");\n\t\t\t\t\t\t\tlist[index] = toTitle;\n\t\t\t\t\t\t\tisModified = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tif(isModified) {\n\t\t\t\t\tvar newTiddler = new $tw.Tiddler(tiddler,{tags: tags, list: list},self.getModificationFields())\n\t\t\t\t\tnewTiddler = $tw.hooks.invokeHook(\"th-relinking-tiddler\",newTiddler,tiddler);\n\t\t\t\t\tself.addTiddler(newTiddler);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n};\n\nexports.renameTiddler = renameTiddler;\nexports.relinkTiddler = relinkTiddler;\n\n})();\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/core/modules/wiki.js": {
"title": "$:/core/modules/wiki.js",
"text": "/*\\\ntitle: $:/core/modules/wiki.js\ntype: application/javascript\nmodule-type: wikimethod\n\nExtension methods for the $tw.Wiki object\n\nAdds the following properties to the wiki object:\n\n* `eventListeners` is a hashmap by type of arrays of listener functions\n* `changedTiddlers` is a hashmap describing changes to named tiddlers since wiki change events were last dispatched. Each entry is a hashmap containing two fields:\n\tmodified: true/false\n\tdeleted: true/false\n* `changeCount` is a hashmap by tiddler title containing a numerical index that starts at zero and is incremented each time a tiddler is created changed or deleted\n* `caches` is a hashmap by tiddler title containing a further hashmap of named cache objects. Caches are automatically cleared when a tiddler is modified or deleted\n* `globalCache` is a hashmap by cache name of cache objects that are cleared whenever any tiddler change occurs\n\n\\*/\n(function(){\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar widget = require(\"$:/core/modules/widgets/widget.js\");\n\nvar USER_NAME_TITLE = \"$:/status/UserName\",\n\tTIMESTAMP_DISABLE_TITLE = \"$:/config/TimestampDisable\";\n\n/*\nAdd available indexers to this wiki\n*/\nexports.addIndexersToWiki = function() {\n\tvar self = this;\n\t$tw.utils.each($tw.modules.applyMethods(\"indexer\"),function(Indexer,name) {\n\t\tself.addIndexer(new Indexer(self),name);\n\t});\n};\n\n/*\nGet the value of a text reference. Text references can have any of these forms:\n\t<tiddlertitle>\n\t<tiddlertitle>!!<fieldname>\n\t!!<fieldname> - specifies a field of the current tiddlers\n\t<tiddlertitle>##<index>\n*/\nexports.getTextReference = function(textRef,defaultText,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tif(tr.field) {\n\t\tvar tiddler = this.getTiddler(title);\n\t\tif(tr.field === \"title\") { // Special case so we can return the title of a non-existent tiddler\n\t\t\treturn title;\n\t\t} else if(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\treturn tiddler.getFieldString(tr.field);\n\t\t} else {\n\t\t\treturn defaultText;\n\t\t}\n\t} else if(tr.index) {\n\t\treturn this.extractTiddlerDataItem(title,tr.index,defaultText);\n\t} else {\n\t\treturn this.getTiddlerText(title,defaultText);\n\t}\n};\n\nexports.setTextReference = function(textRef,value,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle = tr.title || currTiddlerTitle;\n\tthis.setText(title,tr.field,tr.index,value);\n};\n\nexports.setText = function(title,field,index,value,options) {\n\toptions = options || {};\n\tvar creationFields = options.suppressTimestamp ? {} : this.getCreationFields(),\n\t\tmodificationFields = options.suppressTimestamp ? {} : this.getModificationFields();\n\t// Check if it is a reference to a tiddler field\n\tif(index) {\n\t\tvar data = this.getTiddlerData(title,Object.create(null));\n\t\tif(value !== undefined) {\n\t\t\tdata[index] = value;\n\t\t} else {\n\t\t\tdelete data[index];\n\t\t}\n\t\tthis.setTiddlerData(title,data,modificationFields);\n\t} else {\n\t\tvar tiddler = this.getTiddler(title),\n\t\t\tfields = {title: title};\n\t\tfields[field || \"text\"] = value;\n\t\tthis.addTiddler(new $tw.Tiddler(creationFields,tiddler,fields,modificationFields));\n\t}\n};\n\nexports.deleteTextReference = function(textRef,currTiddlerTitle) {\n\tvar tr = $tw.utils.parseTextReference(textRef),\n\t\ttitle,tiddler,fields;\n\t// Check if it is a reference to a tiddler\n\tif(tr.title && !tr.field) {\n\t\tthis.deleteTiddler(tr.title);\n\t// Else check for a field reference\n\t} else if(tr.field) {\n\t\ttitle = tr.title || currTiddlerTitle;\n\t\ttiddler = this.getTiddler(title);\n\t\tif(tiddler && $tw.utils.hop(tiddler.fields,tr.field)) {\n\t\t\tfields = Object.create(null);\n\t\t\tfields[tr.field] = undefined;\n\t\t\tthis.addTiddler(new $tw.Tiddler(tiddler,fields,this.getModificationFields()));\n\t\t}\n\t}\n};\n\nexports.addEventListener = function(type,listener) {\n\tthis.eventListeners = this.eventListeners || {};\n\tthis.eventListeners[type] = this.eventListeners[type] || [];\n\tthis.eventListeners[type].push(listener);\t\n};\n\nexports.removeEventListener = function(type,listener) {\n\tvar listeners = this.eventListeners[type];\n\tif(listeners) {\n\t\tvar p = listeners.indexOf(listener);\n\t\tif(p !== -1) {\n\t\t\tlisteners.splice(p,1);\n\t\t}\n\t}\n};\n\nexports.dispatchEvent = function(type /*, args */) {\n\tvar args = Array.prototype.slice.call(arguments,1),\n\t\tlisteners = this.eventListeners[type];\n\tif(listeners) {\n\t\tfor(var p=0; p<listeners.length; p++) {\n\t\t\tvar listener = listeners[p];\n\t\t\tlistener.apply(listener,args);\n\t\t}\n\t}\n};\n\n/*\nCauses a tiddler to be marked as changed, incrementing the change count, and triggers event handlers.\nThis method should be called after the changes it describes have been made to the wiki.tiddlers[] array.\n\ttitle: Title of tiddler\n\tisDeleted: defaults to false (meaning the tiddler has been created or modified),\n\t\ttrue if the tiddler has been deleted\n*/\nexports.enqueueTiddlerEvent = function(title,isDeleted) {\n\t// Record the touch in the list of changed tiddlers\n\tthis.changedTiddlers = this.changedTiddlers || Object.create(null);\n\tthis.changedTiddlers[title] = this.changedTiddlers[title] || Object.create(null);\n\tthis.changedTiddlers[title][isDeleted ? \"deleted\" : \"modified\"] = true;\n\t// Increment the change count\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\tthis.changeCount[title]++;\n\t} else {\n\t\tthis.changeCount[title] = 1;\n\t}\n\t// Trigger events\n\tthis.eventListeners = this.eventListeners || {};\n\tif(!this.eventsTriggered) {\n\t\tvar self = this;\n\t\t$tw.utils.nextTick(function() {\n\t\t\tvar changes = self.changedTiddlers;\n\t\t\tself.changedTiddlers = Object.create(null);\n\t\t\tself.eventsTriggered = false;\n\t\t\tif($tw.utils.count(changes) > 0) {\n\t\t\t\tself.dispatchEvent(\"change\",changes);\n\t\t\t}\n\t\t});\n\t\tthis.eventsTriggered = true;\n\t}\n};\n\nexports.getSizeOfTiddlerEventQueue = function() {\n\treturn $tw.utils.count(this.changedTiddlers);\n};\n\nexports.clearTiddlerEventQueue = function() {\n\tthis.changedTiddlers = Object.create(null);\n\tthis.changeCount = Object.create(null);\n};\n\nexports.getChangeCount = function(title) {\n\tthis.changeCount = this.changeCount || Object.create(null);\n\tif($tw.utils.hop(this.changeCount,title)) {\n\t\treturn this.changeCount[title];\n\t} else {\n\t\treturn 0;\n\t}\n};\n\n/*\nGenerate an unused title from the specified base\n*/\nexports.generateNewTitle = function(baseTitle,options) {\n\toptions = options || {};\n\tvar c = 0,\n\t\ttitle = baseTitle;\n\twhile(this.tiddlerExists(title) || this.isShadowTiddler(title) || this.findDraft(title)) {\n\t\ttitle = baseTitle + \n\t\t\t(options.prefix || \" \") + \n\t\t\t(++c);\n\t}\n\treturn title;\n};\n\nexports.isSystemTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/\") === 0;\n};\n\nexports.isTemporaryTiddler = function(title) {\n\treturn title && title.indexOf(\"$:/temp/\") === 0;\n};\n\nexports.isImageTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.flags.indexOf(\"image\") !== -1;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.isBinaryTiddler = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\t\t\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type || \"text/vnd.tiddlywiki\"];\n\t\treturn !!contentTypeInfo && contentTypeInfo.encoding === \"base64\";\n\t} else {\n\t\treturn null;\n\t}\n};\n\n/*\nLike addTiddler() except it will silently reject any plugin tiddlers that are older than the currently loaded version. Returns true if the tiddler was imported\n*/\nexports.importTiddler = function(tiddler) {\n\tvar existingTiddler = this.getTiddler(tiddler.fields.title);\n\t// Check if we're dealing with a plugin\n\tif(tiddler && tiddler.hasField(\"plugin-type\") && tiddler.hasField(\"version\") && existingTiddler && existingTiddler.hasField(\"plugin-type\") && existingTiddler.hasField(\"version\")) {\n\t\t// Reject the incoming plugin if it is older\n\t\tif(!$tw.utils.checkVersions(tiddler.fields.version,existingTiddler.fields.version)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\t// Fall through to adding the tiddler\n\tthis.addTiddler(tiddler);\n\treturn true;\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is created\n*/\nexports.getCreationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = {\n\t\t\t\tcreated: new Date()\n\t\t\t},\n\t\t\tcreator = this.getTiddlerText(USER_NAME_TITLE);\n\t\tif(creator) {\n\t\t\tfields.creator = creator;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a hashmap of the fields that should be set when a tiddler is modified\n*/\nexports.getModificationFields = function() {\n\tif(this.getTiddlerText(TIMESTAMP_DISABLE_TITLE,\"\").toLowerCase() !== \"yes\") {\n\t\tvar fields = Object.create(null),\n\t\t\tmodifier = this.getTiddlerText(USER_NAME_TITLE);\n\t\tfields.modified = new Date();\n\t\tif(modifier) {\n\t\t\tfields.modifier = modifier;\n\t\t}\n\t\treturn fields;\n\t} else {\n\t\treturn {};\n\t}\n};\n\n/*\nReturn a sorted array of tiddler titles. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.getTiddlers = function(options) {\n\toptions = options || Object.create(null);\n\tvar self = this,\n\t\tsortField = options.sortField || \"title\",\n\t\ttiddlers = [], t, titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tif(options.includeSystem || !self.isSystemTiddler(title)) {\n\t\t\tif(!options.excludeTag || !tiddler.hasTag(options.excludeTag)) {\n\t\t\t\ttiddlers.push(tiddler);\n\t\t\t}\n\t\t}\n\t});\n\ttiddlers.sort(function(a,b) {\n\t\tvar aa = a.fields[sortField].toLowerCase() || \"\",\n\t\t\tbb = b.fields[sortField].toLowerCase() || \"\";\n\t\tif(aa < bb) {\n\t\t\treturn -1;\n\t\t} else {\n\t\t\tif(aa > bb) {\n\t\t\t\treturn 1;\n\t\t\t} else {\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t});\n\tfor(t=0; t<tiddlers.length; t++) {\n\t\ttitles.push(tiddlers[t].fields.title);\n\t}\n\treturn titles;\n};\n\nexports.countTiddlers = function(excludeTag) {\n\tvar tiddlers = this.getTiddlers({excludeTag: excludeTag});\n\treturn $tw.utils.count(tiddlers);\n};\n\n/*\nReturns a function iterator(callback) that iterates through the specified titles, and invokes the callback with callback(tiddler,title)\n*/\nexports.makeTiddlerIterator = function(titles) {\n\tvar self = this;\n\tif(!$tw.utils.isArray(titles)) {\n\t\ttitles = Object.keys(titles);\n\t} else {\n\t\ttitles = titles.slice(0);\n\t}\n\treturn function(callback) {\n\t\ttitles.forEach(function(title) {\n\t\t\tcallback(self.getTiddler(title),title);\n\t\t});\n\t};\n};\n\n/*\nSort an array of tiddler titles by a specified field\n\ttitles: array of titles (sorted in place)\n\tsortField: name of field to sort by\n\tisDescending: true if the sort should be descending\n\tisCaseSensitive: true if the sort should consider upper and lower case letters to be different\n*/\nexports.sortTiddlers = function(titles,sortField,isDescending,isCaseSensitive,isNumeric,isAlphaNumeric) {\n\tvar self = this;\n\ttitles.sort(function(a,b) {\n\t\tvar x,y,\n\t\t\tcompareNumbers = function(x,y) {\n\t\t\t\tvar result = \n\t\t\t\t\tisNaN(x) && !isNaN(y) ? (isDescending ? -1 : 1) :\n\t\t\t\t\t!isNaN(x) && isNaN(y) ? (isDescending ? 1 : -1) :\n\t\t\t\t\t\t\t\t\t\t\t(isDescending ? y - x : x - y);\n\t\t\t\treturn result;\n\t\t\t};\n\t\tif(sortField !== \"title\") {\n\t\t\tvar tiddlerA = self.getTiddler(a),\n\t\t\t\ttiddlerB = self.getTiddler(b);\n\t\t\tif(tiddlerA) {\n\t\t\t\ta = tiddlerA.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\ta = \"\";\n\t\t\t}\n\t\t\tif(tiddlerB) {\n\t\t\t\tb = tiddlerB.fields[sortField] || \"\";\n\t\t\t} else {\n\t\t\t\tb = \"\";\n\t\t\t}\n\t\t}\n\t\tx = Number(a);\n\t\ty = Number(b);\n\t\tif(isNumeric && (!isNaN(x) || !isNaN(y))) {\n\t\t\treturn compareNumbers(x,y);\n\t\t} else if($tw.utils.isDate(a) && $tw.utils.isDate(b)) {\n\t\t\treturn isDescending ? b - a : a - b;\n\t\t} else if(isAlphaNumeric) {\n\t\t\treturn isDescending ? b.localeCompare(a,undefined,{numeric: true,sensitivity: \"base\"}) : a.localeCompare(b,undefined,{numeric: true,sensitivity: \"base\"});\n\t\t} else {\n\t\t\ta = String(a);\n\t\t\tb = String(b);\n\t\t\tif(!isCaseSensitive) {\n\t\t\t\ta = a.toLowerCase();\n\t\t\t\tb = b.toLowerCase();\n\t\t\t}\n\t\t\treturn isDescending ? b.localeCompare(a) : a.localeCompare(b);\n\t\t}\n\t});\n};\n\n/*\nFor every tiddler invoke a callback(title,tiddler) with `this` set to the wiki object. Options include:\nsortField: field to sort by\nexcludeTag: tag to exclude\nincludeSystem: whether to include system tiddlers (defaults to false)\n*/\nexports.forEachTiddler = function(/* [options,]callback */) {\n\tvar arg = 0,\n\t\toptions = arguments.length >= 2 ? arguments[arg++] : {},\n\t\tcallback = arguments[arg++],\n\t\ttitles = this.getTiddlers(options),\n\t\tt, tiddler;\n\tfor(t=0; t<titles.length; t++) {\n\t\ttiddler = this.getTiddler(titles[t]);\n\t\tif(tiddler) {\n\t\t\tcallback.call(this,tiddler.fields.title,tiddler);\n\t\t}\n\t}\n};\n\n/*\nReturn an array of tiddler titles that are directly linked within the given parse tree\n */\nexports.extractLinks = function(parseTreeRoot) {\n\t// Count up the links\n\tvar links = [],\n\t\tcheckParseTree = function(parseTree) {\n\t\t\tfor(var t=0; t<parseTree.length; t++) {\n\t\t\t\tvar parseTreeNode = parseTree[t];\n\t\t\t\tif(parseTreeNode.type === \"link\" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === \"string\") {\n\t\t\t\t\tvar value = parseTreeNode.attributes.to.value;\n\t\t\t\t\tif(links.indexOf(value) === -1) {\n\t\t\t\t\t\tlinks.push(value);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(parseTreeNode.children) {\n\t\t\t\t\tcheckParseTree(parseTreeNode.children);\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\tcheckParseTree(parseTreeRoot);\n\treturn links;\n};\n\n/*\nReturn an array of tiddler titles that are directly linked from the specified tiddler\n*/\nexports.getTiddlerLinks = function(title) {\n\tvar self = this;\n\t// We'll cache the links so they only get computed if the tiddler changes\n\treturn this.getCacheForTiddler(title,\"links\",function() {\n\t\t// Parse the tiddler\n\t\tvar parser = self.parseTiddler(title);\n\t\tif(parser) {\n\t\t\treturn self.extractLinks(parser.tree);\n\t\t}\n\t\treturn [];\n\t});\n};\n\n/*\nReturn an array of tiddler titles that link to the specified tiddler\n*/\nexports.getTiddlerBacklinks = function(targetTitle) {\n\tvar self = this,\n\t\tbacklinksIndexer = this.getIndexer(\"BacklinksIndexer\"),\n\t\tbacklinks = backlinksIndexer && backlinksIndexer.lookup(targetTitle);\n\n\tif(!backlinks) {\n\t\tbacklinks = [];\n\t\tthis.forEachTiddler(function(title,tiddler) {\n\t\t\tvar links = self.getTiddlerLinks(title);\n\t\t\tif(links.indexOf(targetTitle) !== -1) {\n\t\t\t\tbacklinks.push(title);\n\t\t\t}\n\t\t});\n\t}\n\treturn backlinks;\n};\n\n/*\nReturn a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced\n*/\nexports.getMissingTitles = function() {\n\tvar self = this,\n\t\tmissing = [];\n// We should cache the missing tiddler list, even if we recreate it every time any tiddler is modified\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tif((!self.tiddlerExists(link) && !self.isShadowTiddler(link)) && missing.indexOf(link) === -1) {\n\t\t\t\tmissing.push(link);\n\t\t\t}\n\t\t});\n\t});\n\treturn missing;\n};\n\nexports.getOrphanTitles = function() {\n\tvar self = this,\n\t\torphans = this.getTiddlers();\n\tthis.forEachTiddler(function(title,tiddler) {\n\t\tvar links = self.getTiddlerLinks(title);\n\t\t$tw.utils.each(links,function(link) {\n\t\t\tvar p = orphans.indexOf(link);\n\t\t\tif(p !== -1) {\n\t\t\t\torphans.splice(p,1);\n\t\t\t}\n\t\t});\n\t});\n\treturn orphans; // Todo\n};\n\n/*\nRetrieves a list of the tiddler titles that are tagged with a given tag\n*/\nexports.getTiddlersWithTag = function(tag) {\n\t// Try to use the indexer\n\tvar self = this,\n\t\ttagIndexer = this.getIndexer(\"TagIndexer\"),\n\t\tresults = tagIndexer && tagIndexer.subIndexers[3].lookup(tag);\n\tif(!results) {\n\t\t// If not available, perform a manual scan\n\t\tresults = this.getGlobalCache(\"taglist-\" + tag,function() {\n\t\t\tvar tagmap = self.getTagMap();\n\t\t\treturn self.sortByList(tagmap[tag],tag);\n\t\t});\n\t}\n\treturn results;\n};\n\n/*\nGet a hashmap by tag of arrays of tiddler titles\n*/\nexports.getTagMap = function() {\n\tvar self = this;\n\treturn this.getGlobalCache(\"tagmap\",function() {\n\t\tvar tags = Object.create(null),\n\t\t\tstoreTags = function(tagArray,title) {\n\t\t\t\tif(tagArray) {\n\t\t\t\t\tfor(var index=0; index<tagArray.length; index++) {\n\t\t\t\t\t\tvar tag = tagArray[index];\n\t\t\t\t\t\tif($tw.utils.hop(tags,tag)) {\n\t\t\t\t\t\t\ttags[tag].push(title);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttags[tag] = [title];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\ttitle, tiddler;\n\t\t// Collect up all the tags\n\t\tself.eachShadow(function(tiddler,title) {\n\t\t\tif(!self.tiddlerExists(title)) {\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t\t}\n\t\t});\n\t\tself.each(function(tiddler,title) {\n\t\t\tstoreTags(tiddler.fields.tags,title);\n\t\t});\n\t\treturn tags;\n\t});\n};\n\n/*\nLookup a given tiddler and return a list of all the tiddlers that include it in the specified list field\n*/\nexports.findListingsOfTiddler = function(targetTitle,fieldName) {\n\tfieldName = fieldName || \"list\";\n\tvar titles = [];\n\tthis.each(function(tiddler,title) {\n\t\tvar list = $tw.utils.parseStringArray(tiddler.fields[fieldName]);\n\t\tif(list && list.indexOf(targetTitle) !== -1) {\n\t\t\ttitles.push(title);\n\t\t}\n\t});\n\treturn titles;\n};\n\n/*\nSorts an array of tiddler titles according to an ordered list\n*/\nexports.sortByList = function(array,listTitle) {\n\tvar self = this,\n\t\treplacedTitles = Object.create(null);\n\t// Given a title, this function will place it in the correct location\n\t// within titles.\n\tfunction moveItemInList(title) {\n\t\tif(!$tw.utils.hop(replacedTitles, title)) {\n\t\t\treplacedTitles[title] = true;\n\t\t\tvar newPos = -1,\n\t\t\t\ttiddler = self.getTiddler(title);\n\t\t\tif(tiddler) {\n\t\t\t\tvar beforeTitle = tiddler.fields[\"list-before\"],\n\t\t\t\t\tafterTitle = tiddler.fields[\"list-after\"];\n\t\t\t\tif(beforeTitle === \"\") {\n\t\t\t\t\tnewPos = 0;\n\t\t\t\t} else if(afterTitle === \"\") {\n\t\t\t\t\tnewPos = titles.length;\n\t\t\t\t} else if(beforeTitle) {\n\t\t\t\t\t// if this title is placed relative\n\t\t\t\t\t// to another title, make sure that\n\t\t\t\t\t// title is placed before we place\n\t\t\t\t\t// this one.\n\t\t\t\t\tmoveItemInList(beforeTitle);\n\t\t\t\t\tnewPos = titles.indexOf(beforeTitle);\n\t\t\t\t} else if(afterTitle) {\n\t\t\t\t\t// Same deal\n\t\t\t\t\tmoveItemInList(afterTitle);\n\t\t\t\t\tnewPos = titles.indexOf(afterTitle);\n\t\t\t\t\tif(newPos >= 0) {\n\t\t\t\t\t\t++newPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// If a new position is specified, let's move it\n\t\t\t\tif (newPos !== -1) {\n\t\t\t\t\t// get its current Pos, and make sure\n\t\t\t\t\t// sure that it's _actually_ in the list\n\t\t\t\t\t// and that it would _actually_ move\n\t\t\t\t\t// (#4275) We don't bother calling\n\t\t\t\t\t// indexOf unless we have a new\n\t\t\t\t\t// position to work with\n\t\t\t\t\tvar currPos = titles.indexOf(title);\n\t\t\t\t\tif(currPos >= 0 && newPos !== currPos) {\n\t\t\t\t\t\t// move it!\n\t\t\t\t\t\ttitles.splice(currPos,1);\n\t\t\t\t\t\tif(newPos >= currPos) {\n\t\t\t\t\t\t\tnewPos--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttitles.splice(newPos,0,title);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tvar list = this.getTiddlerList(listTitle);\n\tif(!array || array.length === 0) {\n\t\treturn [];\n\t} else {\n\t\tvar titles = [], t, title;\n\t\t// First place any entries that are present in the list\n\t\tfor(t=0; t<list.length; t++) {\n\t\t\ttitle = list[t];\n\t\t\tif(array.indexOf(title) !== -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Then place any remaining entries\n\t\tfor(t=0; t<array.length; t++) {\n\t\t\ttitle = array[t];\n\t\t\tif(list.indexOf(title) === -1) {\n\t\t\t\ttitles.push(title);\n\t\t\t}\n\t\t}\n\t\t// Finally obey the list-before and list-after fields of each tiddler in turn\n\t\tvar sortedTitles = titles.slice(0);\n\t\tfor(t=0; t<sortedTitles.length; t++) {\n\t\t\ttitle = sortedTitles[t];\n\t\t\tmoveItemInList(title);\n\t\t}\n\t\treturn titles;\n\t}\n};\n\nexports.getSubTiddler = function(title,subTiddlerTitle) {\n\tvar bundleInfo = this.getPluginInfo(title) || this.getTiddlerDataCached(title);\n\tif(bundleInfo && bundleInfo.tiddlers) {\n\t\tvar subTiddler = bundleInfo.tiddlers[subTiddlerTitle];\n\t\tif(subTiddler) {\n\t\t\treturn new $tw.Tiddler(subTiddler);\n\t\t}\n\t}\n\treturn null;\n};\n\n/*\nRetrieve a tiddler as a JSON string of the fields\n*/\nexports.getTiddlerAsJson = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\tvar fields = Object.create(null);\n\t\t$tw.utils.each(tiddler.fields,function(value,name) {\n\t\t\tfields[name] = tiddler.getFieldString(name);\n\t\t});\n\t\treturn JSON.stringify(fields);\n\t} else {\n\t\treturn JSON.stringify({title: title});\n\t}\n};\n\nexports.getTiddlersAsJson = function(filter,spaces) {\n\tvar tiddlers = this.filterTiddlers(filter),\n\t\tspaces = (spaces === undefined) ? $tw.config.preferences.jsonSpaces : spaces,\n\t\tdata = [];\n\tfor(var t=0;t<tiddlers.length; t++) {\n\t\tvar tiddler = this.getTiddler(tiddlers[t]);\n\t\tif(tiddler) {\n\t\t\tvar fields = new Object();\n\t\t\tfor(var field in tiddler.fields) {\n\t\t\t\tfields[field] = tiddler.getFieldString(field);\n\t\t\t}\n\t\t\tdata.push(fields);\n\t\t}\n\t}\n\treturn JSON.stringify(data,null,spaces);\n};\n\n/*\nGet the content of a tiddler as a JavaScript object. How this is done depends on the type of the tiddler:\n\napplication/json: the tiddler JSON is parsed into an object\napplication/x-tiddler-dictionary: the tiddler is parsed as sequence of name:value pairs\n\nOther types currently just return null.\n\ntitleOrTiddler: string tiddler title or a tiddler object\ndefaultData: default data to be returned if the tiddler is missing or doesn't contain data\n\nNote that the same value is returned for repeated calls for the same tiddler data. The value is frozen to prevent modification; otherwise modifications would be visible to all callers\n*/\nexports.getTiddlerDataCached = function(titleOrTiddler,defaultData) {\n\tvar self = this,\n\t\ttiddler = titleOrTiddler;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler) {\n\t\treturn this.getCacheForTiddler(tiddler.fields.title,\"data\",function() {\n\t\t\t// Return the frozen value\n\t\t\tvar value = self.getTiddlerData(tiddler.fields.title,undefined);\n\t\t\t$tw.utils.deepFreeze(value);\n\t\t\treturn value;\n\t\t}) || defaultData;\n\t} else {\n\t\treturn defaultData;\n\t}\n};\n\n/*\nAlternative, uncached version of getTiddlerDataCached(). The return value can be mutated freely and reused\n*/\nexports.getTiddlerData = function(titleOrTiddler,defaultData) {\n\tvar tiddler = titleOrTiddler,\n\t\tdata;\n\tif(!(tiddler instanceof $tw.Tiddler)) {\n\t\ttiddler = this.getTiddler(tiddler);\t\n\t}\n\tif(tiddler && tiddler.fields.text) {\n\t\tswitch(tiddler.fields.type) {\n\t\t\tcase \"application/json\":\n\t\t\t\t// JSON tiddler\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(tiddler.fields.text);\n\t\t\t\t} catch(ex) {\n\t\t\t\t\treturn defaultData;\n\t\t\t\t}\n\t\t\t\treturn data;\n\t\t\tcase \"application/x-tiddler-dictionary\":\n\t\t\t\treturn $tw.utils.parseFields(tiddler.fields.text);\n\t\t}\n\t}\n\treturn defaultData;\n};\n\n/*\nExtract an indexed field from within a data tiddler\n*/\nexports.extractTiddlerDataItem = function(titleOrTiddler,index,defaultText) {\n\tvar data = this.getTiddlerDataCached(titleOrTiddler,Object.create(null)),\n\t\ttext;\n\tif(data && $tw.utils.hop(data,index)) {\n\t\ttext = data[index];\n\t}\n\tif(typeof text === \"string\" || typeof text === \"number\") {\n\t\treturn text.toString();\n\t} else {\n\t\treturn defaultText;\n\t}\n};\n\n/*\nSet a tiddlers content to a JavaScript object. Currently this is done by setting the tiddler's type to \"application/json\" and setting the text to the JSON text of the data.\ntitle: title of tiddler\ndata: object that can be serialised to JSON\nfields: optional hashmap of additional tiddler fields to be set\n*/\nexports.setTiddlerData = function(title,data,fields) {\n\tvar existingTiddler = this.getTiddler(title),\n\t\tnewFields = {\n\t\t\ttitle: title\n\t};\n\tif(existingTiddler && existingTiddler.fields.type === \"application/x-tiddler-dictionary\") {\n\t\tnewFields.text = $tw.utils.makeTiddlerDictionary(data);\n\t} else {\n\t\tnewFields.type = \"application/json\";\n\t\tnewFields.text = JSON.stringify(data,null,$tw.config.preferences.jsonSpaces);\n\t}\n\tthis.addTiddler(new $tw.Tiddler(this.getCreationFields(),existingTiddler,fields,newFields,this.getModificationFields()));\n};\n\n/*\nReturn the content of a tiddler as an array containing each line\n*/\nexports.getTiddlerList = function(title,field,index) {\n\tif(index) {\n\t\treturn $tw.utils.parseStringArray(this.extractTiddlerDataItem(title,index,\"\"));\n\t}\n\tfield = field || \"list\";\n\tvar tiddler = this.getTiddler(title);\n\tif(tiddler) {\n\t\treturn ($tw.utils.parseStringArray(tiddler.fields[field]) || []).slice(0);\n\t}\n\treturn [];\n};\n\n// Return a named global cache object. Global cache objects are cleared whenever a tiddler change occurs\nexports.getGlobalCache = function(cacheName,initializer) {\n\tthis.globalCache = this.globalCache || Object.create(null);\n\tif($tw.utils.hop(this.globalCache,cacheName)) {\n\t\treturn this.globalCache[cacheName];\n\t} else {\n\t\tthis.globalCache[cacheName] = initializer();\n\t\treturn this.globalCache[cacheName];\n\t}\n};\n\nexports.clearGlobalCache = function() {\n\tthis.globalCache = Object.create(null);\n};\n\n// Return the named cache object for a tiddler. If the cache doesn't exist then the initializer function is invoked to create it\nexports.getCacheForTiddler = function(title,cacheName,initializer) {\n\tthis.caches = this.caches || Object.create(null);\n\tvar caches = this.caches[title];\n\tif(caches && caches[cacheName]) {\n\t\treturn caches[cacheName];\n\t} else {\n\t\tif(!caches) {\n\t\t\tcaches = Object.create(null);\n\t\t\tthis.caches[title] = caches;\n\t\t}\n\t\tcaches[cacheName] = initializer();\n\t\treturn caches[cacheName];\n\t}\n};\n\n// Clear all caches associated with a particular tiddler, or, if the title is null, clear all the caches for all the tiddlers\nexports.clearCache = function(title) {\n\tif(title) {\n\t\tthis.caches = this.caches || Object.create(null);\n\t\tif($tw.utils.hop(this.caches,title)) {\n\t\t\tdelete this.caches[title];\n\t\t}\n\t} else {\n\t\tthis.caches = Object.create(null);\n\t}\n};\n\nexports.initParsers = function(moduleType) {\n\t// Install the parser modules\n\t$tw.Wiki.parsers = {};\n\tvar self = this;\n\t$tw.modules.forEachModuleOfType(\"parser\",function(title,module) {\n\t\tfor(var f in module) {\n\t\t\tif($tw.utils.hop(module,f)) {\n\t\t\t\t$tw.Wiki.parsers[f] = module[f]; // Store the parser class\n\t\t\t}\n\t\t}\n\t});\n\t// Use the generic binary parser for any binary types not registered so far\n\tif($tw.Wiki.parsers[\"application/octet-stream\"]) {\n\t\tObject.keys($tw.config.contentTypeInfo).forEach(function(type) {\n\t\t\tif(!$tw.utils.hop($tw.Wiki.parsers,type) && $tw.config.contentTypeInfo[type].encoding === \"base64\") {\n\t\t\t\t$tw.Wiki.parsers[type] = $tw.Wiki.parsers[\"application/octet-stream\"];\n\t\t\t}\n\t\t});\t\t\n\t}\n};\n\n/*\nParse a block of text of a specified MIME type\n\ttype: content type of text to be parsed\n\ttext: text\n\toptions: see below\nOptions include:\n\tparseAsInline: if true, the text of the tiddler will be parsed as an inline run\n\t_canonical_uri: optional string of the canonical URI of this content\n*/\nexports.parseText = function(type,text,options) {\n\ttext = text || \"\";\n\toptions = options || {};\n\t// Select a parser\n\tvar Parser = $tw.Wiki.parsers[type];\n\tif(!Parser && $tw.utils.getFileExtensionInfo(type)) {\n\t\tParser = $tw.Wiki.parsers[$tw.utils.getFileExtensionInfo(type).type];\n\t}\n\tif(!Parser) {\n\t\tParser = $tw.Wiki.parsers[options.defaultType || \"text/vnd.tiddlywiki\"];\n\t}\n\tif(!Parser) {\n\t\treturn null;\n\t}\n\t// Return the parser instance\n\treturn new Parser(type,text,{\n\t\tparseAsInline: options.parseAsInline,\n\t\twiki: this,\n\t\t_canonical_uri: options._canonical_uri\n\t});\n};\n\n/*\nParse a tiddler according to its MIME type\n*/\nexports.parseTiddler = function(title,options) {\n\toptions = $tw.utils.extend({},options);\n\tvar cacheType = options.parseAsInline ? \"inlineParseTree\" : \"blockParseTree\",\n\t\ttiddler = this.getTiddler(title),\n\t\tself = this;\n\treturn tiddler ? this.getCacheForTiddler(title,cacheType,function() {\n\t\t\tif(tiddler.hasField(\"_canonical_uri\")) {\n\t\t\t\toptions._canonical_uri = tiddler.fields._canonical_uri;\n\t\t\t}\n\t\t\treturn self.parseText(tiddler.fields.type,tiddler.fields.text,options);\n\t\t}) : null;\n};\n\nexports.parseTextReference = function(title,field,index,options) {\n\tvar tiddler,text;\n\tif(options.subTiddler) {\n\t\ttiddler = this.getSubTiddler(title,options.subTiddler);\n\t} else {\n\t\ttiddler = this.getTiddler(title);\n\t\tif(field === \"text\" || (!field && !index)) {\n\t\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\t\treturn this.parseTiddler(title,options);\n\t\t}\n\t}\n\tif(field === \"text\" || (!field && !index)) {\n\t\tif(tiddler && tiddler.fields) {\n\t\t\treturn this.parseText(tiddler.fields.type,tiddler.fields.text,options);\t\t\t\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t} else if(field) {\n\t\tif(field === \"title\") {\n\t\t\ttext = title;\n\t\t} else {\n\t\t\tif(!tiddler || !tiddler.hasField(field)) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\ttext = tiddler.fields[field];\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text.toString(),options);\n\t} else if(index) {\n\t\tthis.getTiddlerText(title); // Force the tiddler to be lazily loaded\n\t\ttext = this.extractTiddlerDataItem(tiddler,index,undefined);\n\t\tif(text === undefined) {\n\t\t\treturn null;\n\t\t}\n\t\treturn this.parseText(\"text/vnd.tiddlywiki\",text,options);\n\t}\n};\n\n/*\nMake a widget tree for a parse tree\nparser: parser object\noptions: see below\nOptions include:\ndocument: optional document to use\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.makeWidget = function(parser,options) {\n\toptions = options || {};\n\tvar widgetNode = {\n\t\t\ttype: \"widget\",\n\t\t\tchildren: []\n\t\t},\n\t\tcurrWidgetNode = widgetNode;\n\t// Create set variable widgets for each variable\n\t$tw.utils.each(options.variables,function(value,name) {\n\t\tvar setVariableWidget = {\n\t\t\ttype: \"set\",\n\t\t\tattributes: {\n\t\t\t\tname: {type: \"string\", value: name},\n\t\t\t\tvalue: {type: \"string\", value: value}\n\t\t\t},\n\t\t\tchildren: []\n\t\t};\n\t\tcurrWidgetNode.children = [setVariableWidget];\n\t\tcurrWidgetNode = setVariableWidget;\n\t});\n\t// Add in the supplied parse tree nodes\n\tcurrWidgetNode.children = parser ? parser.tree : [];\n\t// Create the widget\n\treturn new widget.widget(widgetNode,{\n\t\twiki: this,\n\t\tdocument: options.document || $tw.fakeDocument,\n\t\tparentWidget: options.parentWidget\n\t});\n};\n\n/*\nMake a widget tree for transclusion\ntitle: target tiddler title\noptions: as for wiki.makeWidget() plus:\noptions.field: optional field to transclude (defaults to \"text\")\noptions.mode: transclusion mode \"inline\" or \"block\"\noptions.recursionMarker : optional flag to set a recursion marker, defaults to \"yes\"\noptions.children: optional array of children for the transclude widget\noptions.importVariables: optional importvariables filter string for macros to be included\noptions.importPageMacros: optional boolean; if true, equivalent to passing \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\" to options.importVariables\n*/\nexports.makeTranscludeWidget = function(title,options) {\n\toptions = options || {};\n\tvar parseTreeDiv = {tree: [{\n\t\t\ttype: \"element\",\n\t\t\ttag: \"div\",\n\t\t\tchildren: []}]},\n\t\tparseTreeImportVariables = {\n\t\t\ttype: \"importvariables\",\n\t\t\tattributes: {\n\t\t\t\tfilter: {\n\t\t\t\t\tname: \"filter\",\n\t\t\t\t\ttype: \"string\"\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: false,\n\t\t\tchildren: []},\n\t\tparseTreeTransclude = {\n\t\t\ttype: \"transclude\",\n\t\t\tattributes: {\n\t\t\t\trecursionMarker: {\n\t\t\t\t\tname: \"recursionMarker\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: options.recursionMarker || \"yes\"\n\t\t\t\t\t},\n\t\t\t\ttiddler: {\n\t\t\t\t\tname: \"tiddler\",\n\t\t\t\t\ttype: \"string\",\n\t\t\t\t\tvalue: title\n\t\t\t\t}\n\t\t\t},\n\t\t\tisBlock: !options.parseAsInline};\n\tif(options.importVariables || options.importPageMacros) {\n\t\tif(options.importVariables) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = options.importVariables;\n\t\t} else if(options.importPageMacros) {\n\t\t\tparseTreeImportVariables.attributes.filter.value = \"[[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\";\n\t\t}\n\t\tparseTreeDiv.tree[0].children.push(parseTreeImportVariables);\n\t\tparseTreeImportVariables.children.push(parseTreeTransclude);\n\t} else {\n\t\tparseTreeDiv.tree[0].children.push(parseTreeTransclude);\n\t}\n\tif(options.field) {\n\t\tparseTreeTransclude.attributes.field = {type: \"string\", value: options.field};\n\t}\n\tif(options.mode) {\n\t\tparseTreeTransclude.attributes.mode = {type: \"string\", value: options.mode};\n\t}\n\tif(options.children) {\n\t\tparseTreeTransclude.children = options.children;\n\t}\n\treturn this.makeWidget(parseTreeDiv,options);\n};\n\n/*\nParse text in a specified format and render it into another format\n\toutputType: content type for the output\n\ttextType: content type of the input text\n\ttext: input text\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderText = function(outputType,textType,text,options) {\n\toptions = options || {};\n\tvar parser = this.parseText(textType,text,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : container.textContent;\n};\n\n/*\nParse text from a tiddler and render it into another format\n\toutputType: content type for the output\n\ttitle: title of the tiddler to be rendered\n\toptions: see below\nOptions include:\nvariables: hashmap of variables to set\nparentWidget: optional parent widget for the root node\n*/\nexports.renderTiddler = function(outputType,title,options) {\n\toptions = options || {};\n\tvar parser = this.parseTiddler(title,options),\n\t\twidgetNode = this.makeWidget(parser,options);\n\tvar container = $tw.fakeDocument.createElement(\"div\");\n\twidgetNode.render(container,null);\n\treturn outputType === \"text/html\" ? container.innerHTML : (outputType === \"text/plain-formatted\" ? container.formattedTextContent : container.textContent);\n};\n\n/*\nReturn an array of tiddler titles that match a search string\n\ttext: The text string to search for\n\toptions: see below\nOptions available:\n\tsource: an iterator function for the source tiddlers, called source(iterator), where iterator is called as iterator(tiddler,title)\n\texclude: An array of tiddler titles to exclude from the search\n\tinvert: If true returns tiddlers that do not contain the specified string\n\tcaseSensitive: If true forces a case sensitive search\n\tfield: If specified, restricts the search to the specified field, or an array of field names\n\tanchored: If true, forces all but regexp searches to be anchored to the start of text\n\texcludeField: If true, the field options are inverted to specify the fields that are not to be searched\n\tThe search mode is determined by the first of these boolean flags to be true\n\t\tliteral: searches for literal string\n\t\twhitespace: same as literal except runs of whitespace are treated as a single space\n\t\tregexp: treats the search term as a regular expression\n\t\twords: (default) treats search string as a list of tokens, and matches if all tokens are found, regardless of adjacency or ordering\n*/\nexports.search = function(text,options) {\n\toptions = options || {};\n\tvar self = this,\n\t\tt,\n\t\tinvert = !!options.invert;\n\t// Convert the search string into a regexp for each term\n\tvar terms, searchTermsRegExps,\n\t\tflags = options.caseSensitive ? \"\" : \"i\",\n\t\tanchor = options.anchored ? \"^\" : \"\";\n\tif(options.literal) {\n\t\tif(text.length === 0) {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(text) + \")\",flags)];\n\t\t}\n\t} else if(options.whitespace) {\n\t\tterms = [];\n\t\t$tw.utils.each(text.split(/\\s+/g),function(term) {\n\t\t\tif(term) {\n\t\t\t\tterms.push($tw.utils.escapeRegExp(term));\n\t\t\t}\n\t\t});\n\t\tsearchTermsRegExps = [new RegExp(\"(\" + anchor + terms.join(\"\\\\s+\") + \")\",flags)];\n\t} else if(options.regexp) {\n\t\ttry {\n\t\t\tsearchTermsRegExps = [new RegExp(\"(\" + text + \")\",flags)];\t\t\t\n\t\t} catch(e) {\n\t\t\tsearchTermsRegExps = null;\n\t\t\tconsole.log(\"Regexp error parsing /(\" + text + \")/\" + flags + \": \",e);\n\t\t}\n\t} else {\n\t\tterms = text.split(/ +/);\n\t\tif(terms.length === 1 && terms[0] === \"\") {\n\t\t\tsearchTermsRegExps = null;\n\t\t} else {\n\t\t\tsearchTermsRegExps = [];\n\t\t\tfor(t=0; t<terms.length; t++) {\n\t\t\t\tsearchTermsRegExps.push(new RegExp(\"(\" + anchor + $tw.utils.escapeRegExp(terms[t]) + \")\",flags));\n\t\t\t}\n\t\t}\n\t}\n\t// Accumulate the array of fields to be searched or excluded from the search\n\tvar fields = [];\n\tif(options.field) {\n\t\tif($tw.utils.isArray(options.field)) {\n\t\t\t$tw.utils.each(options.field,function(fieldName) {\n\t\t\t\tif(fieldName) {\n\t\t\t\t\tfields.push(fieldName);\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tfields.push(options.field);\n\t\t}\n\t}\n\t// Use default fields if none specified and we're not excluding fields (excluding fields with an empty field array is the same as searching all fields)\n\tif(fields.length === 0 && !options.excludeField) {\n\t\tfields.push(\"title\");\n\t\tfields.push(\"tags\");\n\t\tfields.push(\"text\");\n\t}\n\t// Function to check a given tiddler for the search term\n\tvar searchTiddler = function(title) {\n\t\tif(!searchTermsRegExps) {\n\t\t\treturn true;\n\t\t}\n\t\tvar notYetFound = searchTermsRegExps.slice();\n\n\t\tvar tiddler = self.getTiddler(title);\n\t\tif(!tiddler) {\n\t\t\ttiddler = new $tw.Tiddler({title: title, text: \"\", type: \"text/vnd.tiddlywiki\"});\n\t\t}\n\t\tvar contentTypeInfo = $tw.config.contentTypeInfo[tiddler.fields.type] || $tw.config.contentTypeInfo[\"text/vnd.tiddlywiki\"],\n\t\t\tsearchFields;\n\t\t// Get the list of fields we're searching\n\t\tif(options.excludeField) {\n\t\t\tsearchFields = Object.keys(tiddler.fields);\n\t\t\t$tw.utils.each(fields,function(fieldName) {\n\t\t\t\tvar p = searchFields.indexOf(fieldName);\n\t\t\t\tif(p !== -1) {\n\t\t\t\t\tsearchFields.splice(p,1);\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tsearchFields = fields;\n\t\t}\n\t\tfor(var fieldIndex=0; notYetFound.length>0 && fieldIndex<searchFields.length; fieldIndex++) {\n\t\t\t// Don't search the text field if the content type is binary\n\t\t\tvar fieldName = searchFields[fieldIndex];\n\t\t\tif(fieldName === \"text\" && contentTypeInfo.encoding !== \"utf8\") {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tvar str = tiddler.fields[fieldName],\n\t\t\t\tt;\n\t\t\tif(str) {\n\t\t\t\tif($tw.utils.isArray(str)) {\n\t\t\t\t\t// If the field value is an array, test each regexp against each field array entry and fail if each regexp doesn't match at least one field array entry\n\t\t\t\t\tfor(var s=0; s<str.length; s++) {\n\t\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\t\tif(notYetFound[t].test(str[s])) {\n\t\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// If the field isn't an array, force it to a string and test each regexp against it and fail if any do not match\n\t\t\t\t\tstr = tiddler.getFieldString(fieldName);\n\t\t\t\t\tfor(t=0; t<notYetFound.length;) {\n\t\t\t\t\t\tif(notYetFound[t].test(str)) {\n\t\t\t\t\t\t\tnotYetFound.splice(t, 1);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tt++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn notYetFound.length == 0;\n\t};\n\t// Loop through all the tiddlers doing the search\n\tvar results = [],\n\t\tsource = options.source || this.each;\n\tsource(function(tiddler,title) {\n\t\tif(searchTiddler(title) !== options.invert) {\n\t\t\tresults.push(title);\n\t\t}\n\t});\n\t// Remove any of the results we have to exclude\n\tif(options.exclude) {\n\t\tfor(t=0; t<options.exclude.length; t++) {\n\t\t\tvar p = results.indexOf(options.exclude[t]);\n\t\t\tif(p !== -1) {\n\t\t\t\tresults.splice(p,1);\n\t\t\t}\n\t\t}\n\t}\n\treturn results;\n};\n\n/*\nTrigger a load for a tiddler if it is skinny. Returns the text, or undefined if the tiddler is missing, null if the tiddler is being lazily loaded.\n*/\nexports.getTiddlerText = function(title,defaultText) {\n\tvar tiddler = this.getTiddler(title);\n\t// Return undefined if the tiddler isn't found\n\tif(!tiddler) {\n\t\treturn defaultText;\n\t}\n\tif(!tiddler.hasField(\"_is_skinny\")) {\n\t\t// Just return the text if we've got it\n\t\treturn tiddler.fields.text || \"\";\n\t} else {\n\t\t// Tell any listeners about the need to lazily load this tiddler\n\t\tthis.dispatchEvent(\"lazyLoad\",title);\n\t\t// Indicate that the text is being loaded\n\t\treturn null;\n\t}\n};\n\n/*\nCheck whether the text of a tiddler matches a given value. By default, the comparison is case insensitive, and any spaces at either end of the tiddler text is trimmed\n*/\nexports.checkTiddlerText = function(title,targetText,options) {\n\toptions = options || {};\n\tvar text = this.getTiddlerText(title,\"\");\n\tif(!options.noTrim) {\n\t\ttext = text.trim();\n\t}\n\tif(!options.caseSensitive) {\n\t\ttext = text.toLowerCase();\n\t\ttargetText = targetText.toLowerCase();\n\t}\n\treturn text === targetText;\n}\n\n/*\nRead an array of browser File objects, invoking callback(tiddlerFieldsArray) once they're all read\n*/\nexports.readFiles = function(files,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\tvar result = [],\n\t\toutstanding = files.length,\n\t\treadFileCallback = function(tiddlerFieldsArray) {\n\t\t\tresult.push.apply(result,tiddlerFieldsArray);\n\t\t\tif(--outstanding === 0) {\n\t\t\t\tcallback(result);\n\t\t\t}\n\t\t};\n\tfor(var f=0; f<files.length; f++) {\n\t\tthis.readFile(files[f],$tw.utils.extend({},options,{callback: readFileCallback}));\n\t}\n\treturn files.length;\n};\n\n/*\nRead a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFile = function(file,options) {\n\tvar callback;\n\tif(typeof options === \"function\") {\n\t\tcallback = options;\n\t\toptions = {};\n\t} else {\n\t\tcallback = options.callback;\n\t}\n\t// Get the type, falling back to the filename extension\n\tvar self = this,\n\t\ttype = file.type;\n\tif(type === \"\" || !type) {\n\t\tvar dotPos = file.name.lastIndexOf(\".\");\n\t\tif(dotPos !== -1) {\n\t\t\tvar fileExtensionInfo = $tw.utils.getFileExtensionInfo(file.name.substr(dotPos));\n\t\t\tif(fileExtensionInfo) {\n\t\t\t\ttype = fileExtensionInfo.type;\n\t\t\t}\n\t\t}\n\t}\n\t// Figure out if we're reading a binary file\n\tvar contentTypeInfo = $tw.config.contentTypeInfo[type],\n\t\tisBinary = contentTypeInfo ? contentTypeInfo.encoding === \"base64\" : false;\n\t// Log some debugging information\n\tif($tw.log.IMPORT) {\n\t\tconsole.log(\"Importing file '\" + file.name + \"', type: '\" + type + \"', isBinary: \" + isBinary);\n\t}\n\t// Give the hook a chance to process the drag\n\tif($tw.hooks.invokeHook(\"th-importing-file\",{\n\t\tfile: file,\n\t\ttype: type,\n\t\tisBinary: isBinary,\n\t\tcallback: callback\n\t}) !== true) {\n\t\tthis.readFileContent(file,type,isBinary,options.deserializer,callback);\n\t}\n};\n\n/*\nLower level utility to read the content of a browser File object, invoking callback(tiddlerFieldsArray) with an array of tiddler fields objects\n*/\nexports.readFileContent = function(file,type,isBinary,deserializer,callback) {\n\tvar self = this;\n\t// Create the FileReader\n\tvar reader = new FileReader();\n\t// Onload\n\treader.onload = function(event) {\n\t\tvar text = event.target.result,\n\t\t\ttiddlerFields = {title: file.name || \"Untitled\"};\n\t\tif(isBinary) {\n\t\t\tvar commaPos = text.indexOf(\",\");\n\t\t\tif(commaPos !== -1) {\n\t\t\t\ttext = text.substr(commaPos + 1);\n\t\t\t}\n\t\t}\n\t\t// Check whether this is an encrypted TiddlyWiki file\n\t\tvar encryptedJson = $tw.utils.extractEncryptedStoreArea(text);\n\t\tif(encryptedJson) {\n\t\t\t// If so, attempt to decrypt it with the current password\n\t\t\t$tw.utils.decryptStoreAreaInteractive(encryptedJson,function(tiddlers) {\n\t\t\t\tcallback(tiddlers);\n\t\t\t});\n\t\t} else {\n\t\t\t// Otherwise, just try to deserialise any tiddlers in the file\n\t\t\tcallback(self.deserializeTiddlers(type,text,tiddlerFields,{deserializer: deserializer}));\n\t\t}\n\t};\n\t// Kick off the read\n\tif(isBinary) {\n\t\treader.readAsDataURL(file);\n\t} else {\n\t\treader.readAsText(file);\n\t}\n};\n\n/*\nFind any existing draft of a specified tiddler\n*/\nexports.findDraft = function(targetTitle) {\n\tvar draftTitle = undefined;\n\tthis.forEachTiddler({includeSystem: true},function(title,tiddler) {\n\t\tif(tiddler.fields[\"draft.title\"] && tiddler.fields[\"draft.of\"] === targetTitle) {\n\t\t\tdraftTitle = title;\n\t\t}\n\t});\n\treturn draftTitle;\n}\n\n/*\nCheck whether the specified draft tiddler has been modified.\nIf the original tiddler doesn't exist, create a vanilla tiddler variable,\nto check if additional fields have been added.\n*/\nexports.isDraftModified = function(title) {\n\tvar tiddler = this.getTiddler(title);\n\tif(!tiddler.isDraft()) {\n\t\treturn false;\n\t}\n\tvar ignoredFields = [\"created\", \"modified\", \"title\", \"draft.title\", \"draft.of\"],\n\t\torigTiddler = this.getTiddler(tiddler.fields[\"draft.of\"]) || new $tw.Tiddler({text:\"\", tags:[]}),\n\t\ttitleModified = tiddler.fields[\"draft.title\"] !== tiddler.fields[\"draft.of\"];\n\treturn titleModified || !tiddler.isEqual(origTiddler,ignoredFields);\n};\n\n/*\nAdd a new record to the top of the history stack\ntitle: a title string or an array of title strings\nfromPageRect: page coordinates of the origin of the navigation\nhistoryTitle: title of history tiddler (defaults to $:/HistoryList)\n*/\nexports.addToHistory = function(title,fromPageRect,historyTitle) {\n\tvar story = new $tw.Story({wiki: this, historyTitle: historyTitle});\n\tstory.addToHistory(title,fromPageRect);\t\n\tconsole.log(\"$tw.wiki.addToHistory() is deprecated since V5.1.23! Use the this.story.addToHistory() from the story-object!\")\n};\n\n/*\nAdd a new tiddler to the story river\ntitle: a title string or an array of title strings\nfromTitle: the title of the tiddler from which the navigation originated\nstoryTitle: title of story tiddler (defaults to $:/StoryList)\noptions: see story.js\n*/\nexports.addToStory = function(title,fromTitle,storyTitle,options) {\n\tvar story = new $tw.Story({wiki: this, storyTitle: storyTitle});\n\tstory.addToStory(title,fromTitle,options);\n\tconsole.log(\"$tw.wiki.addToStory() is deprecated since V5.1.23! Use the this.story.addToStory() from the story-object!\")\n};\n\n/*\nGenerate a title for the draft of a given tiddler\n*/\nexports.generateDraftTitle = function(title) {\n\tvar c = 0,\n\t\tdraftTitle,\n\t\tusername = this.getTiddlerText(\"$:/status/UserName\"),\n\t\tattribution = username ? \" by \" + username : \"\";\n\tdo {\n\t\tdraftTitle = \"Draft \" + (c ? (c + 1) + \" \" : \"\") + \"of '\" + title + \"'\" + attribution;\n\t\tc++;\n\t} while(this.tiddlerExists(draftTitle));\n\treturn draftTitle;\n};\n\n/*\nInvoke the available upgrader modules\ntitles: array of tiddler titles to be processed\ntiddlers: hashmap by title of tiddler fields of pending import tiddlers. These can be modified by the upgraders. An entry with no fields indicates a tiddler that was pending import has been suppressed. When entries are added to the pending import the tiddlers hashmap may have entries that are not present in the titles array\nReturns a hashmap of messages keyed by tiddler title.\n*/\nexports.invokeUpgraders = function(titles,tiddlers) {\n\t// Collect up the available upgrader modules\n\tvar self = this;\n\tif(!this.upgraderModules) {\n\t\tthis.upgraderModules = [];\n\t\t$tw.modules.forEachModuleOfType(\"upgrader\",function(title,module) {\n\t\t\tif(module.upgrade) {\n\t\t\t\tself.upgraderModules.push(module);\n\t\t\t}\n\t\t});\n\t}\n\t// Invoke each upgrader in turn\n\tvar messages = {};\n\tfor(var t=0; t<this.upgraderModules.length; t++) {\n\t\tvar upgrader = this.upgraderModules[t],\n\t\t\tupgraderMessages = upgrader.upgrade(this,titles,tiddlers);\n\t\t$tw.utils.extend(messages,upgraderMessages);\n\t}\n\treturn messages;\n};\n\n// Determine whether a plugin by title is dynamically loadable\nexports.doesPluginRequireReload = function(title) {\n\treturn this.doesPluginInfoRequireReload(this.getPluginInfo(title) || this.getTiddlerDataCached(title));\n};\n\n// Determine whether a plugin info structure is dynamically loadable\nexports.doesPluginInfoRequireReload = function(pluginInfo) {\n\tif(pluginInfo) {\n\t\tvar foundModule = false;\n\t\t$tw.utils.each(pluginInfo.tiddlers,function(tiddler) {\n\t\t\tif(tiddler.type === \"application/javascript\" && $tw.utils.hop(tiddler,\"module-type\")) {\n\t\t\t\tfoundModule = true;\n\t\t\t}\n\t\t});\n\t\treturn foundModule;\n\t} else {\n\t\treturn null;\n\t}\n};\n\nexports.slugify = function(title,options) {\n\tvar tiddler = this.getTiddler(title),\n\t\tslug;\n\tif(tiddler && tiddler.fields.slug) {\n\t\tslug = tiddler.fields.slug;\n\t} else {\n\t\tslug = $tw.utils.transliterate(title.toString().toLowerCase()) // Replace diacritics with basic lowercase ASCII\n\t\t\t.replace(/\\s+/g,\"-\") // Replace spaces with -\n\t\t\t.replace(/[^\\w\\-\\.]+/g,\"\") // Remove all non-word chars except dash and dot\n\t\t\t.replace(/\\-\\-+/g,\"-\") // Replace multiple - with single -\n\t\t\t.replace(/^-+/,\"\") // Trim - from start of text\n\t\t\t.replace(/-+$/,\"\"); // Trim - from end of text\n\t}\n\t// If the resulting slug is blank (eg because the title is just punctuation characters)\n\tif(!slug) {\n\t\t// ...then just use the character codes of the title\n\t\tvar result = [];\n\t\t$tw.utils.each(title.split(\"\"),function(char) {\n\t\t\tresult.push(char.charCodeAt(0).toString());\n\t\t});\n\t\tslug = result.join(\"-\");\n\t}\n\treturn slug;\n};\n\n})();\n\n",
"type": "application/javascript",
"module-type": "wikimethod"
},
"$:/palettes/Blanca": {
"title": "$:/palettes/Blanca",
"name": "Blanca",
"description": "A clean white palette to let you focus",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #66cccc\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ffffff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #7897f3\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ccc\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #ffffff\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #7897f3\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #eeeeee\ntab-border-selected: #cccccc\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffeedd\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: #eee\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #ff9900\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Blue": {
"title": "$:/palettes/Blue",
"name": "Blue",
"description": "A blue theme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333353\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #ddddff\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #5959c0\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: #ccccdd\ntab-border-selected: #ccccdd\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #eeeeff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #666666\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #ffffff\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #ffffff\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #5959c0\ntoolbar-new-button: #5eb95e\ntoolbar-options-button: rgb(128, 88, 165)\ntoolbar-save-button: #0e90d2\ntoolbar-info-button: #0e90d2\ntoolbar-edit-button: rgb(243, 123, 29)\ntoolbar-close-button: #dd514c\ntoolbar-delete-button: #dd514c\ntoolbar-cancel-button: rgb(243, 123, 29)\ntoolbar-done-button: #5eb95e\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/Muted": {
"title": "$:/palettes/Muted",
"name": "Muted",
"description": "Bright tiddlers on a muted background",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #6f6f70\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #29a6ee\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #c2c1c2\nsidebar-foreground-shadow: rgba(255,255,255,0)\nsidebar-foreground: #d3d2d4\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #6f6f70\nsidebar-tab-background: #666667\nsidebar-tab-border-selected: #999\nsidebar-tab-border: #515151\nsidebar-tab-divider: #999\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #999\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #d1d0d2\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #d5ad34\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/ContrastLight": {
"title": "$:/palettes/ContrastLight",
"name": "Contrast (Light)",
"description": "High contrast and unambiguous (light version)",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #fff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #000\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #000\ntag-foreground: #fff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
},
"$:/palettes/ContrastDark": {
"title": "$:/palettes/ContrastDark",
"name": "Contrast (Dark)",
"description": "High contrast and unambiguous (dark version)",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #f00\nalert-border: <<colour background>>\nalert-highlight: <<colour foreground>>\nalert-muted-foreground: #800\nbackground: #000\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: <<colour background>>\nbutton-foreground: <<colour foreground>>\nbutton-border: <<colour foreground>>\ncode-background: <<colour background>>\ncode-border: <<colour foreground>>\ncode-foreground: <<colour foreground>>\ndirty-indicator: #f00\ndownload-background: #080\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: <<colour foreground>>\ndropdown-tab-background: <<colour foreground>>\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #00a\nexternal-link-foreground: #00e\nforeground: #fff\nmessage-background: <<colour foreground>>\nmessage-border: <<colour background>>\nmessage-foreground: <<colour background>>\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour foreground>>\nmodal-header-border: <<colour foreground>>\nmuted-foreground: <<colour foreground>>\nnotification-background: <<colour background>>\nnotification-border: <<colour foreground>>\npage-background: <<colour background>>\npre-background: <<colour background>>\npre-border: <<colour foreground>>\nprimary: #00f\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: <<colour background>>\nsidebar-controls-foreground: <<colour foreground>>\nsidebar-foreground-shadow: rgba(0,0,0, 0)\nsidebar-foreground: <<colour foreground>>\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: <<colour foreground>>\nsidebar-tab-background-selected: <<colour background>>\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: <<colour foreground>>\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: <<colour foreground>>\nsidebar-tiddler-link-foreground: <<colour primary>>\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: <<colour foreground>>\ntab-border-selected: <<colour foreground>>\ntab-border: <<colour foreground>>\ntab-divider: <<colour foreground>>\ntab-foreground-selected: <<colour foreground>>\ntab-foreground: <<colour background>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #fff\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour foreground>>\ntiddler-controls-foreground-hover: #ddd\ntiddler-controls-foreground-selected: #fdd\ntiddler-controls-foreground: <<colour foreground>>\ntiddler-editor-background: <<colour background>>\ntiddler-editor-border-image: <<colour foreground>>\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: <<colour background>>\ntiddler-editor-fields-odd: <<colour background>>\ntiddler-info-background: <<colour background>>\ntiddler-info-border: <<colour foreground>>\ntiddler-info-tab-background: <<colour background>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour foreground>>\ntiddler-title-foreground: <<colour foreground>>\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour foreground>>\nvery-muted-foreground: #888888\n"
},
"$:/palettes/CupertinoDark": {
"title": "$:/palettes/CupertinoDark",
"tags": "$:/tags/Palette",
"name": "Cupertino Dark",
"description": "A macOS inspired dark palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #FF453A\nalert-border: #FF453A\nalert-highlight: #FFD60A\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #282828\nblockquote-bar: <<colour page-background>>\nbutton-foreground: <<colour background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #FF453A\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour tiddler-info-background>>\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: #3F638B\ndropdown-tab-background: #323232\ndropzone-background: #30D158\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #BF5AF2\nexternal-link-foreground: #32D74B\nforeground: #FFFFFF\nmenubar-background: #464646\nmenubar-foreground: #ffffff\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: #98989D\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #323232\npre-background: #464646\npre-border: transparent\nprimary: #0A84FF\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour background>>\nsidebar-controls-foreground-hover: #FF9F0A\nsidebar-controls-foreground: #8E8E93\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: #3F638B\nsidebar-tab-background: <<colour background>>\nsidebar-tab-border-selected: <<colour background>>\nsidebar-tab-border: <<colour background>>\nsidebar-tab-divider: <<colour background>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: #ffffff\nstatic-alert-foreground: #B4B4B4\ntab-background-selected: #3F638B\ntab-background: <<colour page-background>>\ntab-border-selected: <<colour page-background>>\ntab-border: <<colour page-background>>\ntab-divider: <<colour page-background>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #464646\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #48484A\ntag-foreground: #323232\ntiddler-background: <<colour background>>\ntiddler-border: transparent\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: #48484A\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #1E1E1E\ntiddler-info-border: #1E1E1E\ntiddler-info-tab-background: #3F638B\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: #464646\nselection-background: #3F638B\nselection-foreground: #ffffff\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #3F638B\nwikilist-button-foreground: <<colour foreground>>\nwikilist-button-open: #32D74B\nwikilist-button-open-hover: #32D74B\nwikilist-button-reveal: #0A84FF\nwikilist-button-reveal-hover: #0A84FF\nwikilist-button-remove: #FF453A\nwikilist-button-remove-hover: #FF453A\nwikilist-droplink-dragover: #32D74B\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour foreground>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-url: <<colour muted-foreground>>\n"
},
"$:/palettes/DarkPhotos": {
"title": "$:/palettes/DarkPhotos",
"created": "20150402111612188",
"description": "Good with dark photo backgrounds",
"modified": "20150402112344080",
"name": "DarkPhotos",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background: \nbutton-foreground: \nbutton-border: \ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #ddd\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #336438\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #ccf\nsidebar-controls-foreground: #fff\nsidebar-foreground-shadow: rgba(0,0,0, 0.5)\nsidebar-foreground: #fff\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #eee\nsidebar-tab-background-selected: rgba(255,255,255, 0.8)\nsidebar-tab-background: rgba(255,255,255, 0.4)\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: rgba(255,255,255, 0.2)\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #aaf\nsidebar-tiddler-link-foreground: #ddf\nsite-title-foreground: #fff\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/DesertSand": {
"title": "$:/palettes/DesertSand",
"tags": "$:/tags/Palette",
"name": "Desert Sand",
"description": "A desert sand palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #E9E0C7\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour foreground>>\ncode-background: #F3EDDF\ncode-border: #C3BAA1\ncode-foreground: #ab3250\ndiff-delete-background: #bd8b8b\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #91c093\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ad3434\ndownload-background: #6ca16c\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #E9E0C7\ndropdown-tab-background: #BAB29C\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #313163\nexternal-link-foreground: #555592\nforeground: #2D2A23\nmenubar-background: #CDC2A6\nmenubar-foreground: #5A5446\nmessage-background: #ECE5CF\nmessage-border: #D6CBAA\nmessage-foreground: #5f6e7d\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #8A8885\nmodal-footer-background: #CDC2A6\nmodal-footer-border: #9D998E\nmodal-header-border: #9D998E\nmuted-foreground: #9D998E\nnotification-background: #F0E9D7\nnotification-border: #939189\npage-background: #e0d3af\npre-background: #D6CBAA\npre-border: #CDC2A6\nprimary: #5B6F55\nselection-background: #9D947B\nselection-foreground: <<colour foreground>>\nselect-tag-background: #F0E9D7\nselect-tag-foreground: #2D2A23\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #2D2A23\nsidebar-controls-foreground: #867F69\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #867F69\nsidebar-muted-foreground-hover: #706A58\nsidebar-muted-foreground: #B3A98C\nsidebar-tab-background-selected: #e0d3af\nsidebar-tab-background: #A6A193\nsidebar-tab-border-selected: #C3BAA1\nsidebar-tab-border: #C3BAA1\nsidebar-tab-divider: #CDC2A6\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: #2D2A23\nsidebar-tiddler-link-foreground-hover: #433F35\nsidebar-tiddler-link-foreground: #706A58\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #A6A193\ntab-background-selected: #E9E0C7\ntab-background: #A6A193\ntab-border-selected: #C3BAA1\ntab-border: #C3BAA1\ntab-divider: #CDC2A6\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #2D2A23\ntable-border: #9D998E\ntable-footer-background: #8A8885\ntable-header-background: #B0AA98\ntag-background: #706A58\ntag-foreground: #E3D7B7\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #9D947B\ntiddler-controls-foreground-selected: #706A58\ntiddler-controls-foreground: #C3BAA1\ntiddler-editor-background: #E9E0C7\ntiddler-editor-border-image: #A6A193\ntiddler-editor-border: #A6A193\ntiddler-editor-fields-even: #D6CBAA\ntiddler-editor-fields-odd: #C3BAA1\ntiddler-info-background: #E3D7B7\ntiddler-info-border: #BAB29C\ntiddler-info-tab-background: #E9E0C7\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #867F69\ntiddler-title-foreground: #374464\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #8A8885\nvery-muted-foreground: #CDC2A6\nwikilist-background: <<colour page-background>>\nwikilist-item: #CDC2A6\nwikilist-info: #161512\nwikilist-title: #433F35\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #706A58\nwikilist-button-open: #7db66a\nwikilist-button-open-hover: #56a556\nwikilist-button-reveal: #5a6c9e\nwikilist-button-reveal-hover: #454591\nwikilist-button-remove: #bc5972\nwikilist-button-remove-hover: #814040\nwikilist-toolbar-background: #CDC2A6\nwikilist-toolbar-foreground: #2D2A23\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #A6A193\nwikilist-button-foreground: #161512\n"
},
"$:/palettes/GruvboxDark": {
"title": "$:/palettes/GruvboxDark",
"name": "Gruvbox Dark",
"description": "Retro groove color scheme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"license": "https://github.com/morhetz/gruvbox",
"text": "alert-background: #cc241d\nalert-border: #cc241d\nalert-highlight: #d79921\nalert-muted-foreground: #504945\nbackground: #3c3836\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour page-background>>\ncode-background: #504945\ncode-border: #504945\ncode-foreground: #fb4934\ndiff-delete-background: #fb4934\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #b8bb26\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #fb4934\ndownload-background: #b8bb26\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #665c54\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ebdbb2\ndropdown-tab-background: #665c54\ndropzone-background: #98971a\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #d3869b\nexternal-link-foreground: #8ec07c\nforeground: #fbf1c7\nmenubar-background: #504945\nmenubar-foreground: <<colour foreground>>\nmessage-background: #83a598\nmessage-border: #83a598\nmessage-foreground: #3c3836\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #504945\nmodal-footer-background: #3c3836\nmodal-footer-border: #3c3836\nmodal-header-border: #3c3836\nmuted-foreground: #d5c4a1\nnotification-background: <<colour primary>>\nnotification-border: <<colour primary>>\npage-background: #282828\npre-background: #504945\npre-border: #504945\nprimary: #d79921\nselect-tag-background: #665c54\nselect-tag-foreground: <<colour foreground>>\nselection-background: #458588\nselection-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour page-background>>\nsidebar-controls-foreground-hover: #7c6f64\nsidebar-controls-foreground: #504945\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #fbf1c7\nsidebar-muted-foreground-hover: #7c6f64\nsidebar-muted-foreground: #504945\nsidebar-tab-background-selected: #bdae93\nsidebar-tab-background: #3c3836\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #bdae93\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #282828\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #458588\nsidebar-tiddler-link-foreground: #98971a\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ebdbb2\ntab-background: #665c54\ntab-border-selected: #665c54\ntab-border: #665c54\ntab-divider: #bdae93\ntab-foreground-selected: #282828\ntab-foreground: #ebdbb2\ntable-border: #7c6f64\ntable-footer-background: #665c54\ntable-header-background: #504945\ntag-background: #d3869b\ntag-foreground: #282828\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #7c6f64\ntiddler-controls-foreground-selected: <<colour primary>>\ntiddler-controls-foreground: #665c54\ntiddler-editor-background: #32302f\ntiddler-editor-border-image: #282828\ntiddler-editor-border: #282828\ntiddler-editor-fields-even: #504945\ntiddler-editor-fields-odd: #7c6f64\ntiddler-info-background: #32302f\ntiddler-info-border: #ebdbb2\ntiddler-info-tab-background: #ebdbb2\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #7c6f64\ntiddler-title-foreground: #a89984\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #504945\nvery-muted-foreground: #bdae93\nwikilist-background: <<colour page-background>>\nwikilist-button-background: #acacac\nwikilist-button-foreground: <<colour button-foreground>>\nwikilist-item: <<colour background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-toolbar-foreground: <<colour foreground>>\nwikilist-title: <<colour foreground>>\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: <<colour muted-foreground>>\nwikilist-button-open-hover: <<colour primary>>\nwikilist-button-open: <<colour dropzone-background>>\nwikilist-button-remove: <<colour dirty-indicator>>\nwikilist-button-remove-hover: <<colour alert-background>>\nwikilist-droplink-dragover: <<colour dropzone-background>>\nwikilist-button-reveal: <<colour sidebar-tiddler-link-foreground-hover>>\nwikilist-button-reveal-hover: <<colour message-background>>\n"
},
"$:/palettes/Nord": {
"title": "$:/palettes/Nord",
"name": "Nord",
"description": "An arctic, north-bluish color palette.",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"license": "MIT, arcticicestudio, https://github.com/arcticicestudio/nord/blob/develop/LICENSE.md",
"text": "alert-background: #D08770\nalert-border: #D08770\nalert-highlight: #B48EAD\nalert-muted-foreground: #4C566A\nbackground: #3b4252\nblockquote-bar: <<colour muted-foreground>>\nbutton-foreground: <<colour page-background>>\ncode-background: #2E3440\ncode-border: #2E3440\ncode-foreground: #BF616A\ndiff-delete-background: #BF616A\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #A3BE8C\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #BF616A\ndownload-background: #A3BE8C\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour background>>\ndropdown-tab-background-selected: #ECEFF4\ndropdown-tab-background: #4C566A\ndropzone-background: #A3BE8C\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #5E81AC\nexternal-link-foreground: #8FBCBB\nforeground: #d8dee9\nmenubar-background: #2E3440\nmenubar-foreground: #d8dee9\nmessage-background: #2E3440\nmessage-border: #2E3440\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #3b4252\nmodal-footer-background: #3b4252\nmodal-footer-border: #3b4252\nmodal-header-border: #3b4252\nmuted-foreground: #4C566A\nnotification-background: <<colour primary>>\nnotification-border: #EBCB8B\npage-background: #2e3440\npre-background: #2E3440\npre-border: #2E3440\nprimary: #5E81AC\nselect-tag-background: #3b4252\nselect-tag-foreground: <<colour foreground>>\nselection-background: #5E81AC\nselection-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour page-background>>\nsidebar-controls-foreground-hover: #D8DEE9\nsidebar-controls-foreground: #4C566A\nsidebar-foreground-shadow: transparent\nsidebar-foreground: #D8DEE9\nsidebar-muted-foreground-hover: #4C566A\nsidebar-muted-foreground: #4C566A\nsidebar-tab-background-selected: #ECEFF4\nsidebar-tab-background: #4C566A\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: #4C566A\nsidebar-tab-divider: <<colour page-background>>\nsidebar-tab-foreground-selected: #4C566A\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #A3BE8C\nsidebar-tiddler-link-foreground: #81A1C1\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #B48EAD\ntab-background-selected: #ECEFF4\ntab-background: #4C566A\ntab-border-selected: #4C566A\ntab-border: #4C566A\ntab-divider: #4C566A\ntab-foreground-selected: #4C566A\ntab-foreground: #D8DEE9\ntable-border: #4C566A\ntable-footer-background: #2e3440\ntable-header-background: #2e3440\ntag-background: #A3BE8C\ntag-foreground: #4C566A\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: \ntiddler-controls-foreground-selected: #EBCB8B\ntiddler-controls-foreground: #4C566A\ntiddler-editor-background: #2e3440\ntiddler-editor-border-image: #2e3440\ntiddler-editor-border: #3b4252\ntiddler-editor-fields-even: #2e3440\ntiddler-editor-fields-odd: #2e3440\ntiddler-info-background: #2e3440\ntiddler-info-border: #2e3440\ntiddler-info-tab-background: #2e3440\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #4C566A\ntiddler-title-foreground: #81A1C1\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: #2d3038\nvery-muted-foreground: #2d3038\nwikilist-background: <<colour page-background>>\nwikilist-toolbar-background: <<colour background>>\nwikilist-item: <<colour background>>\nwikilist-title: <<colour foreground>>\nwikilist-info: <<colour muted-foreground>>\nwikilist-button-open: #A3BE8C\nwikilist-button-open-hover: #A3BE8C\nwikilist-button-reveal: #81A1C1\nwikilist-button-reveal-hover: #81A1C1\nwikilist-button-remove: #B48EAD\nwikilist-button-remove-hover: #B48EAD\n"
},
"$:/palettes/Rocker": {
"title": "$:/palettes/Rocker",
"name": "Rocker",
"description": "A dark theme",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #999999\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #000\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #cc0000\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #ffffff\nsidebar-foreground-shadow: rgba(255,255,255, 0.0)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #000\nsidebar-tab-background: <<colour tab-background>>\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: <<colour tab-divider>>\nsidebar-tab-foreground-selected: \nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #ffbb99\nsidebar-tiddler-link-foreground: #cc0000\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ffbb99\ntag-foreground: #000\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #cc0000\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/SolarFlare": {
"title": "$:/palettes/SolarFlare",
"name": "Solar Flare",
"description": "Warm, relaxing earth colours",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": ": Background Tones\n\nbase03: #002b36\nbase02: #073642\n\n: Content Tones\n\nbase01: #586e75\nbase00: #657b83\nbase0: #839496\nbase1: #93a1a1\n\n: Background Tones\n\nbase2: #eee8d5\nbase3: #fdf6e3\n\n: Accent Colors\n\nyellow: #b58900\norange: #cb4b16\nred: #dc322f\nmagenta: #d33682\nviolet: #6c71c4\nblue: #268bd2\ncyan: #2aa198\ngreen: #859900\n\n: Additional Tones (RA)\n\nbase10: #c0c4bb\nviolet-muted: #7c81b0\nblue-muted: #4e7baa\n\nyellow-hot: #ffcc44\norange-hot: #eb6d20\nred-hot: #ff2222\nblue-hot: #2298ee\ngreen-hot: #98ee22\n\n: Palette\n\n: Do not use colour macro for background and foreground\nbackground: #fdf6e3\n download-foreground: <<colour background>>\n dragger-foreground: <<colour background>>\n dropdown-background: <<colour background>>\n modal-background: <<colour background>>\n sidebar-foreground-shadow: <<colour background>>\n tiddler-background: <<colour background>>\n tiddler-border: <<colour background>>\n tiddler-link-background: <<colour background>>\n tab-background-selected: <<colour background>>\n dropdown-tab-background-selected: <<colour tab-background-selected>>\nforeground: #657b83\n dragger-background: <<colour foreground>>\n tab-foreground: <<colour foreground>>\n tab-foreground-selected: <<colour tab-foreground>>\n sidebar-tab-foreground-selected: <<colour tab-foreground-selected>>\n sidebar-tab-foreground: <<colour tab-foreground>>\n sidebar-button-foreground: <<colour foreground>>\n sidebar-controls-foreground: <<colour foreground>>\n sidebar-foreground: <<colour foreground>>\n: base03\n: base02\n: base01\n alert-muted-foreground: <<colour base01>>\n: base00\n code-foreground: <<colour base00>>\n message-foreground: <<colour base00>>\n tag-foreground: <<colour base00>>\n: base0\n sidebar-tiddler-link-foreground: <<colour base0>>\n: base1\n muted-foreground: <<colour base1>>\n blockquote-bar: <<colour muted-foreground>>\n dropdown-border: <<colour muted-foreground>>\n sidebar-muted-foreground: <<colour muted-foreground>>\n tiddler-title-foreground: <<colour muted-foreground>>\n site-title-foreground: <<colour tiddler-title-foreground>>\n: base2\n modal-footer-background: <<colour base2>>\n page-background: <<colour base2>>\n modal-backdrop: <<colour page-background>>\n notification-background: <<colour page-background>>\n code-background: <<colour page-background>>\n code-border: <<colour code-background>>\n pre-background: <<colour page-background>>\n pre-border: <<colour pre-background>>\n sidebar-tab-background-selected: <<colour page-background>>\n table-header-background: <<colour base2>>\n tag-background: <<colour base2>>\n tiddler-editor-background: <<colour base2>>\n tiddler-info-background: <<colour base2>>\n tiddler-info-tab-background: <<colour base2>>\n tab-background: <<colour base2>>\n dropdown-tab-background: <<colour tab-background>>\n: base3\n alert-background: <<colour base3>>\n message-background: <<colour base3>>\n: yellow\n: orange\n: red\n: magenta\n alert-highlight: <<colour magenta>>\n: violet\n external-link-foreground: <<colour violet>>\n: blue\n: cyan\n: green\n: base10\n tiddler-controls-foreground: <<colour base10>>\n: violet-muted\n external-link-foreground-visited: <<colour violet-muted>>\n: blue-muted\n primary: <<colour blue-muted>>\n download-background: <<colour primary>>\n tiddler-link-foreground: <<colour primary>>\n\nalert-border: #b99e2f\ndirty-indicator: #ff0000\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nmessage-border: #cfd6e6\nmodal-border: #999999\nselect-tag-background:\nselect-tag-foreground:\nsidebar-controls-foreground-hover:\nsidebar-muted-foreground-hover:\nsidebar-tab-background: #ded8c5\nsidebar-tiddler-link-foreground-hover:\nstatic-alert-foreground: #aaaaaa\ntab-border: #cccccc\n modal-footer-border: <<colour tab-border>>\n modal-header-border: <<colour tab-border>>\n notification-border: <<colour tab-border>>\n sidebar-tab-border: <<colour tab-border>>\n tab-border-selected: <<colour tab-border>>\n sidebar-tab-border-selected: <<colour tab-border-selected>>\ntab-divider: #d8d8d8\n sidebar-tab-divider: <<colour tab-divider>>\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-border: #dddddd\ntiddler-subtitle-foreground: #c0c0c0\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\n"
},
"$:/palettes/SolarizedDark": {
"title": "$:/palettes/SolarizedDark",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Precision dark colors for machines and people",
"license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE",
"name": "SolarizedDark",
"text": "alert-background: #073642\nalert-border: #93a1a1\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #073642\nblockquote-bar: #d33682\nbutton-background: #073642\nbutton-border: #586e75\nbutton-foreground: #93a1a1\ncode-background: #073642\ncode-border: #586e75\ncode-foreground: #93a1a1\ndirty-indicator: inherit\ndownload-background: #859900\ndownload-foreground: #073642\ndragger-background: #073642\ndragger-foreground: #839496\ndropdown-background: #073642\ndropdown-border: #93a1a1\ndropdown-tab-background: #002b36\ndropdown-tab-background-selected: #073642\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover:\nexternal-link-foreground-visited: #268bd2\nforeground: #839496\nmessage-background: #002b36\nmessage-border: #586e75\nmessage-foreground: #839496\nmodal-backdrop: #657b83\nmodal-background: #002b36\nmodal-border: #586e75\nmodal-footer-background: #073642\nmodal-footer-border: #586e75\nmodal-header-border: #586e75\nmuted-foreground: #93a1a1\nnotification-background: #002b36\nnotification-border: #586e75\npage-background: #073642\npre-background: inherit\npre-border: #657b83\nprimary: #859900\nselect-tag-background: #002b36\nselect-tag-foreground: #839496\nsidebar-button-foreground: #93a1a1\nsidebar-controls-foreground: #93a1a1\nsidebar-controls-foreground-hover: #eee8d5\nsidebar-foreground: #93a1a1\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #839496\nsidebar-muted-foreground-hover: #93a1a1\nsidebar-tab-background: #002b36\nsidebar-tab-background-selected: #073642\nsidebar-tab-border: #073642\nsidebar-tab-border-selected: #839496\nsidebar-tab-divider: #002b36\nsidebar-tab-foreground: #657b83\nsidebar-tab-foreground-selected: #93a1a1\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #eee8d5\nsite-title-foreground: #d33682\nstatic-alert-foreground: #93a1a1\ntab-background: #073642\ntab-background-selected: #002b36\ntab-border: #586e75\ntab-border-selected: #93a1a1\ntab-divider: #93a1a1\ntab-foreground: #839496\ntab-foreground-selected: #93a1a1\ntable-border: #586e75\ntable-footer-background: #073642\ntable-header-background: #073642\ntag-background: #b58900\ntag-foreground: #002b36\ntiddler-background: #002b36\ntiddler-border: #586e75\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #002b36\ntiddler-editor-border: #073642\ntiddler-editor-border-image: #002b36\ntiddler-editor-fields-even: #002b36\ntiddler-editor-fields-odd: #073642\ntiddler-info-background: #073642\ntiddler-info-border: #657b83\ntiddler-info-tab-background: #002b36\ntiddler-link-background: #002b36\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #839496\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #839496\ntoolbar-close-button: #839496\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #839496\ntoolbar-edit-button: #839496\ntoolbar-info-button: #839496\ntoolbar-new-button: #839496\ntoolbar-options-button: #839496\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #586e75\n"
},
"$:/palettes/SolarizedLight": {
"title": "$:/palettes/SolarizedLight",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Precision colors for machines and people",
"license": "MIT, Ethan Schoonover, https://github.com/altercation/solarized/blob/master/LICENSE",
"name": "SolarizedLight",
"text": "alert-background: #eee8d5\nalert-border: #586e75\nalert-highlight: #d33682\nalert-muted-foreground: #d33682\nbackground: #eee8d5\nblockquote-bar: #d33682\nbutton-background: #eee8d5\nbutton-border: #93a1a1\nbutton-foreground: #586e75\ncode-background: #eee8d5\ncode-border: #93a1a1\ncode-foreground: #586e75\ndirty-indicator: inherit\ndownload-background: #859900\ndownload-foreground: #eee8d5\ndragger-background: #eee8d5\ndragger-foreground: #657b83\ndropdown-background: #eee8d5\ndropdown-border: #586e75\ndropdown-tab-background: #fdf6e3\ndropdown-tab-background-selected: #eee8d5\ndropzone-background: #859900\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: #268bd2\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #268bd2\nforeground: #657b83\nmessage-background: #fdf6e3\nmessage-border: #93a1a1\nmessage-foreground: #657b83\nmodal-backdrop: #839496\nmodal-background: #fdf6e3\nmodal-border: #93a1a1\nmodal-footer-background: #eee8d5\nmodal-footer-border: #93a1a1\nmodal-header-border: #93a1a1\nmuted-foreground: #586e75\nnotification-background: #fdf6e3\nnotification-border: #93a1a1\npage-background: #eee8d5\npre-background: #eee8d5\npre-border: #839496\nprimary: #859900\nselect-tag-background: #fdf6e3\nselect-tag-foreground: #657b83\nsidebar-button-foreground: #586e75\nsidebar-controls-foreground: #586e75\nsidebar-controls-foreground-hover: #d33682\nsidebar-foreground: #586e75\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: #657b83\nsidebar-muted-foreground-hover: #586e75\nsidebar-tab-background: #fdf6e3\nsidebar-tab-background-selected: #eee8d5\nsidebar-tab-border: #eee8d5\nsidebar-tab-border-selected: #657b83\nsidebar-tab-divider: #fdf6e3\nsidebar-tab-foreground: #839496\nsidebar-tab-foreground-selected: #586e75\nsidebar-tiddler-link-foreground: #2aa198\nsidebar-tiddler-link-foreground-hover: #002b36\nsite-title-foreground: #d33682\nstatic-alert-foreground: #586e75\ntab-background: #eee8d5\ntab-background-selected: #fdf6e3\ntab-border: #93a1a1\ntab-border-selected: #586e75\ntab-divider: #586e75\ntab-foreground: #657b83\ntab-foreground-selected: #586e75\ntable-border: #93a1a1\ntable-footer-background: #eee8d5\ntable-header-background: #eee8d5\ntag-background: #b58900\ntag-foreground: #fdf6e3\ntiddler-background: #fdf6e3\ntiddler-border: #93a1a1\ntiddler-controls-foreground: inherit\ntiddler-controls-foreground-hover: #d33682\ntiddler-controls-foreground-selected: #2aa198\ntiddler-editor-background: #fdf6e3\ntiddler-editor-border: #eee8d5\ntiddler-editor-border-image: #fdf6e3\ntiddler-editor-fields-even: #fdf6e3\ntiddler-editor-fields-odd: #eee8d5\ntiddler-info-background: #eee8d5\ntiddler-info-border: #839496\ntiddler-info-tab-background: #fdf6e3\ntiddler-link-background: #fdf6e3\ntiddler-link-foreground: #2aa198\ntiddler-subtitle-foreground: #657b83\ntiddler-title-foreground: #d33682\ntoolbar-cancel-button: #657b83\ntoolbar-close-button: #657b83\ntoolbar-delete-button: #dc322f\ntoolbar-done-button: #657b83\ntoolbar-edit-button: #657b83\ntoolbar-info-button: #657b83\ntoolbar-new-button: #657b83\ntoolbar-options-button: #657b83\ntoolbar-save-button: inherit\nuntagged-background: #586e75\nvery-muted-foreground: #93a1a1\n"
},
"$:/palettes/SpartanDay": {
"title": "$:/palettes/SpartanDay",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Cold, spartan day colors",
"name": "Spartan Day",
"text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #FAFAFA\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: #ececec\ncode-border: #ececec\ncode-foreground: \ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #FFFFFF\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #F5F5F5\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: \nexternal-link-foreground: \nforeground: rgba(0, 0, 0, 0.87)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(0, 0, 0, 0.54)\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour very-muted-foreground>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(0, 0, 0, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #f4f4f4\npre-background: #ececec\npre-border: #ececec\nprimary: #3949ab\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #aeaeae\nsidebar-controls-foreground: #c6c6c6\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground-hover: rgba(0, 0, 0, 0.54)\nsidebar-muted-foreground: rgba(0, 0, 0, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(0, 0, 0, 0.87)\nsidebar-tab-foreground: rgba(0, 0, 0, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(0, 0, 0, 0.87)\nsidebar-tiddler-link-foreground: rgba(0, 0, 0, 0.54)\nsite-title-foreground: rgba(0, 0, 0, 0.87)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(0, 0, 0, 0.87)\ntab-foreground: rgba(0, 0, 0, 0.54)\ntable-border: #d8d8d8\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: #f9f9f9\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: #e8e7e7\ntiddler-editor-fields-even: rgba(0, 0, 0, 0.1)\ntiddler-editor-fields-odd: rgba(0, 0, 0, 0.04)\ntiddler-info-background: #F5F5F5\ntiddler-info-border: #F5F5F5\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #000000\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(0, 0, 0, 0.12)\n"
},
"$:/palettes/SpartanNight": {
"title": "$:/palettes/SpartanNight",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"description": "Dark spartan colors",
"name": "Spartan Night",
"text": "alert-background: <<colour background>>\nalert-border: <<colour very-muted-foreground>>\nalert-highlight: <<colour very-muted-foreground>>\nalert-muted-foreground: <<colour muted-foreground>>\nbackground: #303030\nblockquote-bar: <<colour page-background>>\nbutton-background: transparent\nbutton-foreground: inherit\nbutton-border: <<colour tag-background>>\ncode-background: <<colour pre-background>>\ncode-border: <<colour pre-border>>\ncode-foreground: rgba(255, 255, 255, 0.54)\ndirty-indicator: #c80000\ndownload-background: <<colour primary>>\ndownload-foreground: <<colour foreground>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: #424242\ndropdown-border: <<colour dropdown-background>>\ndropdown-tab-background-selected: <<colour dropdown-background>>\ndropdown-tab-background: #050505\ndropzone-background: <<colour tag-background>>\nexternal-link-background-hover: transparent\nexternal-link-background-visited: transparent\nexternal-link-background: transparent\nexternal-link-foreground-hover: \nexternal-link-foreground-visited: #7c318c\nexternal-link-foreground: #9e3eb3\nforeground: rgba(255, 255, 255, 0.7)\nmessage-background: <<colour background>>\nmessage-border: <<colour very-muted-foreground>>\nmessage-foreground: rgba(255, 255, 255, 0.54)\nmodal-backdrop: <<colour page-background>>\nmodal-background: <<colour background>>\nmodal-border: <<colour very-muted-foreground>>\nmodal-footer-background: <<colour background>>\nmodal-footer-border: <<colour background>>\nmodal-header-border: <<colour very-muted-foreground>>\nmuted-foreground: rgba(255, 255, 255, 0.54)\nnotification-background: <<colour dropdown-background>>\nnotification-border: <<colour dropdown-background>>\npage-background: #212121\npre-background: #2a2a2a\npre-border: transparent\nprimary: #5656f3\nselect-tag-background: <<colour background>>\nselect-tag-foreground: <<colour foreground>>\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #494949\nsidebar-controls-foreground: #5d5d5d\nsidebar-foreground-shadow: transparent\nsidebar-foreground: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground-hover: rgba(255, 255, 255, 0.54)\nsidebar-muted-foreground: rgba(255, 255, 255, 0.38)\nsidebar-tab-background-selected: <<colour page-background>>\nsidebar-tab-background: transparent\nsidebar-tab-border-selected: <<colour table-border>>\nsidebar-tab-border: transparent\nsidebar-tab-divider: <<colour table-border>>\nsidebar-tab-foreground-selected: rgba(255, 255, 255, 0.87)\nsidebar-tab-foreground: rgba(255, 255, 255, 0.54)\nsidebar-tiddler-link-foreground-hover: rgba(255, 255, 255, 0.7)\nsidebar-tiddler-link-foreground: rgba(255, 255, 255, 0.54)\nsite-title-foreground: rgba(255, 255, 255, 0.7)\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: <<colour background>>\ntab-background: transparent\ntab-border-selected: <<colour table-border>>\ntab-border: transparent\ntab-divider: <<colour table-border>>\ntab-foreground-selected: rgba(255, 255, 255, 0.87)\ntab-foreground: rgba(255, 255, 255, 0.54)\ntable-border: #3a3a3a\ntable-footer-background: <<colour tiddler-editor-fields-odd>>\ntable-header-background: <<colour tiddler-editor-fields-even>>\ntag-background: #ec6\ntag-foreground: <<colour button-foreground>>\ntiddler-background: <<colour background>>\ntiddler-border: rgb(55,55,55)\ntiddler-controls-foreground-hover: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground-selected: <<colour sidebar-controls-foreground-hover>>\ntiddler-controls-foreground: <<colour sidebar-controls-foreground>>\ntiddler-editor-background: transparent\ntiddler-editor-border-image: \ntiddler-editor-border: rgba(255, 255, 255, 0.08)\ntiddler-editor-fields-even: rgba(255, 255, 255, 0.1)\ntiddler-editor-fields-odd: rgba(255, 255, 255, 0.04)\ntiddler-info-background: #454545\ntiddler-info-border: #454545\ntiddler-info-tab-background: <<colour tiddler-editor-fields-odd>>\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: <<colour muted-foreground>>\ntiddler-title-foreground: #FFFFFF\ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \ntoolbar-info-button: \ntoolbar-edit-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-cancel-button: \ntoolbar-done-button: \nuntagged-background: <<colour very-muted-foreground>>\nvery-muted-foreground: rgba(255, 255, 255, 0.12)\n"
},
"$:/palettes/Twilight": {
"title": "$:/palettes/Twilight",
"tags": "$:/tags/Palette",
"author": "Thomas Elmiger",
"type": "application/x-tiddler-dictionary",
"name": "Twilight",
"description": "Delightful, soft darkness.",
"text": "alert-background: rgb(255, 255, 102)\nalert-border: rgb(232, 232, 125)\nalert-highlight: rgb(255, 51, 51)\nalert-muted-foreground: rgb(224, 82, 82)\nbackground: rgb(38, 38, 38)\nblockquote-bar: rgba(240, 196, 117, 0.7)\nbutton-background: rgb(63, 63, 63)\nbutton-border: rgb(127, 127, 127)\nbutton-foreground: rgb(179, 179, 179)\ncode-background: rgba(0,0,0,0.03)\ncode-border: rgba(0,0,0,0.08)\ncode-foreground: rgb(255, 94, 94)\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: rgb(255, 94, 94)\ndownload-background: #19a974\ndownload-foreground: rgb(38, 38, 38)\ndragger-background: rgb(179, 179, 179)\ndragger-foreground: rgb(38, 38, 38)\ndropdown-background: rgb(38, 38, 38)\ndropdown-border: rgb(255, 255, 255)\ndropdown-tab-background: rgba(0,0,0,.1)\ndropdown-tab-background-selected: rgba(255,255,255,1)\ndropzone-background: #9eebcf\nexternal-link-background: inherit\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-foreground: rgb(179, 179, 255)\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: rgb(153, 153, 255)\nforeground: rgb(179, 179, 179)\nmessage-background: <<colour tag-foreground>>\nmessage-border: #96ccff\nmessage-foreground: <<colour tag-background>>\nmodal-backdrop: rgb(179, 179, 179)\nmodal-background: rgb(38, 38, 38)\nmodal-border: rgba(0,0,0,.5)\nmodal-footer-background: #f4f4f4\nmodal-footer-border: rgba(0,0,0,.1)\nmodal-header-border: rgba(0,0,0,.2)\nmuted-foreground: rgb(255, 255, 255)\nnotification-background: <<colour tag-foreground>>\nnotification-border: <<colour tag-background>>\npage-background: rgb(26, 26, 26)\npre-background: rgb(25, 25, 25)\npre-border: rgba(0,0,0,.2)\nprimary: rgb(255, 201, 102)\nselect-tag-background: \nselect-tag-foreground: \nsidebar-button-foreground: rgb(179, 179, 179)\nsidebar-controls-foreground: rgb(153, 153, 153)\nsidebar-controls-foreground-hover: <<colour tiddler-controls-foreground-hover>>\nsidebar-foreground: rgb(141, 141, 141)\nsidebar-foreground-shadow: transparent\nsidebar-muted-foreground: rgba(0, 0, 0, 0.5)\nsidebar-muted-foreground-hover: rgb(141, 141, 141)\nsidebar-tab-background: rgba(141, 141, 141, 0.2)\nsidebar-tab-background-selected: rgb(26, 26, 26)\nsidebar-tab-border: rgb(127, 127, 127)\nsidebar-tab-border-selected: rgb(127, 127, 127)\nsidebar-tab-divider: rgb(127, 127, 127)\nsidebar-tab-foreground: rgb(179, 179, 179)\nsidebar-tab-foreground-selected: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground: rgb(179, 179, 179)\nsidebar-tiddler-link-foreground-hover: rgb(115, 115, 115)\nsite-title-foreground: rgb(255, 201, 102)\nstatic-alert-foreground: rgba(0,0,0,.3)\ntab-background: rgba(0,0,0,0.125)\ntab-background-selected: rgb(38, 38, 38)\ntab-border: rgb(255, 201, 102)\ntab-border-selected: rgb(255, 201, 102)\ntab-divider: rgb(255, 201, 102)\ntab-foreground: rgb(179, 179, 179)\ntab-foreground-selected: rgb(179, 179, 179)\ntable-border: rgba(255,255,255,.3)\ntable-footer-background: rgba(0,0,0,.4)\ntable-header-background: rgba(0,0,0,.1)\ntag-background: rgb(255, 201, 102)\ntag-foreground: rgb(25, 25, 25)\ntiddler-background: rgb(38, 38, 38)\ntiddler-border: rgba(240, 196, 117, 0.7)\ntiddler-controls-foreground: rgb(128, 128, 128)\ntiddler-controls-foreground-hover: rgba(255, 255, 255, 0.8)\ntiddler-controls-foreground-selected: rgba(255, 255, 255, 0.9)\ntiddler-editor-background: rgb(33, 33, 33)\ntiddler-editor-border: rgb(63, 63, 63)\ntiddler-editor-border-image: rgb(25, 25, 25)\ntiddler-editor-fields-even: rgb(33, 33, 33)\ntiddler-editor-fields-odd: rgb(28, 28, 28)\ntiddler-info-background: rgb(43, 43, 43)\ntiddler-info-border: rgb(25, 25, 25)\ntiddler-info-tab-background: rgb(43, 43, 43)\ntiddler-link-background: rgb(38, 38, 38)\ntiddler-link-foreground: rgb(204, 204, 255)\ntiddler-subtitle-foreground: rgb(255, 255, 255)\ntiddler-title-foreground: rgb(255, 192, 76)\ntoolbar-cancel-button: \ntoolbar-close-button: \ntoolbar-delete-button: \ntoolbar-done-button: \ntoolbar-edit-button: \ntoolbar-info-button: \ntoolbar-new-button: \ntoolbar-options-button: \ntoolbar-save-button: \nuntagged-background: rgb(255, 255, 255)\nvery-muted-foreground: rgba(240, 196, 117, 0.7)\n"
},
"$:/palettes/Vanilla": {
"title": "$:/palettes/Vanilla",
"name": "Vanilla",
"description": "Pale and unobtrusive",
"tags": "$:/tags/Palette",
"type": "application/x-tiddler-dictionary",
"text": "alert-background: #ffe476\nalert-border: #b99e2f\nalert-highlight: #881122\nalert-muted-foreground: #b99e2f\nbackground: #ffffff\nblockquote-bar: <<colour muted-foreground>>\nbutton-background:\nbutton-foreground:\nbutton-border:\ncode-background: #f7f7f9\ncode-border: #e1e1e8\ncode-foreground: #dd1144\ndiff-delete-background: #ffc9c9\ndiff-delete-foreground: <<colour foreground>>\ndiff-equal-background: \ndiff-equal-foreground: <<colour foreground>>\ndiff-insert-background: #aaefad\ndiff-insert-foreground: <<colour foreground>>\ndiff-invisible-background: \ndiff-invisible-foreground: <<colour muted-foreground>>\ndirty-indicator: #ff0000\ndownload-background: #34c734\ndownload-foreground: <<colour background>>\ndragger-background: <<colour foreground>>\ndragger-foreground: <<colour background>>\ndropdown-background: <<colour background>>\ndropdown-border: <<colour muted-foreground>>\ndropdown-tab-background-selected: #fff\ndropdown-tab-background: #ececec\ndropzone-background: rgba(0,200,0,0.7)\nexternal-link-background-hover: inherit\nexternal-link-background-visited: inherit\nexternal-link-background: inherit\nexternal-link-foreground-hover: inherit\nexternal-link-foreground-visited: #0000aa\nexternal-link-foreground: #0000ee\nforeground: #333333\nmessage-background: #ecf2ff\nmessage-border: #cfd6e6\nmessage-foreground: #547599\nmodal-backdrop: <<colour foreground>>\nmodal-background: <<colour background>>\nmodal-border: #999999\nmodal-footer-background: #f5f5f5\nmodal-footer-border: #dddddd\nmodal-header-border: #eeeeee\nmuted-foreground: #bbb\nnotification-background: #ffffdd\nnotification-border: #999999\npage-background: #f4f4f4\npre-background: #f5f5f5\npre-border: #cccccc\nprimary: #5778d8\nselection-background:\nselection-foreground:\nselect-tag-background:\nselect-tag-foreground:\nsidebar-button-foreground: <<colour foreground>>\nsidebar-controls-foreground-hover: #000000\nsidebar-controls-foreground: #aaaaaa\nsidebar-foreground-shadow: rgba(255,255,255, 0.8)\nsidebar-foreground: #acacac\nsidebar-muted-foreground-hover: #444444\nsidebar-muted-foreground: #c0c0c0\nsidebar-tab-background-selected: #f4f4f4\nsidebar-tab-background: #e0e0e0\nsidebar-tab-border-selected: <<colour tab-border-selected>>\nsidebar-tab-border: <<colour tab-border>>\nsidebar-tab-divider: #e4e4e4\nsidebar-tab-foreground-selected:\nsidebar-tab-foreground: <<colour tab-foreground>>\nsidebar-tiddler-link-foreground-hover: #444444\nsidebar-tiddler-link-foreground: #999999\nsite-title-foreground: <<colour tiddler-title-foreground>>\nstatic-alert-foreground: #aaaaaa\ntab-background-selected: #ffffff\ntab-background: #d8d8d8\ntab-border-selected: #d8d8d8\ntab-border: #cccccc\ntab-divider: #d8d8d8\ntab-foreground-selected: <<colour tab-foreground>>\ntab-foreground: #666666\ntable-border: #dddddd\ntable-footer-background: #a8a8a8\ntable-header-background: #f0f0f0\ntag-background: #ec6\ntag-foreground: #ffffff\ntiddler-background: <<colour background>>\ntiddler-border: <<colour background>>\ntiddler-controls-foreground-hover: #888888\ntiddler-controls-foreground-selected: #444444\ntiddler-controls-foreground: #cccccc\ntiddler-editor-background: #f8f8f8\ntiddler-editor-border-image: #ffffff\ntiddler-editor-border: #cccccc\ntiddler-editor-fields-even: #e0e8e0\ntiddler-editor-fields-odd: #f0f4f0\ntiddler-info-background: #f8f8f8\ntiddler-info-border: #dddddd\ntiddler-info-tab-background: #f8f8f8\ntiddler-link-background: <<colour background>>\ntiddler-link-foreground: <<colour primary>>\ntiddler-subtitle-foreground: #c0c0c0\ntiddler-title-foreground: #182955\ntoolbar-new-button:\ntoolbar-options-button:\ntoolbar-save-button:\ntoolbar-info-button:\ntoolbar-edit-button:\ntoolbar-close-button:\ntoolbar-delete-button:\ntoolbar-cancel-button:\ntoolbar-done-button:\nuntagged-background: #999999\nvery-muted-foreground: #888888\nwikilist-background: #e5e5e5\nwikilist-item: #fff\nwikilist-info: #000\nwikilist-title: #666\nwikilist-title-svg: <<colour wikilist-title>>\nwikilist-url: #aaa\nwikilist-button-open: #4fb82b\nwikilist-button-open-hover: green\nwikilist-button-reveal: #5778d8\nwikilist-button-reveal-hover: blue\nwikilist-button-remove: #d85778\nwikilist-button-remove-hover: red\nwikilist-toolbar-background: #d3d3d3\nwikilist-toolbar-foreground: #888\nwikilist-droplink-dragover: rgba(255,192,192,0.5)\nwikilist-button-background: #acacac\nwikilist-button-foreground: #000\n"
},
"$:/core/readme": {
"title": "$:/core/readme",
"text": "This plugin contains TiddlyWiki's core components, comprising:\n\n* JavaScript code modules\n* Icons\n* Templates needed to create TiddlyWiki's user interface\n* British English (''en-GB'') translations of the localisable strings used by the core\n"
},
"$:/library/sjcl.js/license": {
"title": "$:/library/sjcl.js/license",
"type": "text/plain",
"text": "SJCL is open. You can use, modify and redistribute it under a BSD\nlicense or under the GNU GPL, version 2.0.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/BSD-2-Clause\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n1. Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED\nTO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n---------------------------------------------------------------------\n\nhttp://opensource.org/licenses/GPL-2.0\n\nThe Stanford Javascript Crypto Library (hosted here on GitHub) is a\nproject by the Stanford Computer Security Lab to build a secure,\npowerful, fast, small, easy-to-use, cross-browser library for\ncryptography in Javascript.\n\nCopyright (c) 2009-2015, Emily Stark, Mike Hamburg and Dan Boneh at\nStanford University.\n\nThis program is free software; you can redistribute it and/or modify it\nunder the terms of the GNU General Public License as published by the\nFree Software Foundation; either version 2 of the License, or (at your\noption) any later version.\n\nThis program is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\nPublic License for more details.\n\nYou should have received a copy of the GNU General Public License along\nwith this program; if not, write to the Free Software Foundation, Inc.,\n59 Temple Place, Suite 330, Boston, MA 02111-1307 USA"
},
"$:/core/templates/alltiddlers.template.html": {
"title": "$:/core/templates/alltiddlers.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "<!-- This template is provided for backwards compatibility with older versions of TiddlyWiki -->\n\n<$set name=\"exportFilter\" value=\"[!is[system]sort[title]]\">\n\n{{$:/core/templates/exporters/StaticRiver}}\n\n</$set>\n"
},
"$:/core/templates/canonical-uri-external-image": {
"title": "$:/core/templates/canonical-uri-external-image",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external images.\n\nChange the `./images/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./images/<$view field=\"title\" format=\"doubleurlencoded\"/>"
},
"$:/core/templates/canonical-uri-external-raw": {
"title": "$:/core/templates/canonical-uri-external-raw",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external raw files that are stored in the same directory\n\n-->\n<$view field=\"title\" format=\"doubleurlencoded\"/>"
},
"$:/core/templates/canonical-uri-external-text": {
"title": "$:/core/templates/canonical-uri-external-text",
"text": "<!--\n\nThis template is used to assign the ''_canonical_uri'' field to external text files.\n\nChange the `./text/` part to a different base URI. The URI can be relative or absolute.\n\n-->\n./text/<$view field=\"title\" format=\"doubleurlencoded\"/>.tid"
},
"$:/core/templates/css-tiddler": {
"title": "$:/core/templates/css-tiddler",
"text": "<!--\n\nThis template is used for saving CSS tiddlers as a style tag with data attributes representing the tiddler fields.\n\n-->`<style`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/css\">`<$view field=\"text\" format=\"text\" />`</style>`"
},
"$:/core/templates/exporters/CsvFile": {
"title": "$:/core/templates/exporters/CsvFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/CsvFile}}",
"extension": ".csv",
"text": "<$macrocall $name=\"csvtiddlers\" filter=<<exportFilter>> format=\"quoted-comma-sep\" $output=\"text/raw\"/>\n"
},
"$:/core/templates/exporters/JsonFile": {
"title": "$:/core/templates/exporters/JsonFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/JsonFile}}",
"extension": ".json",
"text": "<$macrocall $name=\"jsontiddlers\" filter=<<exportFilter>> $output=\"text/raw\"/>\n"
},
"$:/core/templates/exporters/StaticRiver": {
"title": "$:/core/templates/exporters/StaticRiver",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/StaticRiver}}",
"extension": ".html",
"text": "\\define tv-wikilink-template() #$uri_encoded$\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n<section class=\"tc-story-river tc-static-story-river\">\n{{$:/core/templates/exporters/StaticRiver/Content||$:/core/templates/html-tiddler}}\n</section>\n</body>\n</html>\n"
},
"$:/core/templates/exporters/StaticRiver/Content": {
"title": "$:/core/templates/exporters/StaticRiver/Content",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ ||$:/core/templates/static-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>\n"
},
"$:/core/templates/exporters/TidFile": {
"title": "$:/core/templates/exporters/TidFile",
"tags": "$:/tags/Exporter",
"description": "{{$:/language/Exporters/TidFile}}",
"extension": ".tid",
"condition": "[<count>compare:lte[1]]",
"text": "\\define renderContent()\n{{{ $(exportFilter)$ +[limit[1]] ||$:/core/templates/tid-tiddler}}}\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<<renderContent>>"
},
"$:/core/save/all-external-js": {
"title": "$:/core/save/all-external-js",
"text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/core]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5-external-js.html}}\n"
},
"$:/core/templates/tiddlywiki5.js": {
"title": "$:/core/templates/tiddlywiki5.js",
"text": "\\rules only filteredtranscludeinline transcludeinline codeinline\n\n/*\n{{ $:/core/copyright.txt ||$:/core/templates/plain-text-tiddler}}\n`*/\n`<!--~~ Library modules ~~-->\n{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/plain-text-tiddler}}}\n<!--~~ Boot prefix ~~-->\n{{ $:/boot/bootprefix.js ||$:/core/templates/plain-text-tiddler}}\n<!--~~ Core plugin ~~-->\n{{$:/core/templates/tiddlywiki5.js/tiddlers}}\n<!--~~ Boot kernel ~~-->\n{{ $:/boot/boot.js ||$:/core/templates/plain-text-tiddler}}\n"
},
"$:/core/templates/tiddlywiki5.js/tiddlers": {
"title": "$:/core/templates/tiddlywiki5.js/tiddlers",
"text": "`\n$tw.preloadTiddlerArray(`<$text text=<<jsontiddlers \"[[$:/core]]\">>/>`);\n`\n"
},
"$:/core/templates/tiddlywiki5-external-js.html": {
"title": "$:/core/templates/tiddlywiki5-external-js.html",
"text": "\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n{{$:/core/templates/MOTW.html}}<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"{{$:/core/copyright.txt}}\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/core/wiki/rawmarkup]] [all[shadows+tiddlers]tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n{{$:/core/templates/static.area}}\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n{{$:/core/templates/store.area.template.html}}\n<!--~~ Raw markup for the bottom of the body section ~~-->\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}\n</body>\n<script src=\"%24%3A%2Fcore%2Ftemplates%2Ftiddlywiki5.js\" onerror=\"alert('Error: Cannot load tiddlywiki.js');\"></script>\n</html>\n"
},
"$:/core/templates/html-div-skinny-tiddler": {
"title": "$:/core/templates/html-div-skinny-tiddler",
"text": "<!--\n\nThis template is a variant of $:/core/templates/html-div-tiddler used for saving skinny tiddlers (with no text field)\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre></pre>\n</div>`\n"
},
"$:/core/templates/html-div-tiddler": {
"title": "$:/core/templates/html-div-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as an HTML DIV tag with attributes representing the tiddler fields.\n\n-->`<div`<$fields template=' $name$=\"$encoded_value$\"'></$fields>`>\n<pre>`<$view field=\"text\" format=\"htmlencoded\" />`</pre>\n</div>`\n"
},
"$:/core/templates/html-tiddler": {
"title": "$:/core/templates/html-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as raw HTML\n\n--><$view field=\"text\" format=\"htmlwikified\" />"
},
"$:/core/templates/javascript-tiddler": {
"title": "$:/core/templates/javascript-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields.\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\">`<$view field=\"text\" format=\"text\" />`</script>`"
},
"$:/core/templates/json-tiddler": {
"title": "$:/core/templates/json-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as raw JSON\n\n--><$text text=<<jsontiddler>>/>"
},
"$:/core/templates/module-tiddler": {
"title": "$:/core/templates/module-tiddler",
"text": "<!--\n\nThis template is used for saving JavaScript tiddlers as a script tag with data attributes representing the tiddler fields. The body of the tiddler is wrapped in a call to the `$tw.modules.define` function in order to define the body of the tiddler as a module\n\n-->`<script`<$fields template=' data-tiddler-$name$=\"$encoded_value$\"'></$fields>` type=\"text/javascript\" data-module=\"yes\">$tw.modules.define(\"`<$view field=\"title\" format=\"jsencoded\" />`\",\"`<$view field=\"module-type\" format=\"jsencoded\" />`\",function(module,exports,require) {`<$view field=\"text\" format=\"text\" />`});\n</script>`"
},
"$:/core/templates/MOTW.html": {
"title": "$:/core/templates/MOTW.html",
"text": "\\rules only filteredtranscludeinline transcludeinline entity\n<!-- The following comment is called a MOTW comment and is necessary for the TiddlyIE Internet Explorer extension -->\n<!-- saved from url=(0021)https://tiddlywiki.com --> "
},
"$:/core/templates/plain-text-tiddler": {
"title": "$:/core/templates/plain-text-tiddler",
"text": "<$view field=\"text\" format=\"text\" />"
},
"$:/core/templates/raw-static-tiddler": {
"title": "$:/core/templates/raw-static-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers as static HTML\n\n--><$view field=\"text\" format=\"plainwikified\" />"
},
"$:/core/save/all": {
"title": "$:/core/save/all",
"text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[prefix[$:/temp/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] $(publishFilter)$\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/empty": {
"title": "$:/core/save/empty",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/lazy-all": {
"title": "$:/core/save/lazy-all",
"text": "\\define saveTiddlerFilter()\n[is[system]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[!is[system]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/save/lazy-images": {
"title": "$:/core/save/lazy-images",
"text": "\\define saveTiddlerFilter()\n[is[tiddler]] -[prefix[$:/state/popup/]] -[[$:/HistoryList]] -[[$:/boot/boot.css]] -[type[application/javascript]library[yes]] -[[$:/boot/boot.js]] -[[$:/boot/bootprefix.js]] -[!is[system]is[image]] +[sort[title]] \n\\end\n\\define skinnySaveTiddlerFilter()\n[is[image]]\n\\end\n{{$:/core/templates/tiddlywiki5.html}}\n"
},
"$:/core/templates/server/static.sidebar.wikitext": {
"title": "$:/core/templates/server/static.sidebar.wikitext",
"text": "\\whitespace trim\n<div class=\"tc-sidebar-scrollable\" style=\"overflow: auto;\">\n<div class=\"tc-sidebar-header\">\n<h1 class=\"tc-site-title\">\n<$transclude tiddler=\"$:/SiteTitle\"/>\n</h1>\n<div class=\"tc-site-subtitle\">\n<$transclude tiddler=\"$:/SiteSubtitle\"/>\n</div>\n<h2>\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$list filter={{$:/DefaultTiddlers}}>\n<div class=\"tc-menu-list-subitem\">\n<$link><$text text=<<currentTiddler>>/></$link>\n</div>\n</$list>\n</div>\n<!-- Currently disabled the recent list as it is unweildy when the responsive narrow view kicks in\n<h2>\n{{$:/language/SideBar/Recent/Caption}}\n</h2>\n<div class=\"tc-sidebar-lists\">\n<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n</div>\n</div>\n</div>\n-->\n"
},
"$:/core/templates/server/static.tiddler.html": {
"title": "$:/core/templates/server/static.tiddler.html",
"text": "\\whitespace trim\n\\define tv-wikilink-template() $uri_encoded$\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content={{$:/core/templates/version}} />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"%24%3A%2Fcore%2Ftemplates%2Fstatic.template.css\">\n<title><$view field=\"caption\" format=\"plainwikified\"><$view field=\"title\"/></$view>: <$view tiddler=\"$:/core/wiki/title\" format=\"plainwikified\"/></title>\n</head>\n<body class=\"tc-body\">\n<$transclude tiddler=\"$:/core/templates/server/static.sidebar.wikitext\" mode=\"inline\"/>\n<section class=\"tc-story-river\">\n<div class=\"tc-tiddler-frame\">\n<$transclude tiddler=\"$:/core/templates/server/static.tiddler.wikitext\" mode=\"inline\"/>\n</div>\n</section>\n</body>\n</html>"
},
"$:/core/templates/server/static.tiddler.wikitext": {
"title": "$:/core/templates/server/static.tiddler.wikitext",
"text": "\\whitespace trim\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<h2><$text text=<<currentTiddler>>/></h2>\n</div>\n</div>\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}}>\n<$view field=\"modifier\"/>\n</$link> <$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n<div class=\"tc-tags-wrapper\">\n<$list filter=\"[all[current]tags[]sort[title]]\">\n<a href={{{ [<currentTiddler>encodeuricomponent[]] }}}>\n<$macrocall $name=\"tag-pill\" tag=<<currentTiddler>>/>\n</a>\n</$list>\n</div>\n<div class=\"tc-tiddler-body\">\n<$transclude mode=\"block\"/>\n</div>\n"
},
"$:/core/templates/single.tiddler.window": {
"title": "$:/core/templates/single.tiddler.window",
"text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n\n<$transclude mode=\"block\"/>\n\n</$navigator>\n\n</div>\n\n</$vars>\n"
},
"$:/core/templates/split-recipe": {
"title": "$:/core/templates/split-recipe",
"text": "<$list filter=\"[!is[system]]\">\ntiddler: <$view field=\"title\" format=\"urlencoded\"/>.tid\n</$list>\n"
},
"$:/core/templates/static-tiddler": {
"title": "$:/core/templates/static-tiddler",
"text": "<a name=<<currentTiddler>>>\n<$transclude tiddler=\"$:/core/ui/ViewTemplate\"/>\n</a>"
},
"$:/core/templates/static.area": {
"title": "$:/core/templates/static.area",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n{{{ [all[shadows+tiddlers]tag[$:/tags/RawStaticContent]!has[draft.of]] ||$:/core/templates/raw-static-tiddler}}}\n{{$:/core/templates/static.content||$:/core/templates/html-tiddler}}\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\nThis file contains an encrypted ~TiddlyWiki. Enable ~JavaScript and enter the decryption password when prompted.\n</$reveal>\n<!-- ensure splash screen isn't shown when JS is disabled -->\n`<style>\n.tc-remove-when-wiki-loaded {display: none;}\n</style>`\n"
},
"$:/core/templates/static.content": {
"title": "$:/core/templates/static.content",
"text": "<!-- For Google, and people without JavaScript-->\nThis [[TiddlyWiki|https://tiddlywiki.com]] contains the following tiddlers:\n\n<ul>\n<$list filter=<<saveTiddlerFilter>>>\n<li><$view field=\"title\" format=\"text\"></$view></li>\n</$list>\n</ul>\n"
},
"$:/core/templates/static.template.css": {
"title": "$:/core/templates/static.template.css",
"text": "{{$:/boot/boot.css||$:/core/templates/plain-text-tiddler}}\n\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n"
},
"$:/core/templates/static.template.html": {
"title": "$:/core/templates/static.template.html",
"type": "text/vnd.tiddlywiki-html",
"text": "\\define tv-wikilink-template() static/$uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\rules only filteredtranscludeinline transcludeinline\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"{{$:/core/templates/version}}\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>{{$:/core/wiki/title}}</title>\n<div id=\"styleArea\">\n{{$:/boot/boot.css||$:/core/templates/css-tiddler}}\n</div>\n<style type=\"text/css\">\n{{$:/core/ui/PageStylesheet||$:/core/templates/wikified-tiddler}}\n</style>\n</head>\n<body class=\"tc-body\">\n{{$:/StaticBanner||$:/core/templates/html-tiddler}}\n{{$:/core/ui/PageTemplate||$:/core/templates/html-tiddler}}\n</body>\n</html>\n"
},
"$:/core/templates/static.tiddler.html": {
"title": "$:/core/templates/static.tiddler.html",
"text": "\\define tv-wikilink-template() $uri_doubleencoded$.html\n\\define tv-config-toolbar-icons() no\n\\define tv-config-toolbar-text() no\n\\define tv-config-toolbar-class() tc-btn-invisible\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n`<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\">\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<link rel=\"stylesheet\" href=\"static.css\">\n<title>`<$view field=\"caption\"><$view field=\"title\"/></$view>: {{$:/core/wiki/title}}`</title>\n</head>\n<body class=\"tc-body\">\n`{{$:/StaticBanner||$:/core/templates/html-tiddler}}`\n<section class=\"tc-story-river tc-static-story-river\">\n`<$view tiddler=\"$:/core/ui/ViewTemplate\" format=\"htmlwikified\"/>`\n</section>\n</body>\n</html>\n`\n"
},
"$:/core/templates/store.area.template.html": {
"title": "$:/core/templates/store.area.template.html",
"text": "<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n`<div id=\"storeArea\" style=\"display:none;\">`\n<$list filter=<<saveTiddlerFilter>> template=\"$:/core/templates/html-div-tiddler\"/>\n<$list filter={{{ [<skinnySaveTiddlerFilter>] }}} template=\"$:/core/templates/html-div-skinny-tiddler\"/>\n`</div>`\n</$reveal>\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n`<!--~~ Encrypted tiddlers ~~-->`\n`<pre id=\"encryptedStoreArea\" type=\"text/plain\" style=\"display:none;\">`\n<$encrypt filter=<<saveTiddlerFilter>>/>\n`</pre>`\n</$reveal>"
},
"$:/core/templates/tid-tiddler": {
"title": "$:/core/templates/tid-tiddler",
"text": "<!--\n\nThis template is used for saving tiddlers in TiddlyWeb *.tid format\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>`\n`<$view field=\"text\" format=\"text\" />"
},
"$:/core/templates/tiddler-metadata": {
"title": "$:/core/templates/tiddler-metadata",
"text": "<!--\n\nThis template is used for saving tiddler metadata *.meta files\n\n--><$fields exclude='text bag' template='$name$: $value$\n'></$fields>"
},
"$:/core/templates/tiddlywiki5.html": {
"title": "$:/core/templates/tiddlywiki5.html",
"text": "<$set name=\"saveTiddlerAndShadowsFilter\" filter=\"[subfilter<saveTiddlerFilter>] [subfilter<saveTiddlerFilter>plugintiddlers[]]\">\n`<!doctype html>\n`{{$:/core/templates/MOTW.html}}`<html lang=\"`<$text text={{{ [{$:/language}get[name]] }}}/>`\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html;charset=utf-8\" />\n<!--~~ Raw markup for the top of the head section ~~-->\n`{{{ [<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopHead]] ||$:/core/templates/raw-static-tiddler}}}`\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=Edge\"/>\n<meta name=\"application-name\" content=\"TiddlyWiki\" />\n<meta name=\"generator\" content=\"TiddlyWiki\" />\n<meta name=\"tiddlywiki-version\" content=\"`{{$:/core/templates/version}}`\" />\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n<meta name=\"apple-mobile-web-app-capable\" content=\"yes\" />\n<meta name=\"apple-mobile-web-app-status-bar-style\" content=\"black-translucent\" />\n<meta name=\"mobile-web-app-capable\" content=\"yes\"/>\n<meta name=\"format-detection\" content=\"telephone=no\" />\n<meta name=\"copyright\" content=\"`{{$:/core/copyright.txt}}`\" />\n<link id=\"faviconLink\" rel=\"shortcut icon\" href=\"favicon.ico\">\n<title>`{{$:/core/wiki/title}}`</title>\n<!--~~ This is a Tiddlywiki file. The points of interest in the file are marked with this pattern ~~-->\n\n<!--~~ Raw markup ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/core/wiki/rawmarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkup]] ||$:/core/templates/plain-text-tiddler}}}\n{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified]] ||$:/core/templates/raw-static-tiddler}}}`\n</head>\n<body class=\"tc-body\">\n<!--~~ Raw markup for the top of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/TopBody]] ||$:/core/templates/raw-static-tiddler}}}`\n<!--~~ Static styles ~~-->\n<div id=\"styleArea\">\n`{{$:/boot/boot.css||$:/core/templates/css-tiddler}}`\n</div>\n<!--~~ Static content for Google and browsers without JavaScript ~~-->\n<noscript>\n<div id=\"splashArea\">\n`{{$:/core/templates/static.area}}`\n</div>\n</noscript>\n<!--~~ Ordinary tiddlers ~~-->\n`{{$:/core/templates/store.area.template.html}}`\n<!--~~ Library modules ~~-->\n<div id=\"libraryModules\" style=\"display:none;\">\n`{{{ [is[system]type[application/javascript]library[yes]] ||$:/core/templates/javascript-tiddler}}}`\n</div>\n<!--~~ Boot kernel prologue ~~-->\n<div id=\"bootKernelPrefix\" style=\"display:none;\">\n`{{ $:/boot/bootprefix.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Boot kernel ~~-->\n<div id=\"bootKernel\" style=\"display:none;\">\n`{{ $:/boot/boot.js ||$:/core/templates/javascript-tiddler}}`\n</div>\n<!--~~ Raw markup for the bottom of the body section ~~-->\n`{{{ [enlist<saveTiddlerAndShadowsFilter>tag[$:/tags/RawMarkupWikified/BottomBody]] ||$:/core/templates/raw-static-tiddler}}}`\n</body>\n</html>`\n"
},
"$:/core/templates/version": {
"title": "$:/core/templates/version",
"text": "<<version>>"
},
"$:/core/templates/wikified-tiddler": {
"title": "$:/core/templates/wikified-tiddler",
"text": "<$transclude />"
},
"$:/core/ui/AboveStory/tw2-plugin-check": {
"title": "$:/core/ui/AboveStory/tw2-plugin-check",
"tags": "$:/tags/AboveStory",
"text": "\\define lingo-base() $:/language/AboveStory/ClassicPlugin/\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]limit[1]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n<ul>\n\n<$list filter=\"[all[system+tiddlers]tag[systemConfig]]\">\n\n<li>\n\n<$link><$view field=\"title\"/></$link>\n\n</li>\n\n</$list>\n\n</ul>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/Actions/new-image": {
"title": "$:/core/ui/Actions/new-image",
"tags": "$:/tags/Actions",
"description": "create a new image tiddler",
"text": "\\define get-type()\nimage/$(imageType)$\n\\end\n\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars imageType={{$:/config/NewImageType}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" type=<<get-type>> tags=<<get-tags>>/>\n</$vars>\n"
},
"$:/core/ui/Actions/new-journal": {
"title": "$:/core/ui/Actions/new-journal",
"tags": "$:/tags/Actions",
"description": "create a new journal tiddler",
"text": "\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars journalTitleTemplate={{$:/config/NewJournal/Title}} textFieldTags={{$:/config/NewJournal/Tags}} tagsFieldTags={{$:/config/NewJournal/Tags!!tags}} journalText={{$:/config/NewJournal/Text}}>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$reveal type=\"nomatch\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text={{{ [<journalTitle>get[]] }}}/>\n</$reveal>\n<$reveal type=\"match\" state=<<journalTitle>> text=\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<get-tags>> text=<<journalText>>/>\n</$reveal>\n</$wikify>\n</$vars>\n"
},
"$:/core/ui/Actions/new-tiddler": {
"title": "$:/core/ui/Actions/new-tiddler",
"tags": "$:/tags/Actions",
"description": "create a new empty tiddler",
"text": "\\define get-tags() $(textFieldTags)$ $(tagsFieldTags)$\n<$vars textFieldTags={{$:/config/NewTiddler/Tags}} tagsFieldTags={{$:/config/NewTiddler/Tags!!tags}}>\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<get-tags>>/>\n</$vars>\n"
},
"$:/core/ui/AdvancedSearch/Filter": {
"title": "$:/core/ui/AdvancedSearch/Filter",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Filter/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch/input}!match{$:/temp/advancedsearch}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Filter/Hint>>\n\n<div class=\"tc-search tc-advanced-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\" \n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\" \n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/temp/advancedsearch]]\" firstSearchFilterField=\"text\" \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> \n\t\tinputCancelActions=<<cancel-search-actions>>/>\n</$keyboard>\n</$keyboard>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch/FilterButton]!has[draft.of]]\"><$transclude/></$list>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\n<div class=\"tc-search-results\">\n<<lingo Filter/Matches>>\n<$list filter={{$:/temp/advancedsearch}}>\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</div>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/clear",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\" />\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/delete",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button popup=<<qualify \"$:/state/filterDeleteDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/delete-button}}\n</$button>\n</$reveal>\n\n<$reveal state=<<qualify \"$:/state/filterDeleteDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<div class=\"tc-dropdown-item-plain\">\n<$set name=\"resultCount\" value=\"\"\"<$count filter={{$:/temp/advancedsearch}}/>\"\"\">\nAre you sure you wish to delete <<resultCount>> tiddler(s)?\n</$set>\n</div>\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn\">\n<$action-deletetiddler $filter={{$:/temp/advancedsearch}}/>\nDelete these tiddlers\n</$button>\n</div>\n</div>\n</div>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/filterDropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</span>\n\n<$reveal state=<<qualify \"$:/state/filterDropdown\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=\"$:/temp/advancedsearch\" text=<<navigateTo>>/><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text=<<navigateTo>>/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/><$action-sendmessage $message=\"tm-focus-selector\" $param='.tc-advanced-search input' />\"\"\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Filter]]\"><$link to={{!!filter}}><$transclude field=\"description\"/></$link>\n</$list>\n</div>\n</div>\n</$linkcatcher>\n</$set>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Filter/FilterButtons/export": {
"title": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/export",
"tags": "$:/tags/AdvancedSearch/FilterButton",
"text": "<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$macrocall $name=\"exportButton\" exportFilter={{$:/temp/advancedsearch}} lingoBase=\"$:/language/Buttons/ExportTiddlers/\"/>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Shadows": {
"title": "$:/core/ui/AdvancedSearch/Shadows",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Shadows/Caption}}",
"first-search-filter": "[all[shadows]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]",
"text": "\\define lingo-base() $:/language/Search/\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Shadows/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\"\n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/Shadows]]\"\n\t\tinputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> \n\t\tinputAcceptVariantActions=<<input-accept-variant-actions>> filterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[all[shadows]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo Shadows/Matches>>\n\n<$list filter=\"[all[shadows]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/Standard": {
"title": "$:/core/ui/AdvancedSearch/Standard",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/Standard/Caption}}",
"text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define next-search-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/advancedsearch\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/standard/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo Standard/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$keyboard key=\"shift-alt-Right\" actions=<<next-search-tab>>>\n<$keyboard key=\"shift-alt-Left\" actions=<<next-search-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\" type=\"search\"\n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\"\n\t\tfilterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$vars userInput={{{ [[$:/temp/advancedsearch]get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} searchListState=\"$:/temp/advancedsearch/selected-item\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude/>\n</$list>\n\"\"\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/standard/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab/search-results/advancedsearch\" />\n</$list>\n</$vars>\n</$list>\n</$reveal>\n"
},
"$:/core/ui/AdvancedSearch/System": {
"title": "$:/core/ui/AdvancedSearch/System",
"tags": "$:/tags/AdvancedSearch",
"caption": "{{$:/language/Search/System/Caption}}",
"first-search-filter": "[is[system]search<userInput>sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]",
"text": "\\define lingo-base() $:/language/Search/\n\\define set-next-input-tab(beforeafter:\"after\",stateTitle,tag,defaultState,currentTabTiddler) <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab--1498284803\" tag=\"$:/tags/AdvancedSearch\" beforeafter=\"$beforeafter$\" defaultState=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define cancel-search-actions() <$list filter=\"[{$:/temp/advancedsearch}!match{$:/temp/advancedsearch/input}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/advancedsearch]] [[$:/temp/advancedsearch/input]] [[$:/temp/advancedsearch/selected-item]]\" />\"\"\"><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/advancedsearch}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/></$list><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\".tc-advanced-search input\"\"\"/>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\n\n<<lingo System/Hint>>\n\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=\"$:/temp/advancedsearch/input\" storeTitle=\"$:/temp/advancedsearch\"\n\t\trefreshTitle=\"$:/temp/advancedsearch/refresh\" selectionStateTitle=\"$:/temp/advancedsearch/selected-item\"\n\t\ttype=\"search\" tag=\"input\" focus={{$:/config/Search/AutoFocus}} configTiddlerFilter=\"[[$:/core/ui/AdvancedSearch/System]]\"\n\t\tinputCancelActions=<<cancel-search-actions>> inputAcceptActions=<<input-accept-actions>> \n\t\tinputAcceptVariantActions=<<input-accept-variant-actions>> filterMinLength={{$:/config/Search/MinLength}}/>\n</$keyboard>\n</$keyboard>\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"nomatch\" text=\"\">\n\n<$list filter=\"[{$:/temp/advancedsearch}minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[is[system]search{$:/temp/advancedsearch}] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]\"/>\"\"\">\n\n<div class=\"tc-search-results\">\n\n<<lingo System/Matches>>\n\n<$list filter=\"[is[system]search{$:/temp/advancedsearch}sort[title]limit[250]] -[[$:/temp/advancedsearch]] -[[$:/temp/advancedsearch/input]] -[[$:/temp/advancedsearch/selected-item]]\">\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[[$:/temp/advancedsearch/selected-item]get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n\n</div>\n\n</$set>\n\n</$list>\n\n</$reveal>\n\n<$reveal state=\"$:/temp/advancedsearch\" type=\"match\" text=\"\">\n\n</$reveal>\n"
},
"$:/AdvancedSearch": {
"title": "$:/AdvancedSearch",
"icon": "$:/core/images/advanced-search-button",
"color": "#bbb",
"text": "<div class=\"tc-advanced-search\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/AdvancedSearch]!has[draft.of]]\" default=\"$:/core/ui/AdvancedSearch/System\" actions=\"\"\"<$action-setfield $tiddler=\"$:/state/advancedsearch/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab--1498284803\"/>\n</div>\n"
},
"$:/core/ui/AlertTemplate": {
"title": "$:/core/ui/AlertTemplate",
"text": "<div class=\"tc-alert\">\n<div class=\"tc-alert-toolbar\">\n<$button class=\"tc-btn-invisible\"><$action-deletetiddler $tiddler=<<currentTiddler>>/>{{$:/core/images/cancel-button}}</$button>\n</div>\n<div class=\"tc-alert-subtitle\">\n<$wikify name=\"format\" text=<<lingo Tiddler/DateFormat>>>\n<$view field=\"component\"/> - <$view field=\"modified\" format=\"date\" template=<<format>>/> <$reveal type=\"nomatch\" state=\"!!count\" text=\"\"><span class=\"tc-alert-highlight\">({{$:/language/Count}}: <$view field=\"count\"/>)</span></$reveal>\n</$wikify>\n</div>\n<div class=\"tc-alert-body\">\n\n<$transclude/>\n\n</div>\n</div>\n"
},
"$:/core/ui/BinaryWarning": {
"title": "$:/core/ui/BinaryWarning",
"text": "\\define lingo-base() $:/language/BinaryWarning/\n<<lingo Prompt>>\n"
},
"$:/core/ui/Components/plugin-info": {
"title": "$:/core/ui/Components/plugin-info",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define popup-state-macro()\n$(qualified-state)$-$(currentTiddler)$\n\\end\n\n\\define tabs-state-macro()\n$(popup-state)$-$(pluginInfoType)$\n\\end\n\n\\define plugin-icon-title()\n$(currentTiddler)$/icon\n\\end\n\n\\define plugin-disable-title()\n$:/config/Plugins/Disabled/$(currentTiddler)$\n\\end\n\n\\define plugin-table-body(type,disabledMessage,default-popup-state)\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\" default=\"\"\"$default-popup-state$\"\"\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<plugin-icon-title>>>\n<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\n</$transclude>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1>\n''<$text text={{{ [<currentTiddler>get[name]] ~[<currentTiddler>split[/]last[1]] }}}/>'': <$view field=\"description\"><$view field=\"title\"/></$view> $disabledMessage$\n</h1>\n<h2>\n<$view field=\"title\"/>\n</h2>\n<h2>\n<div><em><$view field=\"version\"/></em></div>\n</h2>\n</div>\n\\end\n\n\\define plugin-info(type,default-popup-state)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$link to={{!!title}} class=\"tc-plugin-info tc-plugin-info-disabled\">\n<<plugin-table-body type:\"$type$\" default-popup-state:\"\"\"$default-popup-state$\"\"\" disabledMessage:\"<$macrocall $name='lingo' title='Disabled/Status'/>\">>\n</$link>\n</$reveal>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>> default=\"\"\"$default-popup-state$\"\"\">\n<div class=\"tc-plugin-info-dropdown\">\n<div class=\"tc-plugin-info-dropdown-body\">\n<$list filter=\"[all[current]] -[[$:/core]]\">\n<div style=\"float:right;\">\n<$reveal type=\"nomatch\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"yes\" tooltip={{$:/language/ControlPanel/Plugins/Disable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Disable/Caption}}>\n<<lingo Disable/Caption>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<plugin-disable-title>> text=\"yes\">\n<$button set=<<plugin-disable-title>> setTo=\"no\" tooltip={{$:/language/ControlPanel/Plugins/Enable/Hint}} aria-label={{$:/language/ControlPanel/Plugins/Enable/Caption}}>\n<<lingo Enable/Caption>>\n</$button>\n</$reveal>\n</div>\n</$list>\n<$set name=\"tabsList\" filter=\"[<currentTiddler>list[]] contents\">\n<$macrocall $name=\"tabs\" state=<<tabs-state-macro>> tabsList=<<tabsList>> default={{{ [enlist<tabsList>] }}} template=\"$:/core/ui/PluginInfo\"/>\n</$set>\n</div>\n</div>\n</$reveal>\n</$set>\n\\end\n\n<$macrocall $name=\"plugin-info\" type=<<plugin-type>> default-popup-state=<<default-popup-state>>/>\n"
},
"$:/core/ui/Components/tag-link": {
"title": "$:/core/ui/Components/tag-link",
"text": "<$link>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<span style=<<tag-styles>> class=\"tc-tag-label\">\n<$view field=\"title\" format=\"text\"/>\n</span>\n</$set>\n</$link>"
},
"$:/core/ui/ControlPanel/Advanced": {
"title": "$:/core/ui/ControlPanel/Advanced",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Advanced/Caption}}",
"text": "{{$:/language/ControlPanel/Advanced/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Advanced]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/TiddlerFields\" explicitState=\"$:/state/tab--959111941\"/>\n</div>\n"
},
"$:/core/ui/ControlPanel/Appearance": {
"title": "$:/core/ui/ControlPanel/Appearance",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Appearance/Caption}}",
"text": "{{$:/language/ControlPanel/Appearance/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Appearance]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Theme\" explicitState=\"$:/state/tab--1963855381\"/>\n</div>\n"
},
"$:/core/ui/ControlPanel/Basics": {
"title": "$:/core/ui/ControlPanel/Basics",
"tags": "$:/tags/ControlPanel/Info",
"caption": "{{$:/language/ControlPanel/Basics/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Basics/\n\n\\define show-filter-count(filter)\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"$:/temp/advancedsearch\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" $value=\"\"\"$filter$\"\"\"/>\n<$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/>\n<$action-setfield $tiddler=\"$:/state/tab--1498284803\" $value=\"$:/core/ui/AdvancedSearch/Filter\"/>\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-advanced-search input\"/>\n''<$count filter=\"\"\"$filter$\"\"\"/>''\n{{$:/core/images/advanced-search-button}}\n</$button>\n\\end\n\n|<<lingo Version/Prompt>> |''<<version>>'' |\n|<$link to=\"$:/SiteTitle\"><<lingo Title/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/SiteSubtitle\"><<lingo Subtitle/Prompt>></$link> |<$edit-text tiddler=\"$:/SiteSubtitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/status/UserName\"><<lingo Username/Prompt>></$link> |<$edit-text tiddler=\"$:/status/UserName\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/AnimationDuration\"><<lingo AnimDuration/Prompt>></$link> |<$edit-text tiddler=\"$:/config/AnimationDuration\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/DefaultTiddlers\"><<lingo DefaultTiddlers/Prompt>></$link> |<<lingo DefaultTiddlers/TopHint>><br> <$edit tag=\"textarea\" tiddler=\"$:/DefaultTiddlers\" class=\"tc-edit-texteditor\"/><br>//<<lingo DefaultTiddlers/BottomHint>>// |\n|<$link to=\"$:/language/DefaultNewTiddlerTitle\"><<lingo NewTiddler/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/language/DefaultNewTiddlerTitle\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Title\"><<lingo NewJournal/Title/Prompt>></$link> |<$edit-text tiddler=\"$:/config/NewJournal/Title\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/config/NewJournal/Text\"><<lingo NewJournal/Text/Prompt>></$link> |<$edit tiddler=\"$:/config/NewJournal/Text\" tag=\"textarea\" class=\"tc-edit-texteditor\" default=\"\"/> |\n|<$link to=\"$:/config/NewTiddler/Tags\"><<lingo NewTiddler/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewTiddler/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/NewJournal/Tags\"><<lingo NewJournal/Tags/Prompt>></$link> |<$vars currentTiddler=\"$:/config/NewJournal/Tags\" tagField=\"text\">{{||$:/core/ui/EditTemplate/tags}}<$list filter=\"[<currentTiddler>tags[]] +[limit[1]]\" variable=\"ignore\"><$button tooltip={{$:/language/ControlPanel/Basics/RemoveTags/Hint}}><<lingo RemoveTags>><$action-listops $tiddler=<<currentTiddler>> $field=\"text\" $subfilter={{{ [<currentTiddler>get[tags]] }}}/><$action-setfield $tiddler=<<currentTiddler>> tags=\"\"/></$button></$list></$vars> |\n|<$link to=\"$:/config/AutoFocus\"><<lingo AutoFocus/Prompt>></$link> |{{$:/snippets/minifocusswitcher}} |\n|<<lingo Language/Prompt>> |{{$:/snippets/minilanguageswitcher}} |\n|<<lingo Tiddlers/Prompt>> |<<show-filter-count \"[!is[system]sort[title]]\">> |\n|<<lingo Tags/Prompt>> |<<show-filter-count \"[tags[]sort[title]]\">> |\n|<<lingo SystemTiddlers/Prompt>> |<<show-filter-count \"[is[system]sort[title]]\">> |\n|<<lingo ShadowTiddlers/Prompt>> |<<show-filter-count \"[all[shadows]sort[title]]\">> |\n|<<lingo OverriddenShadowTiddlers/Prompt>> |<<show-filter-count \"[is[tiddler]is[shadow]sort[title]]\">> |\n"
},
"$:/core/ui/ControlPanel/EditorTypes": {
"title": "$:/core/ui/ControlPanel/EditorTypes",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/EditorTypes/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/EditorTypes/\n\n<<lingo Hint>>\n\n<table>\n<tbody>\n<tr>\n<th><<lingo Type/Caption>></th>\n<th><<lingo Editor/Caption>></th>\n</tr>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/config/EditorTypeMappings/]sort[title]]\">\n<tr>\n<td>\n<$link>\n<$list filter=\"[all[current]removeprefix[$:/config/EditorTypeMappings/]]\">\n<$text text={{!!title}}/>\n</$list>\n</$link>\n</td>\n<td>\n<$view field=\"text\"/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ControlPanel/Info": {
"title": "$:/core/ui/ControlPanel/Info",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Info/Caption}}",
"text": "{{$:/language/ControlPanel/Info/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Info]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Basics\" explicitState=\"$:/state/tab--2112689675\"/>\n</div>\n"
},
"$:/core/ui/ControlPanel/KeyboardShortcuts": {
"title": "$:/core/ui/ControlPanel/KeyboardShortcuts",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/KeyboardShortcuts/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/KeyboardShortcuts/\n\n\\define new-shortcut(title)\n<div class=\"tc-dropdown-item-plain\">\n<$edit-shortcut tiddler=\"$title$\" placeholder={{$:/language/ControlPanel/KeyboardShortcuts/Add/Prompt}} focus=\"true\" style=\"width:auto;\"/> <$button>\n<<lingo Add/Caption>>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"[{$title$}]\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"$title$\"\n/>\n</$button>\n</div>\n\\end\n\n\\define shortcut-list-item(caption)\n<td>\n</td>\n<td style=\"text-align:right;font-size:0.7em;\">\n<<lingo Platform/$caption$>>\n</td>\n<td>\n<div style=\"position:relative;\">\n<$button popup=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> class=\"tc-btn-invisible\">\n{{$:/core/images/edit-button}}\n</$button>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutTitle)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\n<$reveal state=<<qualify \"$:/state/dropdown/$(shortcutTitle)$\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-block-dropdown-wrapper\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown tc-popup-keep\">\n<$list filter=\"[list[$(shortcutTitle)$!!text]sort[title]]\" variable=\"shortcut\" emptyMessage=\"\"\"\n<div class=\"tc-dropdown-item-plain\">\n//<<lingo NoShortcuts/Caption>>//\n</div>\n\"\"\">\n<div class=\"tc-dropdown-item-plain\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/ControlPanel/KeyboardShortcuts/Remove/Hint}}>\n<$action-listops\n\t$tiddler=\"$(shortcutTitle)$\"\n\t$field=\"text\"\n\t$subfilter=\"+[remove<shortcut>]\"\n/>\n<small>{{$:/core/images/close-button}}</small>\n</$button>\n<kbd>\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts=<<shortcut>>/>\n</kbd>\n</div>\n</$list>\n<hr/>\n<$macrocall $name=\"new-shortcut\" title=<<qualify \"$:/state/new-shortcut/$(shortcutTitle)$\">>/>\n</div>\n</div>\n</$reveal>\n</div>\n</td>\n\\end\n\n\\define shortcut-list(caption,prefix)\n<tr>\n<$list filter=\"[[$prefix$$(shortcutName)$]]\" variable=\"shortcutTitle\">\n<<shortcut-list-item \"$caption$\">>\n</$list>\n</tr>\n\\end\n\n\\define shortcut-editor()\n<<shortcut-list \"All\" \"$:/config/shortcuts/\">>\n<<shortcut-list \"Mac\" \"$:/config/shortcuts-mac/\">>\n<<shortcut-list \"NonMac\" \"$:/config/shortcuts-not-mac/\">>\n<<shortcut-list \"Linux\" \"$:/config/shortcuts-linux/\">>\n<<shortcut-list \"NonLinux\" \"$:/config/shortcuts-not-linux/\">>\n<<shortcut-list \"Windows\" \"$:/config/shortcuts-windows/\">>\n<<shortcut-list \"NonWindows\" \"$:/config/shortcuts-not-windows/\">>\n\\end\n\n\\define shortcut-preview()\n<$macrocall $name=\"displayshortcuts\" $output=\"text/html\" shortcuts={{$(shortcutPrefix)$$(shortcutName)$}} prefix=\"<kbd>\" separator=\"</kbd> <kbd>\" suffix=\"</kbd>\"/>\n\\end\n\n\\define shortcut-item-inner()\n<tr>\n<td>\n<$reveal type=\"nomatch\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"open\"\n/>\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<dropdownStateTitle>> text=\"open\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield\n\t$tiddler=<<dropdownStateTitle>>\n\t$value=\"close\"\n/>\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n''<$text text=<<shortcutName>>/>''\n</td>\n<td>\n<$transclude tiddler=\"$:/config/ShortcutInfo/$(shortcutName)$\"/>\n</td>\n<td>\n<$list filter=\"$:/config/shortcuts/ $:/config/shortcuts-mac/ $:/config/shortcuts-not-mac/ $:/config/shortcuts-linux/ $:/config/shortcuts-not-linux/ $:/config/shortcuts-windows/ $:/config/shortcuts-not-windows/\" variable=\"shortcutPrefix\">\n<<shortcut-preview>>\n</$list>\n</td>\n</tr>\n<$set name=\"dropdownState\" value={{$(dropdownStateTitle)$}}>\n<$list filter=\"[<dropdownState>match[open]]\" variable=\"listItem\">\n<<shortcut-editor>>\n</$list>\n</$set>\n\\end\n\n\\define shortcut-item()\n<$set name=\"dropdownStateTitle\" value=<<qualify \"$:/state/dropdown/keyboardshortcut/$(shortcutName)$\">>>\n<<shortcut-item-inner>>\n</$set>\n\\end\n\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]removeprefix[$:/config/ShortcutInfo/]]\" variable=\"shortcutName\">\n<<shortcut-item>>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ControlPanel/LoadedModules": {
"title": "$:/core/ui/ControlPanel/LoadedModules",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/LoadedModules/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n<<lingo LoadedModules/Hint>>\n\n{{$:/snippets/modules}}\n"
},
"$:/core/ui/ControlPanel/Modals/AddPlugins": {
"title": "$:/core/ui/ControlPanel/Modals/AddPlugins",
"subtitle": "{{$:/core/images/download-button}} {{$:/language/ControlPanel/Plugins/Add/Caption}}",
"text": "\\define install-plugin-actions()\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url={{!!url}} title={{$(assetInfo)$!!original-title}}/>\n<$set name=\"url\" value={{!!url}}>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\" variable=\"dependency\">\n<$action-sendmessage $message=\"tm-load-plugin-from-library\" url=<<url>> title=<<dependency>>/>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define install-plugin-button()\n<div>\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$set name=\"reinstall-type\" value={{{ [<libraryVersion>compare:version:eq<installedVersion>then[tc-reinstall]] [<libraryVersion>compare:version:gt<installedVersion>then[tc-reinstall-upgrade]] [<libraryVersion>compare:version:lt<installedVersion>then[tc-reinstall-downgrade]] }}}>\n<$button actions=<<install-plugin-actions>> class={{{ [<assetInfo>get[original-title]has[version]then<reinstall-type>] tc-btn-invisible tc-install-plugin +[join[ ]] }}}>\n{{$:/core/images/download-button}}\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Install/Caption}}\">\n<$list filter=\"[<libraryVersion>compare:version:gt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[<libraryVersion>compare:version:lt<installedVersion>]\" variable=\"ignore\" emptyMessage=\"{{$:/language/ControlPanel/Plugins/Reinstall/Caption}}\">\n{{$:/language/ControlPanel/Plugins/Downgrade/Caption}}\n</$list>\n\"\"\">\n{{$:/language/ControlPanel/Plugins/Update/Caption}}\n</$list>\n</$list>\n</$button>\n<div>\n</div>\n<$reveal stateTitle=<<assetInfo>> stateField=\"requires-reload\" type=\"match\" text=\"yes\">{{$:/language/ControlPanel/Plugins/PluginWillRequireReload}}</$reveal>\n</$set>\n</$set>\n</$set>\n</div>\n\\end\n\n\\define popup-state-macro()\n$:/state/add-plugin-info/$(connectionTiddler)$/$(assetInfo)$\n\\end\n\n\\define display-plugin-info(type)\n<$set name=\"popup-state\" value=<<popup-state-macro>>>\n<div class=\"tc-plugin-info\">\n<div class=\"tc-plugin-info-chunk tc-plugin-info-toggle\">\n<$reveal type=\"nomatch\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"yes\">\n{{$:/core/images/chevron-right}}\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<popup-state>> text=\"yes\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<popup-state>> setTo=\"no\">\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-icon\">\n<$list filter=\"[<assetInfo>has[icon]]\" emptyMessage=\"\"\"<$transclude tiddler=\"$:/core/images/plugin-generic-$type$\"/>\"\"\">\n<img src={{$(assetInfo)$!!icon}}/>\n</$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-description\">\n<h1><strong><$text text={{{ [<assetInfo>get[name]] ~[<assetInfo>get[original-title]split[/]last[1]] }}}/></strong>: <$view tiddler=<<assetInfo>> field=\"description\"/></h1>\n<h2><$view tiddler=<<assetInfo>> field=\"original-title\"/></h2>\n<div><em><$view tiddler=<<assetInfo>> field=\"version\"/></em></div>\n<$list filter=\"[<assetInfo>get[original-title]get[version]]\" variable=\"installedVersion\"><div><em>{{$:/language/ControlPanel/Plugins/AlreadyInstalled/Hint}}</em></div></$list>\n</div>\n<div class=\"tc-plugin-info-chunk tc-plugin-info-buttons\">\n<<install-plugin-button>>\n</div>\n</div>\n<$set name=\"original-title\" value={{{ [<assetInfo>get[original-title]] }}}>\n<$reveal type=\"match\" text=\"yes\" state=<<popup-state>>>\n<div class=\"tc-plugin-info-dropdown\">\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]] ~[<assetInfo>get[original-title]!is[tiddler]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-dropdown-message\">\n<$list filter=\"[<assetInfo>get[original-title]!is[tiddler]]\">\n{{$:/language/ControlPanel/Plugins/NotInstalled/Hint}}\n</$list>\n<$set name=\"currentTiddler\" value=<<assetInfo>>>\n<$list filter=\"[enlist{!!dependents}] [<currentTiddler>get[parent-plugin]] +[limit[1]]\" variable=\"ignore\">\n<div>\n{{$:/language/ControlPanel/Plugins/AlsoRequires}}\n<$list filter=\"[enlist{!!dependents}] [{!!parent-plugin}] +[sort[name]]\" variable=\"dependency\">\n<$text text=<<dependency>>/>\n</$list>\n</div>\n</$list>\n</$set>\n</div>\n</$list>\n<div class=\"tc-plugin-info-dropdown-body\">\n<$transclude tiddler=<<assetInfo>> field=\"readme\" mode=\"block\"/>\n</div>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<div class=\"tc-plugin-info-sub-plugins\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>sort[name]]\" variable=\"assetInfo\">\n<<display-plugin-info \"$type$\">>\n</$list>\n</div>\n</$list>\n</div>\n</$reveal>\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>limit[1]]\" variable=\"ignore\">\n<$reveal type=\"nomatch\" text=\"yes\" state=<<popup-state>> tag=\"div\" class=\"tc-plugin-info-sub-plugin-indicator\">\n<$wikify name=\"count\" text=\"\"\"<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]has[parent-plugin]parent-plugin<original-title>]\"/>\"\"\">\n<$button class=\"tc-btn-invisible\" set=<<popup-state>> setTo=\"yes\">\n{{$:/language/ControlPanel/Plugins/SubPluginPrompt}}\n</$button>\n</$wikify>\n</$reveal>\n</$list>\n</$set>\n</$set>\n\\end\n\n\\define load-plugin-library-button()\n<$list filter=\"[<currentTiddler>get[enabled]else[yes]match[yes]]\" variable=\"ignore\">\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-load-plugin-library\" url={{!!url}} infoTitlePrefix=\"$:/temp/RemoteAssetInfo/\"/>\n{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Plugins/OpenPluginLibrary}}\n</$button>\n</$list>\n\\end\n\n\\define display-server-assets(type)\n{{$:/language/Search/Search}}: <$edit-text tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" default=\"\" type=\"search\" tag=\"input\"/>\n<$reveal state=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" type=\"nomatch\" text=\"\">\n<$button class=\"tc-btn-invisible\">\n<$action-setfield $tiddler=\"\"\"$:/temp/RemoteAssetSearch/$(currentTiddler)$\"\"\" $field=\"text\" $value=\"\"/>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n<div class=\"tc-plugin-library-listing\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[$type$]search:author,description,original-title,readme,title{$:/temp/RemoteAssetSearch/$(currentTiddler)$}sort[name]]\" variable=\"assetInfo\">\n<$list filter=\"[[$:/temp/RemoteAssetSearch/$(currentTiddler)$]has[text]] ~[<assetInfo>!has[parent-plugin]]\" variable=\"ignore\"><!-- Hide sub-plugins if we're not searching -->\n<<display-plugin-info \"$type$\">>\n</$list>\n</$list>\n</div>\n\\end\n\n\\define display-server-connection()\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/ServerConnection]suffix{!!url}]\" variable=\"connectionTiddler\" emptyMessage=<<load-plugin-library-button>>>\n\n<$set name=\"transclusion\" value=<<connectionTiddler>>>\n\n<<tabs \"[[$:/core/ui/ControlPanel/Plugins/Add/Updates]] [[$:/core/ui/ControlPanel/Plugins/Add/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Add/Themes]] [[$:/core/ui/ControlPanel/Plugins/Add/Languages]]\" \"$:/core/ui/ControlPanel/Plugins/Add/Plugins\">>\n\n</$set>\n\n</$list>\n\\end\n\n\\define close-library-button()\n<$reveal type='nomatch' state='$:/temp/ServerConnection/$(PluginLibraryURL)$' text=''>\n<$button class='tc-btn-big-green'>\n<$action-sendmessage $message=\"tm-unload-plugin-library\" url={{!!url}}/>\n{{$:/core/images/chevron-left}} {{$:/language/ControlPanel/Plugins/ClosePluginLibrary}}\n<$action-deletetiddler $filter=\"[prefix[$:/temp/ServerConnection/$(PluginLibraryURL)$]][prefix[$:/temp/RemoteAssetInfo/$(PluginLibraryURL)$]]\"/>\n</$button>\n</$reveal>\n\\end\n\n\\define plugin-library-listing()\n<div class=\"tc-tab-set\">\n<$set name=\"defaultTab\" value={{{ [all[tiddlers+shadows]tag[$:/tags/PluginLibrary]] }}}>\n<div class=\"tc-tab-buttons\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$button set=<<qualify \"$:/state/addplugins/tab\">> setTo=<<currentTiddler>> default=<<defaultTab>> selectedClass=\"tc-tab-selected\">\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude field=\"caption\"/>\n</$set>\n</$button>\n</$list>\n</div>\n<div class=\"tc-tab-divider\"/>\n<div class=\"tc-tab-content\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/PluginLibrary]]\">\n<$reveal type=\"match\" state=<<qualify \"$:/state/addplugins/tab\">> text=<<currentTiddler>> default=<<defaultTab>>>\n<h2><$link><$transclude field=\"caption\"><$view field=\"title\"/></$transclude></$link></h2>\n//<$view field=\"url\"/>//\n<$transclude mode=\"block\"/>\n<$set name=PluginLibraryURL value={{!!url}}>\n<<close-library-button>>\n</$set>\n<<display-server-connection>>\n</$reveal>\n</$list>\n</div>\n</$set>\n</div>\n\\end\n\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<div>\n<<plugin-library-listing>>\n</div>\n"
},
"$:/core/ui/ControlPanel/Palette": {
"title": "$:/core/ui/ControlPanel/Palette",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Palette/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/\n\n{{$:/snippets/paletteswitcher}}\n\n<$reveal type=\"nomatch\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"yes\"><<lingo ShowEditor/Caption>></$button>\n\n</$reveal>\n\n<$reveal type=\"match\" state=\"$:/state/ShowPaletteEditor\" text=\"yes\">\n\n<$button set=\"$:/state/ShowPaletteEditor\" setTo=\"no\"><<lingo HideEditor/Caption>></$button>\n{{$:/PaletteManager}}\n\n</$reveal>\n\n"
},
"$:/core/ui/ControlPanel/Parsing": {
"title": "$:/core/ui/ControlPanel/Parsing",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/Parsing/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Parsing/\n\n\\define toggle(Type)\n<$checkbox\ntiddler=\"\"\"$:/config/WikiParserRules/$Type$/$(rule)$\"\"\"\nfield=\"text\"\nchecked=\"enable\"\nunchecked=\"disable\"\ndefault=\"enable\">\n<<rule>>\n</$checkbox>\n\\end\n\n\\define rules(type,Type)\n<$list filter=\"[wikiparserrules[$type$]]\" variable=\"rule\">\n<dd><<toggle $Type$>></dd>\n</$list>\n\\end\n\n<<lingo Hint>>\n\n<dl>\n<dt><<lingo Pragma/Caption>></dt>\n<<rules pragma Pragma>>\n<dt><<lingo Inline/Caption>></dt>\n<<rules inline Inline>>\n<dt><<lingo Block/Caption>></dt>\n<<rules block Block>>\n</dl>"
},
"$:/core/ui/ControlPanel/Plugins/Add/Languages": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Languages",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[language]]\"/>)",
"text": "<<display-server-assets language>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Add/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[plugin]]\"/>)",
"text": "<<display-server-assets plugin>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Add/Themes": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Themes",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}original-plugin-type[theme]]\"/>)",
"text": "<<display-server-assets theme>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Add/Updates": {
"title": "$:/core/ui/ControlPanel/Plugins/Add/Updates",
"caption": "<$importvariables filter=\"$:/core/ui/ControlPanel/Plugins/Add/Updates\">{{$:/language/ControlPanel/Plugins/Updates/Caption}} (<<update-count>>)</$importvariables>",
"text": "\\define each-updateable-plugin(body)\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/RemoteAssetInfo]server-url{!!url}sort[title]]\" variable=\"assetInfo\">\n<$set name=\"libraryVersion\" value={{{ [<assetInfo>get[version]] }}}>\n<$list filter=\"[<assetInfo>get[original-title]has[version]!version<libraryVersion>]\" variable=\"ignore\">\n<$set name=\"installedVersion\" value={{{ [<assetInfo>get[original-title]get[version]] }}}>\n<$list filter=\"[<installedversion>!match<libraryVersion>]\" variable=\"ignore\">\n$body$\n</$list>\n</$set>\n</$list>\n</$set>\n</$list>\n\\end\n\n\\define update-all-actions()\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<<install-plugin-actions>>\n\"\"\"/>\n\\end\n\n\\define update-count()\n<$wikify name=\"count-filter\" text=<<each-updateable-plugin \"[[<$text text=<<assetInfo>>/>]]\">>><$count filter=<<count-filter>>/></$wikify>\n\\end\n\n<$button actions=<<update-all-actions>> class=\"tc-btn-invisible tc-install-plugin tc-reinstall-upgrade\">\n{{$:/core/images/download-button}} {{||$:/language/ControlPanel/Plugins/Updates/UpdateAll/Caption}}\n</$button>\n\n<div class=\"tc-plugin-library-listing\">\n<$macrocall $name=\"each-updateable-plugin\" body=\"\"\"\n<$macrocall $name=\"display-plugin-info\" type={{{ [<assetInfo>get[original-plugin-type]] }}}/>\n\"\"\"/>\n</div>\n"
},
"$:/core/ui/ControlPanel/Plugins/AddPlugins": {
"title": "$:/core/ui/ControlPanel/Plugins/AddPlugins",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n<$button message=\"tm-modal\" param=\"$:/core/ui/ControlPanel/Modals/AddPlugins\" tooltip={{$:/language/ControlPanel/Plugins/Add/Hint}} class=\"tc-btn-big-green tc-primary-btn\">\n{{$:/core/images/download-button}} <<lingo Add/Caption>>\n</$button>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Languages": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Languages",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[language]]\"/>)",
"text": "<<plugin-table language>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[plugin]]\"/>)",
"text": "<<plugin-table plugin>>\n"
},
"$:/core/ui/ControlPanel/Plugins/Installed/Themes": {
"title": "$:/core/ui/ControlPanel/Plugins/Installed/Themes",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}} (<$count filter=\"[!has[draft.of]plugin-type[theme]]\"/>)",
"text": "<<plugin-table theme>>\n"
},
"$:/core/ui/ControlPanel/Plugins": {
"title": "$:/core/ui/ControlPanel/Plugins",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Plugins/\n\n\\define plugin-table(type)\n<$set name=\"plugin-type\" value=\"\"\"$type$\"\"\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n<$list filter=\"[!has[draft.of]plugin-type[$type$]sort[name]]\" emptyMessage=<<lingo \"Empty/Hint\">> template=\"$:/core/ui/Components/plugin-info\"/>\n</$set>\n</$set>\n\\end\n\n{{$:/core/ui/ControlPanel/Plugins/AddPlugins}}\n\n<<lingo Installed/Hint>>\n\n<$macrocall $name=\"tabs\" tabsList=\"[[$:/core/ui/ControlPanel/Plugins/Installed/Plugins]] [[$:/core/ui/ControlPanel/Plugins/Installed/Themes]] [[$:/core/ui/ControlPanel/Plugins/Installed/Languages]]\" default=\"$:/core/ui/ControlPanel/Plugins/Installed/Plugins\" explicitState=\"$:/state/tab--86143343\"/>\n"
},
"$:/core/ui/ControlPanel/Saving/DownloadSaver": {
"title": "$:/core/ui/ControlPanel/Saving/DownloadSaver",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/DownloadSaver/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/DownloadSaver/\n\n<<lingo Hint>>\n\n!! <$link to=\"$:/config/DownloadSaver/AutoSave\"><<lingo AutoSave/Hint>></$link>\n\n<$checkbox tiddler=\"$:/config/DownloadSaver/AutoSave\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <<lingo AutoSave/Description>> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Saving/General": {
"title": "$:/core/ui/ControlPanel/Saving/General",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/General/Caption}}",
"list-before": "",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n{{$:/language/ControlPanel/Saving/General/Hint}}\n\n!! <$link to=\"$:/config/AutoSave\"><<lingo AutoSave/Caption>></$link>\n\n<<lingo AutoSave/Hint>>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"yes\"> <<lingo AutoSave/Enabled/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/AutoSave\" value=\"no\"> <<lingo AutoSave/Disabled/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Saving/Gitea": {
"title": "$:/core/ui/ControlPanel/Saving/Gitea",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/GitService/Gitea/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~Gitea\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/Gitea/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo Gitea/Password>> |<$password name=\"Gitea\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/Gitea/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/Gitea/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/Gitea/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/Gitea/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/Gitea/ServerURL\" default=\"https://gitea/api/v1\" tag=\"input\"/> |\n"
},
"$:/core/ui/ControlPanel/Saving/GitHub": {
"title": "$:/core/ui/ControlPanel/Saving/GitHub",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/GitService/GitHub/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitHub\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitHub/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitHub/Password>> |<$password name=\"github\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitHub/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitHub/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitHub/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitHub/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitHub/ServerURL\" default=\"https://api.github.com\" tag=\"input\"/> |"
},
"$:/core/ui/ControlPanel/Saving/GitLab": {
"title": "$:/core/ui/ControlPanel/Saving/GitLab",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/GitService/GitLab/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/GitService/\n\\define service-name() ~GitLab\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/GitLab/Username\" default=\"\" tag=\"input\"/> |\n|<<lingo GitLab/Password>> |<$password name=\"gitlab\"/> |\n|<<lingo Repo>> |<$edit-text tiddler=\"$:/GitLab/Repo\" default=\"\" tag=\"input\"/> |\n|<<lingo Branch>> |<$edit-text tiddler=\"$:/GitLab/Branch\" default=\"master\" tag=\"input\"/> |\n|<<lingo Path>> |<$edit-text tiddler=\"$:/GitLab/Path\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/GitLab/Filename\" default=\"\" tag=\"input\"/> |\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/GitLab/ServerURL\" default=\"https://gitlab.com/api/v4\" tag=\"input\"/> |"
},
"$:/core/ui/ControlPanel/Saving/TiddlySpot": {
"title": "$:/core/ui/ControlPanel/Saving/TiddlySpot",
"tags": "$:/tags/ControlPanel/Saving",
"caption": "{{$:/language/ControlPanel/Saving/TiddlySpot/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Saving/TiddlySpot/\n\n\\define siteURL(path)\nhttp://$(userName)$.tiddlyspot.com/$path$/\n\\end\n\\define siteLink(path)\n<$reveal type=\"nomatch\" state=\"$:/UploadName\" text=\"\">\n<$set name=\"userName\" value={{$:/UploadName}}>\n<$reveal type=\"match\" state=\"$:/UploadURL\" text=\"\">\n<<siteURL $path$>>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/UploadURL\" text=\"\">\n<$macrocall $name=resolvePath source={{$:/UploadBackupDir}} root={{$:/UploadURL}}>>\n</$reveal>\n</$set>\n</$reveal>\n\\end\n\n<div class=\"tc-message-box\">\n\n<<lingo ReadOnly>>\n\n</div>\n\n<<lingo Description>>\n\n|<<lingo UserName>> |<$edit-text tiddler=\"$:/UploadName\" default=\"\" tag=\"input\"/> |\n|<<lingo Password>> |<$password name=\"upload\"/> |\n|<<lingo Backups>> |<<siteLink backup>> |\n|<<lingo ControlPanel>> |<<siteLink controlpanel>> |\n\n''<<lingo Advanced/Heading>>''\n\n|<<lingo ServerURL>> |<$edit-text tiddler=\"$:/UploadURL\" default=\"\" tag=\"input\"/> |\n|<<lingo Filename>> |<$edit-text tiddler=\"$:/UploadFilename\" default=\"index.html\" tag=\"input\"/> |\n|<<lingo UploadDir>> |<$edit-text tiddler=\"$:/UploadDir\" default=\".\" tag=\"input\"/> |\n|<<lingo BackupDir>> |<$edit-text tiddler=\"$:/UploadBackupDir\" default=\".\" tag=\"input\"/> |\n\n<<lingo TiddlySpot/Hint>>\n"
},
"$:/core/ui/ControlPanel/Saving": {
"title": "$:/core/ui/ControlPanel/Saving",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Saving/Caption}}",
"text": "{{$:/language/ControlPanel/Saving/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Saving]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Saving/General\" explicitState=\"$:/state/tab-2065006209\"/>\n</div>\n"
},
"$:/core/buttonstyles/Borderless": {
"title": "$:/core/buttonstyles/Borderless",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Borderless}}",
"text": "tc-btn-invisible"
},
"$:/core/buttonstyles/Boxed": {
"title": "$:/core/buttonstyles/Boxed",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Boxed}}",
"text": "tc-btn-boxed"
},
"$:/core/buttonstyles/Rounded": {
"title": "$:/core/buttonstyles/Rounded",
"tags": "$:/tags/ToolbarButtonStyle",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Styles/Rounded}}",
"text": "tc-btn-rounded"
},
"$:/core/ui/ControlPanel/Settings/CamelCase": {
"title": "$:/core/ui/ControlPanel/Settings/CamelCase",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/CamelCase/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/CamelCase/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/WikiParserRules/Inline/wikilink\" field=\"text\" checked=\"enable\" unchecked=\"disable\" default=\"enable\"> <$link to=\"$:/config/WikiParserRules/Inline/wikilink\"><<lingo Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab": {
"title": "$:/core/ui/ControlPanel/Settings/DefaultMoreSidebarTab",
"caption": "{{$:/language/ControlPanel/Settings/DefaultMoreSidebarTab/Caption}}",
"tags": "$:/tags/ControlPanel/Settings",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultMoreSidebarTab/\n\n<$link to=\"$:/config/DefaultMoreSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultMoreSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/DefaultSidebarTab": {
"title": "$:/core/ui/ControlPanel/Settings/DefaultSidebarTab",
"caption": "{{$:/language/ControlPanel/Settings/DefaultSidebarTab/Caption}}",
"tags": "$:/tags/ControlPanel/Settings",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/DefaultSidebarTab/\n\n<$link to=\"$:/config/DefaultSidebarTab\"><<lingo Hint>></$link>\n\n<$select tiddler=\"$:/config/DefaultSidebarTab\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\">\n<option value=<<currentTiddler>>><$transclude field=\"caption\"><$text text=<<currentTiddler>>/></$transclude></option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/EditorToolbar": {
"title": "$:/core/ui/ControlPanel/Settings/EditorToolbar",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/EditorToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/EditorToolbar/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/TextEditor/EnableToolbar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/TextEditor/EnableToolbar\"><<lingo Description>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/InfoPanelMode": {
"title": "$:/core/ui/ControlPanel/Settings/InfoPanelMode",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/InfoPanelMode/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/InfoPanelMode/\n<$link to=\"$:/config/TiddlerInfo/Mode\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"popup\"> <<lingo Popup/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/TiddlerInfo/Mode\" value=\"sticky\"> <<lingo Sticky/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/LinkToBehaviour": {
"title": "$:/core/ui/ControlPanel/Settings/LinkToBehaviour",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/LinkToBehaviour/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/LinkToBehaviour/\n\n<$link to=\"$:/config/Navigation/openLinkFromInsideRiver\"><<lingo \"InsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromInsideRiver\">\n <option value=\"above\"><<lingo \"OpenAbove\">></option>\n <option value=\"below\"><<lingo \"OpenBelow\">></option>\n <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n\n<$link to=\"$:/config/Navigation/openLinkFromOutsideRiver\"><<lingo \"OutsideRiver/Hint\">></$link>\n\n<$select tiddler=\"$:/config/Navigation/openLinkFromOutsideRiver\">\n <option value=\"top\"><<lingo \"OpenAtTop\">></option>\n <option value=\"bottom\"><<lingo \"OpenAtBottom\">></option>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings/MissingLinks": {
"title": "$:/core/ui/ControlPanel/Settings/MissingLinks",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/MissingLinks/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/MissingLinks/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/MissingLinks\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/MissingLinks\"><<lingo Description>></$link> </$checkbox>\n\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationAddressBar": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationAddressBar",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationAddressBar/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationAddressBar/\n\n<$link to=\"$:/config/Navigation/UpdateAddressBar\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permaview\"> <<lingo Permaview/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"permalink\"> <<lingo Permalink/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateAddressBar\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationHistory": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationHistory",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationHistory/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationHistory/\n<$link to=\"$:/config/Navigation/UpdateHistory\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Navigation/UpdateHistory\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode": {
"title": "$:/core/ui/ControlPanel/Settings/NavigationPermalinkviewMode",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/NavigationPermalinkviewMode/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/NavigationPermalinkviewMode/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/CopyToClipboard\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/CopyToClipboard\"><<lingo CopyToClipboard/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Navigation/Permalinkview/UpdateAddressBar\"><<lingo UpdateAddressBar/Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation": {
"title": "$:/core/ui/ControlPanel/Settings/PerformanceInstrumentation",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/PerformanceInstrumentation/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/PerformanceInstrumentation/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Performance/Instrumentation\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Performance/Instrumentation\"><<lingo Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/TitleLinks": {
"title": "$:/core/ui/ControlPanel/Settings/TitleLinks",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/TitleLinks/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/TitleLinks/\n<$link to=\"$:/config/Tiddlers/TitleLinks\"><<lingo Hint>></$link>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"yes\"> <<lingo Yes/Description>> </$radio>\n\n<$radio tiddler=\"$:/config/Tiddlers/TitleLinks\" value=\"no\"> <<lingo No/Description>> </$radio>\n"
},
"$:/core/ui/ControlPanel/Settings/ToolbarButtons": {
"title": "$:/core/ui/ControlPanel/Settings/ToolbarButtons",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtons/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtons/\n<<lingo Hint>>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Icons\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"yes\"> <$link to=\"$:/config/Toolbar/Icons\"><<lingo Icons/Description>></$link> </$checkbox>\n\n<$checkbox tiddler=\"$:/config/Toolbar/Text\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> <$link to=\"$:/config/Toolbar/Text\"><<lingo Text/Description>></$link> </$checkbox>\n"
},
"$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle": {
"title": "$:/core/ui/ControlPanel/Settings/ToolbarButtonStyle",
"tags": "$:/tags/ControlPanel/Settings",
"caption": "{{$:/language/ControlPanel/Settings/ToolbarButtonStyle/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/ToolbarButtonStyle/\n<$link to=\"$:/config/Toolbar/ButtonClass\"><<lingo \"Hint\">></$link>\n\n<$select tiddler=\"$:/config/Toolbar/ButtonClass\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ToolbarButtonStyle]]\">\n<option value={{!!text}}>{{!!caption}}</option>\n</$list>\n</$select>\n"
},
"$:/core/ui/ControlPanel/Settings": {
"title": "$:/core/ui/ControlPanel/Settings",
"tags": "$:/tags/ControlPanel",
"caption": "{{$:/language/ControlPanel/Settings/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/Settings/\n\n<<lingo Hint>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Settings]]\">\n\n<div style=\"border-top:1px solid #eee;\">\n\n!! <$link><$transclude field=\"caption\"/></$link>\n\n<$transclude/>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ControlPanel/StoryView": {
"title": "$:/core/ui/ControlPanel/StoryView",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/StoryView/Caption}}",
"text": "{{$:/snippets/viewswitcher}}\n"
},
"$:/core/ui/ControlPanel/Stylesheets": {
"title": "$:/core/ui/ControlPanel/Stylesheets",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/Stylesheets/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo Stylesheets/Hint>>\n\n{{$:/snippets/peek-stylesheets}}\n"
},
"$:/core/ui/ControlPanel/Theme": {
"title": "$:/core/ui/ControlPanel/Theme",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Theme/Caption}}",
"text": "{{$:/snippets/themeswitcher}}\n"
},
"$:/core/ui/ControlPanel/TiddlerFields": {
"title": "$:/core/ui/ControlPanel/TiddlerFields",
"tags": "$:/tags/ControlPanel/Advanced",
"caption": "{{$:/language/ControlPanel/TiddlerFields/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\n<<lingo TiddlerFields/Hint>>\n\n{{$:/snippets/allfields}}"
},
"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate",
"text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"><$transclude tiddler={{!!icon}}/></span> <$transclude field=\"caption\"/> -- <i class=\"tc-muted\"><$transclude field=\"description\"/></i>\n</$draggable>\n"
},
"$:/core/ui/ControlPanel/Toolbars/EditorToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditorToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/EditorToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditorToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditorToolbar/Hint}}\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditorToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/EditorItemTemplate\"/>\n"
},
"$:/core/ui/ControlPanel/Toolbars/EditToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/EditToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/EditToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/EditToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/EditToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/EditToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>"
},
"$:/core/ui/ControlPanel/Toolbars/ItemTemplate": {
"title": "$:/core/ui/ControlPanel/Toolbars/ItemTemplate",
"text": "\\define config-title()\n$(config-base)$$(currentTiddler)$\n\\end\n\n<$draggable tiddler=<<currentTiddler>>>\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <span class=\"tc-icon-wrapper\"> <$transclude field=\"caption\"/> <i class=\"tc-muted\">-- <$transclude field=\"description\"/></i></span>\n</$draggable>\n"
},
"$:/core/ui/ControlPanel/Toolbars/PageControls": {
"title": "$:/core/ui/ControlPanel/Toolbars/PageControls",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/PageControls/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/PageControlButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/PageControls/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/PageControls\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars/ViewToolbar": {
"title": "$:/core/ui/ControlPanel/Toolbars/ViewToolbar",
"tags": "$:/tags/ControlPanel/Toolbars",
"caption": "{{$:/language/ControlPanel/Toolbars/ViewToolbar/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\n\\define config-base() $:/config/ViewToolbarButtons/Visibility/\n\n{{$:/language/ControlPanel/Toolbars/ViewToolbar/Hint}}\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$macrocall $name=\"list-tagged-draggable\" tag=\"$:/tags/ViewToolbar\" itemTemplate=\"$:/core/ui/ControlPanel/Toolbars/ItemTemplate\"/>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/ControlPanel/Toolbars": {
"title": "$:/core/ui/ControlPanel/Toolbars",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/Toolbars/Caption}}",
"text": "{{$:/language/ControlPanel/Toolbars/Hint}}\n\n<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel/Toolbars]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Toolbars/ViewToolbar\" class=\"tc-vertical\" explicitState=\"$:/state/tabs/controlpanel/toolbars-1345989671\"/>\n</div>\n"
},
"$:/ControlPanel": {
"title": "$:/ControlPanel",
"icon": "$:/core/images/options-button",
"color": "#bbb",
"text": "<div class=\"tc-control-panel\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/ControlPanel]!has[draft.of]]\" default=\"$:/core/ui/ControlPanel/Info\" explicitState=\"$:/state/tab-1749438307\"/>\n</div>\n"
},
"$:/core/ui/DefaultSearchResultList": {
"title": "$:/core/ui/DefaultSearchResultList",
"tags": "$:/tags/SearchResults",
"caption": "{{$:/language/Search/DefaultResults/Caption}}",
"first-search-filter": "[!is[system]search:title<userInput>sort[title]limit[250]]",
"second-search-filter": "[!is[system]search<userInput>sort[title]limit[250]]",
"text": "\\define searchResultList()\n//<small>{{$:/language/Search/Matches/Title}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[first-search-filter]] }}}>\n<span class={{{[<currentTiddler>addsuffix[-primaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n//<small>{{$:/language/Search/Matches/All}}</small>//\n\n<$list filter=\"[<userInput>minlength[1]]\" variable=\"ignore\">\n<$list filter={{{ [<configTiddler>get[second-search-filter]] }}}>\n<span class={{{[<currentTiddler>addsuffix[-secondaryList]] -[<searchListState>get[text]] +[then[]else[tc-list-item-selected]] }}}>\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</span>\n</$list>\n</$list>\n\n\\end\n<<searchResultList>>\n"
},
"$:/core/ui/EditorToolbar/bold": {
"title": "$:/core/ui/EditorToolbar/bold",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/bold",
"caption": "{{$:/language/Buttons/Bold/Caption}}",
"description": "{{$:/language/Buttons/Bold/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((bold))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"''\"\n\tsuffix=\"''\"\n/>\n"
},
"$:/core/ui/EditorToolbar/clear-dropdown": {
"title": "$:/core/ui/EditorToolbar/clear-dropdown",
"text": "''{{$:/language/Buttons/Clear/Hint}}''\n\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"clear\"\n\tcolour=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n\n</div>\n"
},
"$:/core/ui/EditorToolbar/clear": {
"title": "$:/core/ui/EditorToolbar/clear",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/erase",
"caption": "{{$:/language/Buttons/Clear/Caption}}",
"description": "{{$:/language/Buttons/Clear/Hint}}",
"condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
"dropdown": "$:/core/ui/EditorToolbar/clear-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/editor-height-dropdown": {
"title": "$:/core/ui/EditorToolbar/editor-height-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/EditorHeight/\n''<<lingo Hint>>''\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"auto\"> {{$:/core/images/auto-height}} <<lingo Caption/Auto>></$radio>\n\n<$radio tiddler=\"$:/config/TextEditor/EditorHeight/Mode\" value=\"fixed\"> {{$:/core/images/fixed-height}} <<lingo Caption/Fixed>> <$edit-text tag=\"input\" tiddler=\"$:/config/TextEditor/EditorHeight/Height\" default=\"100px\"/></$radio>\n"
},
"$:/core/ui/EditorToolbar/editor-height": {
"title": "$:/core/ui/EditorToolbar/editor-height",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/fixed-height",
"custom-icon": "yes",
"caption": "{{$:/language/Buttons/EditorHeight/Caption}}",
"description": "{{$:/language/Buttons/EditorHeight/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]",
"dropdown": "$:/core/ui/EditorToolbar/editor-height-dropdown",
"text": "<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n{{$:/core/images/fixed-height}}\n</$reveal>\n<$reveal tag=\"span\" state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n{{$:/core/images/auto-height}}\n</$reveal>\n"
},
"$:/core/ui/EditorToolbar/excise-dropdown": {
"title": "$:/core/ui/EditorToolbar/excise-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Excise/\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<<lingo Caption/NewTitle>> <$edit-text tag=\"input\" tiddler=\"$config-title$/new-title\" default=\"\" focus=\"true\"/>\n\n<$set name=\"new-title\" value={{$config-title$/new-title}}>\n<$list filter=\"\"\"[<new-title>is[tiddler]]\"\"\">\n<div class=\"tc-error\">\n<<lingo Caption/TiddlerExists>>\n</div>\n</$list>\n</$set>\n\n<$checkbox tiddler=\"\"\"$config-title$/tagnew\"\"\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"false\"> <<lingo Caption/Tag>></$checkbox>\n\n<<lingo Caption/Replace>> <$select tiddler=\"\"\"$config-title$/type\"\"\" default=\"transclude\">\n<option value=\"link\"><<lingo Caption/Replace/Link>></option>\n<option value=\"transclude\"><<lingo Caption/Replace/Transclusion>></option>\n<option value=\"macro\"><<lingo Caption/Replace/Macro>></option>\n</$select>\n\n<$reveal state=\"\"\"$config-title$/type\"\"\" type=\"match\" text=\"macro\">\n<<lingo Caption/MacroName>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/macro-title\"\"\" default=\"translink\"/>\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"excise\"\n\ttitle={{$config-title$/new-title}}\n\ttype={{$config-title$/type}}\n\tmacro={{$config-title$/macro-title}}\n\ttagnew={{$config-title$/tagnew}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"$config-title$/new-title\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Excise>>\n</$button>\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Excise/\">>/>\n"
},
"$:/core/ui/EditorToolbar/excise": {
"title": "$:/core/ui/EditorToolbar/excise",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/excise",
"caption": "{{$:/language/Buttons/Excise/Caption}}",
"description": "{{$:/language/Buttons/Excise/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>type[text/vnd.tiddlywiki]] +[first[]]",
"shortcuts": "((excise))",
"dropdown": "$:/core/ui/EditorToolbar/excise-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/heading-1": {
"title": "$:/core/ui/EditorToolbar/heading-1",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-1",
"caption": "{{$:/language/Buttons/Heading1/Caption}}",
"description": "{{$:/language/Buttons/Heading1/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((heading-1))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-2": {
"title": "$:/core/ui/EditorToolbar/heading-2",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-2",
"caption": "{{$:/language/Buttons/Heading2/Caption}}",
"description": "{{$:/language/Buttons/Heading2/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-2))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"2\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-3": {
"title": "$:/core/ui/EditorToolbar/heading-3",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-3",
"caption": "{{$:/language/Buttons/Heading3/Caption}}",
"description": "{{$:/language/Buttons/Heading3/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-3))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"3\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-4": {
"title": "$:/core/ui/EditorToolbar/heading-4",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-4",
"caption": "{{$:/language/Buttons/Heading4/Caption}}",
"description": "{{$:/language/Buttons/Heading4/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-4))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"4\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-5": {
"title": "$:/core/ui/EditorToolbar/heading-5",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-5",
"caption": "{{$:/language/Buttons/Heading5/Caption}}",
"description": "{{$:/language/Buttons/Heading5/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-5))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"5\"\n/>\n"
},
"$:/core/ui/EditorToolbar/heading-6": {
"title": "$:/core/ui/EditorToolbar/heading-6",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/heading-6",
"caption": "{{$:/language/Buttons/Heading6/Caption}}",
"description": "{{$:/language/Buttons/Heading6/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((heading-6))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"!\"\n\tcount=\"6\"\n/>\n"
},
"$:/core/ui/EditorToolbar/italic": {
"title": "$:/core/ui/EditorToolbar/italic",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/italic",
"caption": "{{$:/language/Buttons/Italic/Caption}}",
"description": "{{$:/language/Buttons/Italic/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((italic))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"//\"\n\tsuffix=\"//\"\n/>\n"
},
"$:/core/ui/EditorToolbar/line-width-dropdown": {
"title": "$:/core/ui/EditorToolbar/line-width-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/LineWidth/\n\n\\define toolbar-line-width-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(line-width)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/LineWidth\"\n\t$value=\"$(line-width)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; margin: 4px calc(80px - $(line-width)$); background-color: #000; width: calc(100px + $(line-width)$ * 2); height: $(line-width)$; border-radius: 120px; vertical-align: middle;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(line-width)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/LineWidth\" type=\"match\" text=\"\"\"$(line-width)$\"\"\" tag=\"span\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/LineWidths}} variable=\"line-width\">\n\n<<toolbar-line-width-inner>>\n\n</$list>\n"
},
"$:/core/ui/EditorToolbar/line-width": {
"title": "$:/core/ui/EditorToolbar/line-width",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/line-width",
"caption": "{{$:/language/Buttons/LineWidth/Caption}}",
"description": "{{$:/language/Buttons/LineWidth/Hint}}",
"condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
"dropdown": "$:/core/ui/EditorToolbar/line-width-dropdown",
"text": "<$text text={{$:/config/BitmapEditor/LineWidth}}/>\n"
},
"$:/core/ui/EditorToolbar/link-dropdown": {
"title": "$:/core/ui/EditorToolbar/link-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Link/\n\n\\define add-link-actions()\n<$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"make-link\" text={{$(linkTiddler)$}} />\n<$action-deletetiddler $filter=\"[<dropdown-state>] [<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\\end\n\n\\define get-focus-selector() [data-tiddler-title=\"$(cssEscapedTitle)$\"] .tc-create-wikitext-link input\n\n\\define cancel-search-actions-inner()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}><$list filter=\"[<searchTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[<searchTiddler>] [<linkTiddler>] [<storeTitle>] [<searchListState>]\"/>\"\"\"><$action-setfield $tiddler=<<searchTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/></$list></$set>\n\\end\n\n\\define cancel-search-actions() <$list filter=\"[<storeTitle>!has[text]] +[<searchTiddler>!has[text]]\" emptyMessage=\"\"\"<<cancel-search-actions-inner>>\"\"\"><$action-sendmessage $message=\"tm-edit-text-operation\" $param=\"wrap-selection\" prefix=\"\" suffix=\"\"/></$list>\n\n\\define external-link()\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\" actions=<<add-link-actions>>>\n{{$:/core/images/chevron-right}}\n</$button>\n\\end\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define body(config-title)\n''<<lingo Hint>>''\n\n<$vars searchTiddler=\"\"\"$config-title$/search\"\"\" linkTiddler=\"\"\"$config-title$/link\"\"\" linktext=\"\" searchListState=<<qualify \"$:/temp/link-search/selected-item\">> refreshTitle=<<qualify \"$:/temp/link-search/refresh\">> storeTitle=<<qualify \"$:/temp/link-search/input\">>>\n\n<$vars linkTiddler=<<searchTiddler>>>\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">> class=\"tc-create-wikitext-link\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<searchTiddler>> storeTitle=<<storeTitle>>\n\t\tselectionStateTitle=<<searchListState>> refreshTitle=<<refreshTitle>> type=\"search\" filterMinLength=\"1\"\n\t\ttag=\"input\" focus=\"true\" class=\"tc-popup-handle\" inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<add-link-actions>> placeholder={{$:/language/Search/Search}} default=\"\" \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\" />\n</$keyboard>\n</$keyboard>\n<$reveal tag=\"span\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n<<external-link>>\n<$button class=\"tc-btn-invisible\" style=\"width: auto; display: inline-block; background-colour: inherit;\">\n<<cancel-search-actions>><$set name=\"cssEscapedTitle\" value={{{ [<storyTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-focus-selector>>/></$set>\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</$vars>\n\n<$reveal tag=\"div\" state=<<storeTitle>> type=\"nomatch\" text=\"\">\n\n<$linkcatcher actions=<<add-link-actions>> to=<<linkTiddler>>>\n\n<$vars userInput={{{ [<storeTitle>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}>\n\n{{$:/core/ui/SearchResults}}\n\n</$vars>\n\n</$linkcatcher>\n\n</$reveal>\n\n</$vars>\n\n\\end\n\n<$macrocall $name=\"body\" config-title=<<qualify \"$:/state/Link/\">>/>\n"
},
"$:/core/ui/EditorToolbar/link": {
"title": "$:/core/ui/EditorToolbar/link",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/link",
"caption": "{{$:/language/Buttons/Link/Caption}}",
"description": "{{$:/language/Buttons/Link/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((link))",
"dropdown": "$:/core/ui/EditorToolbar/link-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/linkify": {
"title": "$:/core/ui/EditorToolbar/linkify",
"caption": "{{$:/language/Buttons/Linkify/Caption}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Buttons/Linkify/Hint}}",
"icon": "$:/core/images/linkify",
"list-before": "$:/core/ui/EditorToolbar/mono-block",
"shortcuts": "((linkify))",
"tags": "$:/tags/EditorToolbar",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"[[\"\n\tsuffix=\"]]\"\n/>\n"
},
"$:/core/ui/EditorToolbar/list-bullet": {
"title": "$:/core/ui/EditorToolbar/list-bullet",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-bullet",
"caption": "{{$:/language/Buttons/ListBullet/Caption}}",
"description": "{{$:/language/Buttons/ListBullet/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((list-bullet))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"*\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/list-number": {
"title": "$:/core/ui/EditorToolbar/list-number",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/list-number",
"caption": "{{$:/language/Buttons/ListNumber/Caption}}",
"description": "{{$:/language/Buttons/ListNumber/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((list-number))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"prefix-lines\"\n\tcharacter=\"#\"\n\tcount=\"1\"\n/>\n"
},
"$:/core/ui/EditorToolbar/mono-block": {
"title": "$:/core/ui/EditorToolbar/mono-block",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/mono-block",
"caption": "{{$:/language/Buttons/MonoBlock/Caption}}",
"description": "{{$:/language/Buttons/MonoBlock/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((mono-block))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n```\"\n\tsuffix=\"```\"\n/>\n"
},
"$:/core/ui/EditorToolbar/mono-line": {
"title": "$:/core/ui/EditorToolbar/mono-line",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/mono-line",
"caption": "{{$:/language/Buttons/MonoLine/Caption}}",
"description": "{{$:/language/Buttons/MonoLine/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((mono-line))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"`\"\n\tsuffix=\"`\"\n/>\n"
},
"$:/core/ui/EditorToolbar/more-dropdown": {
"title": "$:/core/ui/EditorToolbar/more-dropdown",
"text": "\\define config-title()\n$:/config/EditorToolbarButtons/Visibility/$(toolbarItem)$\n\\end\n\n\\define conditional-button()\n<$list filter={{$(toolbarItem)$!!condition}} variable=\"condition\">\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\" mode=\"inline\"/> <$transclude tiddler=<<toolbarItem>> field=\"description\"/>\n</$list>\n\\end\n\n<div class=\"tc-text-editor-toolbar-more\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]] -[[$:/core/ui/EditorToolbar/more]]\">\n<$reveal type=\"match\" state=<<config-visibility-title>> text=\"hide\" tag=\"div\">\n<<conditional-button>>\n</$reveal>\n</$list>\n</div>\n"
},
"$:/core/ui/EditorToolbar/more": {
"title": "$:/core/ui/EditorToolbar/more",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/down-arrow",
"caption": "{{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"condition": "[<targetTiddler>]",
"dropdown": "$:/core/ui/EditorToolbar/more-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/opacity-dropdown": {
"title": "$:/core/ui/EditorToolbar/opacity-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Opacity/\n\n\\define toolbar-opacity-inner()\n<$button tag=\"a\" tooltip=\"\"\"$(opacity)$\"\"\">\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Opacity\"\n\t$value=\"$(opacity)$\"\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(current-paint-colour)$; opacity: $(opacity)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\n<span style=\"margin-left: 8px;\">\n\n<$text text=\"\"\"$(opacity)$\"\"\"/>\n\n<$reveal state=\"$:/config/BitmapEditor/Opacity\" type=\"match\" text=\"\"\"$(opacity)$\"\"\" tag=\"span\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</span>\n\n</$button>\n\\end\n\n\\define toolbar-opacity()\n''<<lingo Hint>>''\n\n<$list filter={{$:/config/BitmapEditor/Opacities}} variable=\"opacity\">\n\n<<toolbar-opacity-inner>>\n\n</$list>\n\\end\n\n<$set name=\"current-paint-colour\" value={{$:/config/BitmapEditor/Colour}}>\n\n<$set name=\"current-opacity\" value={{$:/config/BitmapEditor/Opacity}}>\n\n<<toolbar-opacity>>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/EditorToolbar/opacity": {
"title": "$:/core/ui/EditorToolbar/opacity",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/opacity",
"caption": "{{$:/language/Buttons/Opacity/Caption}}",
"description": "{{$:/language/Buttons/Opacity/Hint}}",
"condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
"dropdown": "$:/core/ui/EditorToolbar/opacity-dropdown",
"text": "<$text text={{$:/config/BitmapEditor/Opacity}}/>\n"
},
"$:/core/ui/EditorToolbar/paint-dropdown": {
"title": "$:/core/ui/EditorToolbar/paint-dropdown",
"text": "''{{$:/language/Buttons/Paint/Hint}}''\n\n<$macrocall $name=\"colour-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/config/BitmapEditor/Colour\"\n\t$value=<<colour-picker-value>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
},
"$:/core/ui/EditorToolbar/paint": {
"title": "$:/core/ui/EditorToolbar/paint",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/paint",
"caption": "{{$:/language/Buttons/Paint/Caption}}",
"description": "{{$:/language/Buttons/Paint/Hint}}",
"condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
"dropdown": "$:/core/ui/EditorToolbar/paint-dropdown",
"text": "\\define toolbar-paint()\n<div style=\"display: inline-block; vertical-align: middle; background-color: $(colour-picker-value)$; width: 1em; height: 1em; border-radius: 50%;\"/>\n\\end\n<$set name=\"colour-picker-value\" value={{$:/config/BitmapEditor/Colour}}>\n<<toolbar-paint>>\n</$set>\n"
},
"$:/core/ui/EditorToolbar/picture-dropdown": {
"title": "$:/core/ui/EditorToolbar/picture-dropdown",
"text": "\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n''{{$:/language/Buttons/Picture/Hint}}''\n\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext=<<replacement-text>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n\"\"\"/>\n"
},
"$:/core/ui/EditorToolbar/picture": {
"title": "$:/core/ui/EditorToolbar/picture",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/picture",
"caption": "{{$:/language/Buttons/Picture/Caption}}",
"description": "{{$:/language/Buttons/Picture/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((picture))",
"dropdown": "$:/core/ui/EditorToolbar/picture-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/preview-type-dropdown": {
"title": "$:/core/ui/EditorToolbar/preview-type-dropdown",
"text": "\\define preview-type-button()\n<$button tag=\"a\">\n\n<$action-setfield $tiddler=\"$:/state/editpreviewtype\" $value=\"$(previewType)$\"/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<previewType>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<previewType>> field=\"title\" mode=\"inline\"/>\n\n</$transclude> \n\n<$reveal tag=\"span\" state=\"$:/state/editpreviewtype\" type=\"match\" text=<<previewType>> default=\"$:/core/ui/EditTemplate/body/preview/output\">\n\n<$entity entity=\" \"/>\n\n<$entity entity=\"✓\"/>\n\n</$reveal>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]]\" variable=\"previewType\">\n\n<<preview-type-button>>\n\n</$list>\n"
},
"$:/core/ui/EditorToolbar/preview-type": {
"title": "$:/core/ui/EditorToolbar/preview-type",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/chevron-down",
"caption": "{{$:/language/Buttons/PreviewType/Caption}}",
"description": "{{$:/language/Buttons/PreviewType/Hint}}",
"condition": "[all[shadows+tiddlers]tag[$:/tags/EditPreview]!has[draft.of]butfirst[]limit[1]]",
"button-classes": "tc-text-editor-toolbar-item-adjunct",
"dropdown": "$:/core/ui/EditorToolbar/preview-type-dropdown"
},
"$:/core/ui/EditorToolbar/preview": {
"title": "$:/core/ui/EditorToolbar/preview",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/preview-open",
"custom-icon": "yes",
"caption": "{{$:/language/Buttons/Preview/Caption}}",
"description": "{{$:/language/Buttons/Preview/Hint}}",
"condition": "[<targetTiddler>]",
"button-classes": "tc-text-editor-toolbar-item-start-group",
"shortcuts": "((preview))",
"text": "<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-open}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"no\"/>\n</$reveal>\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\" tag=\"span\">\n{{$:/core/images/preview-closed}}\n<$action-setfield $tiddler=\"$:/state/showeditpreview\" $value=\"yes\"/>\n</$reveal>\n"
},
"$:/core/ui/EditorToolbar/quote": {
"title": "$:/core/ui/EditorToolbar/quote",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/quote",
"caption": "{{$:/language/Buttons/Quote/Caption}}",
"description": "{{$:/language/Buttons/Quote/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((quote))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-lines\"\n\tprefix=\"\n<<<\"\n\tsuffix=\"<<<\"\n/>\n"
},
"$:/core/ui/EditorToolbar/rotate-left": {
"title": "$:/core/ui/EditorToolbar/rotate-left",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/rotate-left",
"caption": "{{$:/language/Buttons/RotateLeft/Caption}}",
"description": "{{$:/language/Buttons/RotateLeft/Hint}}",
"condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"rotate-left\"\n/>\n"
},
"$:/core/ui/EditorToolbar/size-dropdown": {
"title": "$:/core/ui/EditorToolbar/size-dropdown",
"text": "\\define lingo-base() $:/language/Buttons/Size/\n\n\\define toolbar-button-size-preset(config-title)\n<$set name=\"width\" filter=\"$(sizePair)$ +[first[]]\">\n\n<$set name=\"height\" filter=\"$(sizePair)$ +[last[]]\">\n\n<$button tag=\"a\">\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n\t$value=<<width>>\n/>\n\n<$action-setfield\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n\t$value=<<height>>\n/>\n\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/presets-popup\"\"\"\n/>\n\n<$text text=<<width>>/> × <$text text=<<height>>/>\n\n</$button>\n\n</$set>\n\n</$set>\n\\end\n\n\\define toolbar-button-size(config-title)\n''{{$:/language/Buttons/Size/Hint}}''\n\n<<lingo Caption/Width>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-width\"\"\" default=<<tv-bitmap-editor-width>> focus=\"true\" size=\"8\"/> <<lingo Caption/Height>> <$edit-text tag=\"input\" tiddler=\"\"\"$config-title$/new-height\"\"\" default=<<tv-bitmap-editor-height>> size=\"8\"/> <$button popup=\"\"\"$config-title$/presets-popup\"\"\" class=\"tc-btn-invisible tc-popup-keep\" style=\"width: auto; display: inline-block; background-colour: inherit;\" selectedClass=\"tc-selected\">\n{{$:/core/images/down-arrow}}\n</$button>\n\n<$reveal tag=\"span\" state=\"\"\"$config-title$/presets-popup\"\"\" type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down tc-popup-keep\">\n\n<$list filter={{$:/config/BitmapEditor/ImageSizes}} variable=\"sizePair\">\n\n<$macrocall $name=\"toolbar-button-size-preset\" config-title=\"$config-title$\"/>\n\n</$list>\n\n</div>\n\n</$reveal>\n\n<$button>\n<$action-sendmessage\n\t$message=\"tm-edit-bitmap-operation\"\n\t$param=\"resize\"\n\twidth={{$config-title$/new-width}}\n\theight={{$config-title$/new-height}}\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-width\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=\"\"\"$config-title$/new-height\"\"\"\n/>\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n<<lingo Caption/Resize>>\n</$button>\n\\end\n\n<$macrocall $name=\"toolbar-button-size\" config-title=<<qualify \"$:/state/Size/\">>/>\n"
},
"$:/core/ui/EditorToolbar/size": {
"title": "$:/core/ui/EditorToolbar/size",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/size",
"caption": "{{$:/language/Buttons/Size/Caption}}",
"description": "{{$:/language/Buttons/Size/Hint}}",
"condition": "[<targetTiddler>is[image]] -[<targetTiddler>type[image/svg+xml]]",
"dropdown": "$:/core/ui/EditorToolbar/size-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/stamp-dropdown": {
"title": "$:/core/ui/EditorToolbar/stamp-dropdown",
"text": "\\define toolbar-button-stamp-inner()\n<$button tag=\"a\">\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"replace-selection\"\n\ttext={{$(snippetTitle)$}}\n/>\n\n</$list>\n\n\n<$list filter=\"[[$(snippetTitle)$]addsuffix[/prefix]is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]is[missing]] [[$(snippetTitle)$]addsuffix[/prefix]!is[missing]removesuffix[/prefix]addsuffix[/suffix]!is[missing]]\">\n\n<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix={{{ [[$(snippetTitle)$]addsuffix[/prefix]get[text]] }}}\nsuffix={{{ [[$(snippetTitle)$]addsuffix[/suffix]get[text]] }}}\n/>\n\n</$list>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<$transclude tiddler=<<snippetTitle>> field=\"caption\" mode=\"inline\">\n\n<$view tiddler=<<snippetTitle>> field=\"title\" />\n\n</$transclude>\n\n</$button>\n\\end\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TextEditor/Snippet]!has[draft.of]sort[caption]]\" variable=\"snippetTitle\">\n\n<<toolbar-button-stamp-inner>>\n\n</$list>\n\n----\n\n<$button tag=\"a\">\n\n<$action-sendmessage\n\t$message=\"tm-new-tiddler\"\n\ttags=\"$:/tags/TextEditor/Snippet\"\n\tcaption={{$:/language/Buttons/Stamp/New/Title}}\n\ttext={{$:/language/Buttons/Stamp/New/Text}}\n/>\n\n<$action-deletetiddler\n\t$tiddler=<<dropdown-state>>\n/>\n\n<em>\n\n<$text text={{$:/language/Buttons/Stamp/Caption/New}}/>\n\n</em>\n\n</$button>\n"
},
"$:/core/ui/EditorToolbar/stamp": {
"title": "$:/core/ui/EditorToolbar/stamp",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/stamp",
"caption": "{{$:/language/Buttons/Stamp/Caption}}",
"description": "{{$:/language/Buttons/Stamp/Hint}}",
"condition": "[<targetTiddler>type[]] [<targetTiddler>get[type]prefix[text/]] [<targetTiddler>get[type]match[application/javascript]] [<targetTiddler>get[type]match[application/json]] [<targetTiddler>get[type]match[application/x-tiddler-dictionary]] [<targetTiddler>get[type]match[image/svg+xml]] +[first[]]",
"shortcuts": "((stamp))",
"dropdown": "$:/core/ui/EditorToolbar/stamp-dropdown",
"text": ""
},
"$:/core/ui/EditorToolbar/strikethrough": {
"title": "$:/core/ui/EditorToolbar/strikethrough",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/strikethrough",
"caption": "{{$:/language/Buttons/Strikethrough/Caption}}",
"description": "{{$:/language/Buttons/Strikethrough/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((strikethrough))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"~~\"\n\tsuffix=\"~~\"\n/>\n"
},
"$:/core/ui/EditorToolbar/subscript": {
"title": "$:/core/ui/EditorToolbar/subscript",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/subscript",
"caption": "{{$:/language/Buttons/Subscript/Caption}}",
"description": "{{$:/language/Buttons/Subscript/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((subscript))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\",,\"\n\tsuffix=\",,\"\n/>\n"
},
"$:/core/ui/EditorToolbar/superscript": {
"title": "$:/core/ui/EditorToolbar/superscript",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/superscript",
"caption": "{{$:/language/Buttons/Superscript/Caption}}",
"description": "{{$:/language/Buttons/Superscript/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((superscript))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"^^\"\n\tsuffix=\"^^\"\n/>\n"
},
"$:/core/ui/EditorToolbar/transcludify": {
"title": "$:/core/ui/EditorToolbar/transcludify",
"caption": "{{$:/language/Buttons/Transcludify/Caption}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Buttons/Transcludify/Hint}}",
"icon": "$:/core/images/transcludify",
"list-before": "$:/core/ui/EditorToolbar/mono-block",
"shortcuts": "((transcludify))",
"tags": "$:/tags/EditorToolbar",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"{{\"\n\tsuffix=\"}}\"\n/>\n"
},
"$:/core/ui/EditorToolbar/underline": {
"title": "$:/core/ui/EditorToolbar/underline",
"tags": "$:/tags/EditorToolbar",
"icon": "$:/core/images/underline",
"caption": "{{$:/language/Buttons/Underline/Caption}}",
"description": "{{$:/language/Buttons/Underline/Hint}}",
"condition": "[<targetTiddler>!has[type]] [<targetTiddler>type[text/vnd.tiddlywiki]]",
"shortcuts": "((underline))",
"text": "<$action-sendmessage\n\t$message=\"tm-edit-text-operation\"\n\t$param=\"wrap-selection\"\n\tprefix=\"__\"\n\tsuffix=\"__\"\n/>\n"
},
"$:/core/ui/EditTemplate/body/editor": {
"title": "$:/core/ui/EditTemplate/body/editor",
"text": "<$edit\n\n field=\"text\"\n class=\"tc-edit-texteditor tc-edit-texteditor-body\"\n placeholder={{$:/language/EditTemplate/Body/Placeholder}}\n tabindex={{$:/config/EditTabIndex}}\n focus={{{ [{$:/config/AutoFocus}match[text]then[true]] ~[[false]] }}}\n cancelPopups=\"yes\"\n\n><$set\n\n name=\"targetTiddler\"\n value=<<currentTiddler>>\n\n><$list\n\n filter=\"[all[shadows+tiddlers]tag[$:/tags/EditorToolbar]!has[draft.of]]\"\n\n><$reveal\n\n type=\"nomatch\"\n state=<<config-visibility-title>>\n text=\"hide\"\n class=\"tc-text-editor-toolbar-item-wrapper\"\n\n><$transclude\n\n tiddler=\"$:/core/ui/EditTemplate/body/toolbar/button\"\n mode=\"inline\"\n\n/></$reveal></$list></$set></$edit>\n"
},
"$:/core/ui/EditTemplate/body/toolbar/button": {
"title": "$:/core/ui/EditTemplate/body/toolbar/button",
"text": "\\define toolbar-button-icon()\n<$list\n\n filter=\"[all[current]!has[custom-icon]]\"\n variable=\"no-custom-icon\"\n\n><$transclude\n\n tiddler={{!!icon}}\n\n/></$list>\n\\end\n\n\\define toolbar-button-tooltip()\n{{!!description}}<$macrocall $name=\"displayshortcuts\" $output=\"text/plain\" shortcuts={{!!shortcuts}} prefix=\"` - [\" separator=\"] [\" suffix=\"]`\"/>\n\\end\n\n\\define toolbar-button()\n<$list\n\n filter={{!!condition}}\n variable=\"list-condition\"\n\n><$wikify\n\n name=\"tooltip-text\"\n text=<<toolbar-button-tooltip>>\n mode=\"inline\"\n output=\"text\"\n\n><$list\n\n filter=\"[all[current]!has[dropdown]]\"\n variable=\"no-dropdown\"\n\n><$button\n\n class=\"tc-btn-invisible $(buttonClasses)$\"\n tooltip=<<tooltip-text>>\n actions={{!!actions}}\n\n><span\n\n data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n tiddler=<<currentTiddler>>\n field=\"text\"\n\n/></$button></$list><$list\n\n filter=\"[all[current]has[dropdown]]\"\n variable=\"dropdown\"\n\n><$set\n\n name=\"dropdown-state\"\n value=<<qualify \"$:/state/EditorToolbarDropdown\">>\n\n><$button\n\n popup=<<dropdown-state>>\n class=\"tc-popup-keep tc-btn-invisible $(buttonClasses)$\"\n selectedClass=\"tc-selected\"\n tooltip=<<tooltip-text>>\n actions={{!!actions}}\n\n><span\n\n data-tw-keyboard-shortcut={{!!shortcuts}}\n\n/><<toolbar-button-icon>><$transclude\n\n tiddler=<<currentTiddler>>\n field=\"text\"\n\n/></$button><$reveal\n\n state=<<dropdown-state>>\n type=\"popup\"\n position=\"below\"\n animate=\"yes\"\n tag=\"span\"\n\n><div\n\n class=\"tc-drop-down tc-popup-keep\"\n\n><$transclude\n\n tiddler={{!!dropdown}}\n mode=\"block\"\n\n/></div></$reveal></$set></$list></$wikify></$list>\n\\end\n\n\\define toolbar-button-outer()\n<$set\n\n name=\"buttonClasses\"\n value={{!!button-classes}}\n\n><<toolbar-button>></$set>\n\\end\n\n<<toolbar-button-outer>>"
},
"$:/core/ui/EditTemplate/body": {
"title": "$:/core/ui/EditTemplate/body",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Body/\n\\define config-visibility-title()\n$:/config/EditorToolbarButtons/Visibility/$(currentTiddler)$\n\\end\n<$list filter=\"[all[current]has[_canonical_uri]]\">\n\n<div class=\"tc-message-box\">\n\n<<lingo External/Hint>>\n\n<a href={{!!_canonical_uri}}><$text text={{!!_canonical_uri}}/></a>\n\n<$edit-text field=\"_canonical_uri\" class=\"tc-edit-fields\" tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"></$edit-text>\n\n</div>\n\n</$list>\n\n<$list filter=\"[all[current]!has[_canonical_uri]]\">\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"match\" text=\"yes\">\n\n<div class=\"tc-tiddler-preview\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n<div class=\"tc-tiddler-preview-preview\">\n\n<$transclude tiddler={{$:/state/editpreviewtype}} mode=\"inline\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/preview/output\" mode=\"inline\"/>\n\n</$transclude>\n\n</div>\n\n</div>\n\n</$reveal>\n\n<$reveal state=\"$:/state/showeditpreview\" type=\"nomatch\" text=\"yes\">\n\n<$transclude tiddler=\"$:/core/ui/EditTemplate/body/editor\" mode=\"inline\"/>\n\n</$reveal>\n\n</$list>\n"
},
"$:/core/ui/EditTemplate/controls": {
"title": "$:/core/ui/EditTemplate/controls",
"tags": "$:/tags/EditTemplate",
"text": "\\define config-title()\n$:/config/EditToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title tc-tiddler-edit-title\">\n<$view field=\"title\"/>\n<span class=\"tc-tiddler-controls tc-titlebar\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$transclude tiddler=<<listItem>>/></$reveal></$list></span>\n<div style=\"clear: both;\"></div>\n</div>\n"
},
"$:/core/ui/EditTemplate/fields": {
"title": "$:/core/ui/EditTemplate/fields",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\define config-title()\n$:/config/EditTemplateFields/Visibility/$(currentField)$\n\\end\n\n\\define config-filter()\n[[hide]] -[title{$(config-title)$}]\n\\end\n\n\\define current-tiddler-new-field-selector()\n[data-tiddler-title=\"$(currentTiddlerCSSescaped)$\"] .tc-edit-field-add-name-wrapper input\n\\end\n\n\\define new-field-actions()\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<storeTitle>] [<searchListState>]\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/>\n\\end\n\n\\define delete-state-tiddlers() <$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<storeTitle>] [<searchListState>]\"/>\n\n\\define cancel-search-actions-inner()\n<$list filter=\"[<storeTitle>has[text]] [<newFieldNameTiddler>has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\">\n<<delete-state-tiddlers>>\n</$list>\n\\end\n\n\\define cancel-search-actions()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<newFieldNameTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<<cancel-search-actions-inner>>\"\"\">\n<$action-setfield $tiddler=<<newFieldNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define new-field()\n<$vars name={{{ [<newFieldNameTiddler>get[text]] }}}>\n<$reveal type=\"nomatch\" text=\"\" default=<<name>>>\n<$button tooltip=<<lingo Fields/Add/Button/Hint>>>\n<$action-sendmessage $message=\"tm-add-field\"\n$name=<<name>>\n$value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<storeTitle>] [<searchListState>]\"/>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n<$reveal type=\"match\" text=\"\" default=<<name>>>\n<$button>\n<<lingo Fields/Add/Button>>\n</$button>\n</$reveal>\n</$vars>\n\\end\n\\whitespace trim\n\n<div class=\"tc-edit-fields\">\n<table class={{{ [all[current]fields[]] :filter[lookup[$:/config/EditTemplateFields/Visibility/]!match[hide]] +[count[]!match[0]] +[then[tc-edit-fields]] ~[[tc-edit-fields tc-edit-fields-small]] }}}>\n<tbody>\n<$list filter=\"[all[current]fields[]] +[sort[title]]\" variable=\"currentField\" storyview=\"pop\">\n<$list filter=<<config-filter>> variable=\"temp\">\n<tr class=\"tc-edit-field\">\n<td class=\"tc-edit-field-name\">\n<$text text=<<currentField>>/>:</td>\n<td class=\"tc-edit-field-value\">\n<$keyboard key=\"((delete-field))\" actions=\"\"\"<$action-deletefield $field=<<currentField>>/><$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/></$set>\"\"\">\n<$edit-text tiddler=<<currentTiddler>> field=<<currentField>> placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n</$keyboard>\n</td>\n<td class=\"tc-edit-field-remove\">\n<$button class=\"tc-btn-invisible\" tooltip={{$:/language/EditTemplate/Field/Remove/Hint}} aria-label={{$:/language/EditTemplate/Field/Remove/Caption}}>\n<$action-deletefield $field=<<currentField>>/><$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}><$action-sendmessage $message=\"tm-focus-selector\" $param=<<current-tiddler-new-field-selector>>/></$set>\n{{$:/core/images/delete-button}}\n</$button>\n</td>\n</tr>\n</$list>\n</$list>\n</tbody>\n</table>\n</div>\n\n<$fieldmangler>\n<div class=\"tc-edit-field-add\">\n<em class=\"tc-edit tc-big-gap-right\">\n<<lingo Fields/Add/Prompt>>\n</em>\n<$vars refreshTitle=<<qualify \"$:/temp/fieldname/refresh\">> storeTitle=<<newFieldNameInputTiddler>> searchListState=<<newFieldNameSelectionTiddler>>>\n<div class=\"tc-edit-field-add-name-wrapper\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<newFieldNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>\n\t\tselectionStateTitle=<<searchListState>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Name/Placeholder}}\n\t\tfocusPopup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}}\n\t\tfocus={{{ [{$:/config/AutoFocus}match[fields]then[true]] ~[[false]] }}} cancelPopups=\"yes\"\n\t\tconfigTiddlerFilter=\"[[$:/config/EditMode/fieldname-filter]]\" inputCancelActions=<<cancel-search-actions>> />\n<$button popup=<<qualify \"$:/state/popup/field-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" tooltip={{$:/language/EditTemplate/Field/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Field/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/field-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$linkcatcher to=<<newFieldNameTiddler>>>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/User>>\n</div>\n<$set name=\"newFieldName\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[!is[shadow]!is[system]fields[]search:title<newFieldName>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type\" variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-primaryList]] -[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n<div class=\"tc-dropdown-item\">\n<<lingo Fields/Add/Dropdown/System>>\n</div>\n<$list filter=\"[fields[]search:title<newFieldName>sort[]] -[!is[shadow]!is[system]fields[]]\" variable=\"currentField\">\n<$list filter=\"[<currentField>addsuffix[-secondaryList]] -[<searchListState>get[text]]\" emptyMessage=\"\"\"<$link to=<<currentField>> class=\"tc-list-item-selected\"><$text text=<<currentField>>/></$link>\"\"\">\n<$link to=<<currentField>>>\n<$text text=<<currentField>>/>\n</$link>\n</$list>\n</$list>\n</$set>\n</$linkcatcher>\n</$set>\n</div>\n</$reveal>\n</div>\n<span class=\"tc-edit-field-add-value tc-small-gap-right\">\n<$set name=\"currentTiddlerCSSescaped\" value={{{ [<currentTiddler>escapecss[]] }}}>\n<$keyboard key=\"((add-field))\" actions=<<new-field-actions>>>\n<$edit-text tiddler=<<newFieldValueTiddler>> tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Fields/Add/Value/Placeholder}} class=\"tc-edit-texteditor\" tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n</$keyboard>\n</$set>\n</span>\n<span class=\"tc-edit-field-add-button\">\n<$macrocall $name=\"new-field\"/>\n</span>\n</$vars>\n</div>\n</$fieldmangler>\n"
},
"$:/core/ui/EditTemplate/body/preview/diffs-current": {
"title": "$:/core/ui/EditTemplate/body/preview/diffs-current",
"tags": "$:/tags/EditPreview",
"caption": "differences from current",
"list-after": "$:/core/ui/EditTemplate/body/preview/output",
"text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
},
"$:/core/ui/EditTemplate/body/preview/diffs-shadow": {
"title": "$:/core/ui/EditTemplate/body/preview/diffs-shadow",
"tags": "$:/tags/EditPreview",
"caption": "differences from shadow (if any)",
"list-after": "$:/core/ui/EditTemplate/body/preview/output",
"text": "<$list filter=\"[<currentTiddler>!is[image]]\" emptyMessage={{$:/core/ui/EditTemplate/body/preview/output}}>\n\n<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle={{{ [{!!draft.of}shadowsource[]] }}} sourceSubTiddlerTitle={{!!draft.of}} destTiddlerTitle=<<currentTiddler>>/>\n\n</$list>\n\n"
},
"$:/core/ui/EditTemplate/body/preview/output": {
"title": "$:/core/ui/EditTemplate/body/preview/output",
"tags": "$:/tags/EditPreview",
"caption": "{{$:/language/EditTemplate/Body/Preview/Type/Output}}",
"text": "\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$set name=\"tv-tiddler-preview\" value=\"yes\">\n\n<$transclude />\n\n</$set>\n"
},
"$:/state/showeditpreview": {
"title": "$:/state/showeditpreview",
"text": "no"
},
"$:/core/ui/EditTemplate/shadow": {
"title": "$:/core/ui/EditTemplate/shadow",
"tags": "$:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/EditTemplate/Shadow/\n\\define pluginLinkBody()\n<$link to=\"\"\"$(pluginTitle)$\"\"\">\n<$text text=\"\"\"$(pluginTitle)$\"\"\"/>\n</$link>\n\\end\n<$list filter=\"[all[current]get[draft.of]is[shadow]!is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo Warning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>\n\n<$list filter=\"[all[current]get[draft.of]is[shadow]is[tiddler]]\">\n\n<$list filter=\"[all[current]shadowsource[]]\" variable=\"pluginTitle\">\n\n<$set name=\"pluginLink\" value=<<pluginLinkBody>>>\n<div class=\"tc-message-box\">\n\n<<lingo OverriddenWarning>>\n\n</div>\n</$set>\n</$list>\n\n</$list>"
},
"$:/core/ui/EditTemplate/tags": {
"title": "$:/core/ui/EditTemplate/tags",
"tags": "$:/tags/EditTemplate",
"text": "\\whitespace trim\n\n\\define lingo-base() $:/language/EditTemplate/\n\n\\define tag-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-body-inner(colour,fallbackTarget,colourA,colourB,icon,tagField:\"tags\")\n\\whitespace trim\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<span style=<<tag-styles>> class=\"tc-tag-label tc-tag-list-item\">\n<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view field=\"title\" format=\"text\" />\n<$button class=\"tc-btn-invisible tc-remove-tag-button\"><$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"-[{!!title}]\"/>{{$:/core/images/close-button}}</$button>\n</span>\n</$vars>\n\\end\n\n\\define tag-body(colour,palette,icon,tagField:\"tags\")\n<$macrocall $name=\"tag-body-inner\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} icon=\"\"\"$icon$\"\"\" tagField=<<__tagField__>>/>\n\\end\n\n\\define edit-tags-template(tagField:\"tags\")\n\\whitespace trim\n<div class=\"tc-edit-tags\">\n<$list filter=\"[list[!!$tagField$]sort[title]]\" storyview=\"pop\">\n<$macrocall $name=\"tag-body\" colour={{!!color}} palette={{$:/palette}} icon={{!!icon}} tagField=<<__tagField__>>/>\n</$list>\n<$vars tabIndex={{$:/config/EditTabIndex}} cancelPopups=\"yes\">\n<$macrocall $name=\"tag-picker\" tagField=<<__tagField__>>/>\n</$vars>\n</div>\n\\end\n<$set name=\"saveTiddler\" value=<<currentTiddler>>>\n<$macrocall $name=\"edit-tags-template\" tagField=<<tagField>>/>\n</$set>\n"
},
"$:/core/ui/EditTemplate/title": {
"title": "$:/core/ui/EditTemplate/title",
"tags": "$:/tags/EditTemplate",
"text": "<$edit-text field=\"draft.title\" class=\"tc-titlebar tc-edit-texteditor\" focus={{{ [{$:/config/AutoFocus}match[title]then[true]] ~[[false]] }}} tabindex={{$:/config/EditTabIndex}} cancelPopups=\"yes\"/>\n\n<$vars pattern=\"\"\"[\\|\\[\\]{}]\"\"\" bad-chars=\"\"\"`| [ ] { }`\"\"\">\n\n<$list filter=\"[all[current]regexp:draft.title<pattern>]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/BadCharacterWarning}}\n\n</div>\n\n</$list>\n\n</$vars>\n\n<$reveal state=\"!!draft.title\" type=\"nomatch\" text={{!!draft.of}} tag=\"div\">\n\n<$list filter=\"[{!!draft.title}!is[missing]]\" variable=\"listItem\">\n\n<div class=\"tc-message-box\">\n\n{{$:/core/images/warning}} {{$:/language/EditTemplate/Title/Exists/Prompt}}\n\n</div>\n\n</$list>\n\n<$list filter=\"[{!!draft.of}!is[missing]]\" variable=\"listItem\">\n\n<$vars fromTitle={{!!draft.of}} toTitle={{!!draft.title}}>\n\n<$checkbox tiddler=\"$:/config/RelinkOnRename\" field=\"text\" checked=\"yes\" unchecked=\"no\" default=\"no\"> {{$:/language/EditTemplate/Title/Relink/Prompt}}</$checkbox>\n\n<$list filter=\"[title<fromTitle>backlinks[]limit[1]]\" variable=\"listItem\">\n\n<$vars stateTiddler=<<qualify \"$:/state/edit/references\">> >\n\n<$reveal type=\"nomatch\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"show\" class=\"tc-btn-invisible\">{{$:/core/images/right-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$button set=<<stateTiddler>> setTo=\"hide\" class=\"tc-btn-invisible\">{{$:/core/images/down-arrow}} \n<<lingo EditTemplate/Title/References/Prompt>></$button>\n</$reveal>\n\n<$reveal type=\"match\" state=<<stateTiddler>> text=\"show\">\n<$tiddler tiddler=<<fromTitle>> >\n<$transclude tiddler=\"$:/core/ui/TiddlerInfo/References\"/>\n</$tiddler>\n</$reveal>\n\n</$vars>\n\n</$list>\n\n</$vars>\n\n</$list>\n\n</$reveal>\n"
},
"$:/core/ui/EditTemplate/type": {
"title": "$:/core/ui/EditTemplate/type",
"tags": "$:/tags/EditTemplate",
"first-search-filter": "[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]sort[description]sort[group-sort]removeprefix[$:/language/Docs/Types/]search<userInput>]",
"text": "\\define lingo-base() $:/language/EditTemplate/\n\\define input-cancel-actions() <$list filter=\"[<storeTitle>get[text]] [<currentTiddler>get[type]] +[limit[1]]\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\"><$action-sendmessage $message=\"tm-remove-field\" $param=\"type\"/><$action-deletetiddler $filter=\"[<typeInputTiddler>] [<refreshTitle>] [<typeSelectionTiddler>]\"/></$list>\n\\whitespace trim\n<$set name=\"refreshTitle\" value=<<qualify \"$:/temp/type-search/refresh\">>>\n<div class=\"tc-edit-type-selector-wrapper\">\n<em class=\"tc-edit tc-big-gap-right\"><<lingo Type/Prompt>></em>\n<div class=\"tc-type-selector-dropdown-wrapper\">\n<div class=\"tc-type-selector\"><$fieldmangler>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<currentTiddler>> storeTitle=<<typeInputTiddler>> refreshTitle=<<refreshTitle>> selectionStateTitle=<<typeSelectionTiddler>> field=\"type\" tag=\"input\" default=\"\" placeholder={{$:/language/EditTemplate/Type/Placeholder}} focusPopup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-edit-typeeditor tc-edit-texteditor tc-popup-handle\" tabindex={{$:/config/EditTabIndex}} focus={{{ [{$:/config/AutoFocus}match[type]then[true]] ~[[false]] }}} cancelPopups=\"yes\" configTiddlerFilter=\"[[$:/core/ui/EditTemplate/type]]\" inputCancelActions=<<input-cancel-actions>>/><$button popup=<<qualify \"$:/state/popup/type-dropdown\">> class=\"tc-btn-invisible tc-btn-dropdown tc-small-gap\" tooltip={{$:/language/EditTemplate/Type/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Type/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$button message=\"tm-remove-field\" param=\"type\" class=\"tc-btn-invisible tc-btn-icon\" tooltip={{$:/language/EditTemplate/Type/Delete/Hint}} aria-label={{$:/language/EditTemplate/Type/Delete/Caption}}>{{$:/core/images/delete-button}}<$action-deletetiddler $filter=\"[<storeTitle>] [<refreshTitle>] [<selectionStateTitle>]\"/></$button>\n</$fieldmangler></div>\n\n<div class=\"tc-block-dropdown-wrapper\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$reveal state=<<qualify \"$:/state/popup/type-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-edit-type-dropdown\">\n<$linkcatcher to=\"!!type\">\n<$list filter='[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]each[group]sort[group-sort]]'>\n<div class=\"tc-dropdown-item\">\n<$text text={{!!group}}/>\n</div>\n<$set name=\"userInput\" value={{{ [<typeInputTiddler>get[text]] }}}>\n<$list filter=\"[all[shadows+tiddlers]prefix[$:/language/Docs/Types/]group{!!group}] +[sort[description]] +[removeprefix[$:/language/Docs/Types/]] +[search<userInput>]\"><span class={{{ [<currentTiddler>addsuffix[-primaryList]] -[<typeSelectionTiddler>get[text]] +[then[]else[tc-list-item-selected]] }}}><$link to={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]get[name]] }}}><$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"description\"/> (<$view tiddler={{{ [<currentTiddler>addprefix[$:/language/Docs/Types/]] }}} field=\"name\"/>)</$link></span>\n</$list>\n</$set>\n</$list>\n</$linkcatcher>\n</div>\n</$reveal>\n</$set>\n</div>\n</div>\n</div>\n</$set>\n"
},
"$:/core/ui/EditTemplate": {
"title": "$:/core/ui/EditTemplate",
"text": "\\define delete-edittemplate-state-tiddlers() <$action-deletetiddler $filter=\"[<newFieldNameTiddler>] [<newFieldValueTiddler>] [<newFieldNameInputTiddler>] [<newFieldNameSelectionTiddler>] [<newTagNameTiddler>] [<newTagNameInputTiddler>] [<newTagNameSelectionTiddler>] [<typeInputTiddler>] [<typeSelectionTiddler>]\"/>\n\\define save-tiddler-actions()\n<$action-sendmessage $message=\"tm-add-tag\" $param={{{ [<newTagNameTiddler>get[text]] }}}/>\n<$action-sendmessage $message=\"tm-add-field\" $name={{{ [<newFieldNameTiddler>get[text]] }}} $value={{{ [<newFieldValueTiddler>get[text]] }}}/>\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-save-tiddler\"/>\n\\end\n\\define cancel-delete-tiddler-actions(message)\n<<delete-edittemplate-state-tiddlers>>\n<$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\end\n<div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-edit-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}>\n<$fieldmangler>\n<$vars storyTiddler=<<currentTiddler>> newTagNameTiddler=<<qualify \"$:/temp/NewTagName\">> newFieldNameTiddler=<<qualify \"$:/temp/NewFieldName\">> newFieldValueTiddler=<<qualify \"$:/temp/NewFieldValue\">> newFieldNameInputTiddler=<<qualify \"$:/temp/NewFieldName/input\">> newFieldNameSelectionTiddler=<<qualify \"$:/temp/NewFieldName/selected-item\">> newTagNameInputTiddler=<<qualify \"$:/temp/NewTagName/input\">> newTagNameSelectionTiddler=<<qualify \"$:/temp/NewTagName/selected-item\">> typeInputTiddler=<<qualify \"$:/temp/Type/input\">> typeSelectionTiddler=<<qualify \"$:/temp/Type/selected-item\">>>\n<$keyboard key=\"((cancel-edit-tiddler))\" actions=<<cancel-delete-tiddler-actions \"cancel\">>>\n<$keyboard key=\"((save-tiddler))\" actions=<<save-tiddler-actions>>>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/EditTemplate]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>>/>\n</$set>\n</$list>\n</$keyboard>\n</$keyboard>\n</$vars>\n</$fieldmangler>\n</div>\n"
},
"$:/core/ui/Buttons/cancel": {
"title": "$:/core/ui/Buttons/cancel",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/cancel-button}} {{$:/language/Buttons/Cancel/Caption}}",
"description": "{{$:/language/Buttons/Cancel/Hint}}",
"text": "\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"cancel\">> tooltip={{$:/language/Buttons/Cancel/Hint}} aria-label={{$:/language/Buttons/Cancel/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/cancel-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Cancel/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/core/ui/Buttons/delete": {
"title": "$:/core/ui/Buttons/delete",
"tags": "$:/tags/EditToolbar $:/tags/ViewToolbar",
"caption": "{{$:/core/images/delete-button}} {{$:/language/Buttons/Delete/Caption}}",
"description": "{{$:/language/Buttons/Delete/Hint}}",
"text": "\\whitespace trim\n<$button actions=<<cancel-delete-tiddler-actions \"delete\">> tooltip={{$:/language/Buttons/Delete/Hint}} aria-label={{$:/language/Buttons/Delete/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/delete-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Delete/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/core/ui/Buttons/save": {
"title": "$:/core/ui/Buttons/save",
"tags": "$:/tags/EditToolbar",
"caption": "{{$:/core/images/done-button}} {{$:/language/Buttons/Save/Caption}}",
"description": "{{$:/language/Buttons/Save/Hint}}",
"text": "\\define save-tiddler-button()\n\\whitespace trim\n<$fieldmangler><$button tooltip={{$:/language/Buttons/Save/Hint}} aria-label={{$:/language/Buttons/Save/Caption}} class=<<tv-config-toolbar-class>>>\n<<save-tiddler-actions>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/done-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Save/Caption}}/></span>\n</$list>\n</$button></$fieldmangler>\n\\end\n<<save-tiddler-button>>\n"
},
"$:/core/Filters/AllTags": {
"title": "$:/core/Filters/AllTags",
"tags": "$:/tags/Filter",
"filter": "[tags[]!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTags}}",
"text": ""
},
"$:/core/Filters/AllTiddlers": {
"title": "$:/core/Filters/AllTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]sort[title]]",
"description": "{{$:/language/Filters/AllTiddlers}}",
"text": ""
},
"$:/core/Filters/Drafts": {
"title": "$:/core/Filters/Drafts",
"tags": "$:/tags/Filter",
"filter": "[has[draft.of]sort[title]]",
"description": "{{$:/language/Filters/Drafts}}",
"text": ""
},
"$:/core/Filters/Missing": {
"title": "$:/core/Filters/Missing",
"tags": "$:/tags/Filter",
"filter": "[all[missing]sort[title]]",
"description": "{{$:/language/Filters/Missing}}",
"text": ""
},
"$:/core/Filters/Orphans": {
"title": "$:/core/Filters/Orphans",
"tags": "$:/tags/Filter",
"filter": "[all[orphans]sort[title]]",
"description": "{{$:/language/Filters/Orphans}}",
"text": ""
},
"$:/core/Filters/OverriddenShadowTiddlers": {
"title": "$:/core/Filters/OverriddenShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[shadow]]",
"description": "{{$:/language/Filters/OverriddenShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentSystemTiddlers": {
"title": "$:/core/Filters/RecentSystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentSystemTiddlers}}",
"text": ""
},
"$:/core/Filters/RecentTiddlers": {
"title": "$:/core/Filters/RecentTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]has[modified]!sort[modified]limit[50]]",
"description": "{{$:/language/Filters/RecentTiddlers}}",
"text": ""
},
"$:/core/Filters/SessionTiddlers": {
"title": "$:/core/Filters/SessionTiddlers",
"tags": "$:/tags/Filter",
"filter": "[haschanged[]]",
"description": "{{$:/language/Filters/SessionTiddlers}}",
"text": ""
},
"$:/core/Filters/ShadowTiddlers": {
"title": "$:/core/Filters/ShadowTiddlers",
"tags": "$:/tags/Filter",
"filter": "[all[shadows]sort[title]]",
"description": "{{$:/language/Filters/ShadowTiddlers}}",
"text": ""
},
"$:/core/Filters/StoryList": {
"title": "$:/core/Filters/StoryList",
"tags": "$:/tags/Filter",
"filter": "[list[$:/StoryList]] -$:/AdvancedSearch",
"description": "{{$:/language/Filters/StoryList}}",
"text": ""
},
"$:/core/Filters/SystemTags": {
"title": "$:/core/Filters/SystemTags",
"tags": "$:/tags/Filter",
"filter": "[all[shadows+tiddlers]tags[]is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTags}}",
"text": ""
},
"$:/core/Filters/SystemTiddlers": {
"title": "$:/core/Filters/SystemTiddlers",
"tags": "$:/tags/Filter",
"filter": "[is[system]sort[title]]",
"description": "{{$:/language/Filters/SystemTiddlers}}",
"text": ""
},
"$:/core/Filters/TypedTiddlers": {
"title": "$:/core/Filters/TypedTiddlers",
"tags": "$:/tags/Filter",
"filter": "[!is[system]has[type]each[type]sort[type]] -[type[text/vnd.tiddlywiki]]",
"description": "{{$:/language/Filters/TypedTiddlers}}",
"text": ""
},
"$:/core/ui/ImportListing": {
"title": "$:/core/ui/ImportListing",
"text": "\\define lingo-base() $:/language/Import/\n\n\\define messageField() message-$(payloadTiddler)$\n\n\\define payloadTitleFilter() [<currentTiddler>get<renameField>minlength[1]else<payloadTiddler>]\n\n\\define overWriteWarning()\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\">\n<$text text={{{[subfilter<payloadTitleFilter>!is[tiddler]then[]] ~[<lingo-base>addsuffix[Listing/Rename/OverwriteWarning]get[text]]}}}/>\n</$list>\n\\end\n\n\\define selectionField() selection-$(payloadTiddler)$\n\n\\define renameField() rename-$(payloadTiddler)$\n\n\\define suppressedField() suppressed-$(payloadTiddler)$\n\n\\define newImportTitleTiddler() $:/temp/NewImportTitle-$(payloadTiddler)$\n\n\\define previewPopupState() $(currentTiddler)$!!popup-$(payloadTiddler)$\n\n\\define renameFieldState() $(currentTiddler)$!!state-rename-$(payloadTiddler)$\n\n\\define select-all-actions()\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<$action-setfield $field={{{ [<payloadTiddler>addprefix[selection-]] }}} $value={{$:/state/import/select-all}}/>\n</$list>\n\\end\n\n<table class=\"tc-import-table\">\n<tbody>\n<tr>\n<th align=\"left\">\n<$checkbox tiddler=\"$:/state/import/select-all\" field=\"text\" checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" actions=<<select-all-actions>>>\n<<lingo Listing/Select/Caption>>\n</$checkbox>\n</th>\n<th>\n<<lingo Listing/Title/Caption>>\n</th>\n<th>\n<<lingo Listing/Status/Caption>>\n</th>\n</tr>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" variable=\"payloadTiddler\">\n<tr class={{{[<currentTiddler>has<suppressedField>then[tc-row-disabled]] ~[subfilter<payloadTitleFilter>is[tiddler]then[tc-row-warning]] }}}>\n<td>\n<$checkbox field=<<selectionField>> checked=\"checked\" unchecked=\"unchecked\" default=\"checked\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}/>\n</td>\n<td>\n<$reveal type=\"nomatch\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$reveal type=\"nomatch\" state=<<previewPopupState>> text=\"yes\" tag=\"div\" class=\"tc-flex\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown tc-flex-grow-1 tc-word-break\" set=<<previewPopupState>> setTo=\"yes\" disabled={{{[<currentTiddler>has<suppressedField>then[yes]else[no]]}}}>\n<span class=\"tc-small-gap-right\">{{$:/core/images/right-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n<$list filter=\"[<currentTiddler>!has<suppressedField>]\"><$button class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"yes\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/Tooltip]get[text]]}}}>{{$:/core/images/edit-button}}</$button></$list>\n</$reveal>\n<$reveal type=\"match\" state=<<previewPopupState>> text=\"yes\" tag=\"div\">\n<$button class=\"tc-btn-invisible tc-btn-dropdown\" set=<<previewPopupState>> setTo=\"no\">\n<span class=\"tc-small-gap-right\">{{$:/core/images/down-arrow}}</span><$text text={{{[subfilter<payloadTitleFilter>]}}}/>\n</$button>\n</$reveal>\n</$reveal>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"div\">\n<$text text={{{[<lingo-base>addsuffix[Listing/Rename/Prompt]get[text]]}}}/>\n</$reveal>\n</td>\n<td>\n<$view field=<<messageField>>/>\n<<overWriteWarning>>\n</td>\n</tr>\n<$reveal type=\"match\" state=<<renameFieldState>> text=\"yes\" tag=\"tr\">\n<td colspan=\"3\">\n<div class=\"tc-flex\">\n<$edit-text tiddler=<<newImportTitleTiddler>> default={{{[subfilter<payloadTitleFilter>]}}} tag=\"input\" class=\"tc-import-rename tc-flex-grow-1\"/><span class=\"tc-small-gap-left\"><$button class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/CancelRename]get[text]]}}}>{{$:/core/images/close-button}}<$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button><span class=\"tc-small-gap-right\"/></span><$button class=\"tc-btn-invisible\" set=<<renameFieldState>> setTo=\"no\" tooltip={{{[<lingo-base>addsuffix[Listing/Rename/ConfirmRename]get[text]]}}}>{{$:/core/images/done-button}}<$action-setfield $field=<<renameField>> $value={{{[<newImportTitleTiddler>get[text]minlength[1]else<payloadTiddler>]}}} /><$action-deletetiddler $tiddler=<<newImportTitleTiddler>>/></$button>\n</div>\n</td>\n</$reveal>\n<tr>\n<td colspan=\"3\">\n<$reveal type=\"match\" text=\"yes\" state=<<previewPopupState>> tag=\"div\">\n<$list filter=\"[{$:/state/importpreviewtype}has[text]]\" variable=\"listItem\" emptyMessage={{$:/core/ui/ImportPreviews/Text}}>\n<$transclude tiddler={{$:/state/importpreviewtype}}/>\n</$list>\n</$reveal>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ImportPreviews/Diff": {
"title": "$:/core/ui/ImportPreviews/Diff",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Diff}}",
"text": "<$macrocall $name=\"compareTiddlerText\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>>/>\n"
},
"$:/core/ui/ImportPreviews/DiffFields": {
"title": "$:/core/ui/ImportPreviews/DiffFields",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/DiffFields}}",
"text": "<$macrocall $name=\"compareTiddlers\" sourceTiddlerTitle=<<payloadTiddler>> destTiddlerTitle=<<currentTiddler>> destSubTiddlerTitle=<<payloadTiddler>> exclude=\"text\"/>\n"
},
"$:/core/ui/ImportPreviews/Fields": {
"title": "$:/core/ui/ImportPreviews/Fields",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Fields}}",
"text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[<payloadTiddler>subtiddlerfields<currentTiddler>sort[]] -text\" variable=\"fieldName\">\n<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<fieldName>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<fieldName>> tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>>/>\n</td>\n</tr>\n</$list>\n</tbody>\n</table>\n"
},
"$:/core/ui/ImportPreviews/Text": {
"title": "$:/core/ui/ImportPreviews/Text",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/Text}}",
"text": "<$transclude tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> mode=\"block\"/>\n"
},
"$:/core/ui/ImportPreviews/TextRaw": {
"title": "$:/core/ui/ImportPreviews/TextRaw",
"tags": "$:/tags/ImportPreview",
"caption": "{{$:/language/Import/Listing/Preview/TextRaw}}",
"text": "<pre><code><$view tiddler=<<currentTiddler>> subtiddler=<<payloadTiddler>> /></code></pre>"
},
"$:/core/ui/KeyboardShortcuts/advanced-search": {
"title": "$:/core/ui/KeyboardShortcuts/advanced-search",
"tags": "$:/tags/KeyboardShortcut",
"key": "((advanced-search))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\">\n<$action-navigate $to=\"$:/AdvancedSearch\"/>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/>\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/change-sidebar-layout": {
"title": "$:/core/ui/KeyboardShortcuts/change-sidebar-layout",
"tags": "$:/tags/KeyboardShortcut",
"key": "((change-sidebar-layout))",
"text": "<$list filter=\"[{$:/themes/tiddlywiki/vanilla/options/sidebarlayout}match[fixed-fluid]]\" \nemptyMessage=\"\"\"<$action-setfield $tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" text=\"fixed-fluid\"/>\"\"\">\n<$action-setfield $tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" text=\"fluid-fixed\"/>\n</$list>\n"
},
"$:/core/ui/KeyboardShortcuts/new-image": {
"title": "$:/core/ui/KeyboardShortcuts/new-image",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-image))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-image}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/new-journal": {
"title": "$:/core/ui/KeyboardShortcuts/new-journal",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-journal))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-journal}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/new-tiddler": {
"title": "$:/core/ui/KeyboardShortcuts/new-tiddler",
"tags": "$:/tags/KeyboardShortcut",
"key": "((new-tiddler))",
"text": "<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n{{$:/core/ui/Actions/new-tiddler}}\n</$navigator>\n"
},
"$:/core/ui/KeyboardShortcuts/save-wiki": {
"title": "$:/core/ui/KeyboardShortcuts/save-wiki",
"tags": "$:/tags/KeyboardShortcut",
"key": "((save-wiki))",
"text": "<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n"
},
"$:/core/ui/KeyboardShortcuts/sidebar-search": {
"title": "$:/core/ui/KeyboardShortcuts/sidebar-search",
"tags": "$:/tags/KeyboardShortcut",
"key": "((sidebar-search))",
"text": "<$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n"
},
"$:/core/ui/KeyboardShortcuts/switcher": {
"title": "$:/core/ui/KeyboardShortcuts/switcher",
"tags": "$:/tags/KeyboardShortcut",
"key": "((layout-switcher))",
"text": "<$action-sendmessage $message=\"tm-show-switcher\" switch=\"layout\"/>"
},
"$:/core/ui/KeyboardShortcuts/toggle-sidebar": {
"title": "$:/core/ui/KeyboardShortcuts/toggle-sidebar",
"tags": "$:/tags/KeyboardShortcut",
"key": "((toggle-sidebar))",
"text": "<$list filter=\"[[$:/state/sidebar]is[missing]] [{$:/state/sidebar}removeprefix[yes]]\" emptyMessage=\"\"\"\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"yes\"/>\n\"\"\">\n<$action-setfield $tiddler=\"$:/state/sidebar\" text=\"no\"/>\n</$list>\n"
},
"$:/snippets/LayoutSwitcher": {
"title": "$:/snippets/LayoutSwitcher",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ControlPanel/LayoutSwitcher/Caption}}",
"text": "<$linkcatcher to=\"$:/layout\">\n<div class=\"tc-chooser\">\n<$list filter=\"[all[tiddlers+shadows]tag[$:/tags/Layout]] [[$:/core/ui/PageTemplate]] +[!is[draft]sort[name]]\">\n<$list filter=\"[{$:/layout}!has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/layout}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field=\"name\"/>'' - <$transclude field=\"description\"/></$link></div>\n</$set>\n\"\"\">\n<$set name=\"cls\" filter=\"[all[current]field:title[$:/core/ui/PageTemplate]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$transclude field=\"name\"/>'' - <$transclude field=\"description\"/></$link></div>\n</$set>\n</$list>\n</$list>\n</div>\n</$linkcatcher>\n"
},
"$:/core/ui/ListItemTemplate": {
"title": "$:/core/ui/ListItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link />\n</div>"
},
"$:/Manager/ItemMain/Fields": {
"title": "$:/Manager/ItemMain/Fields",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/Fields}}",
"text": "<table>\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
},
"$:/Manager/ItemMain/RawText": {
"title": "$:/Manager/ItemMain/RawText",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/RawText}}",
"text": "<pre><code><$view/></code></pre>\n"
},
"$:/Manager/ItemMain/WikifiedText": {
"title": "$:/Manager/ItemMain/WikifiedText",
"tags": "$:/tags/Manager/ItemMain",
"caption": "{{$:/language/Manager/Item/WikifiedText}}",
"text": "<$transclude mode=\"block\"/>\n"
},
"$:/Manager/ItemSidebar/Colour": {
"title": "$:/Manager/ItemSidebar/Colour",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Colour}}",
"text": "\\define swatch-styles()\nheight: 1em;\nbackground-color: $(colour)$\n\\end\n\n<$vars colour={{!!color}}>\n<p style=<<swatch-styles>>/>\n</$vars>\n<p>\n<$edit-text field=\"color\" tag=\"input\" type=\"color\"/> / <$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/>\n</p>\n"
},
"$:/Manager/ItemSidebar/Icon": {
"title": "$:/Manager/ItemSidebar/Icon",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Icon}}",
"text": "<p>\n<div class=\"tc-manager-icon-editor\">\n<$button popup=<<qualify \"$:/state/popup/image-picker\">> class=\"tc-btn-invisible\">\n<$transclude tiddler={{!!icon}}>\n{{$:/language/Manager/Item/Icon/None}}\n</$transclude>\n</$button>\n<div class=\"tc-block-dropdown-wrapper\" style=\"position: static;\">\n<$reveal state=<<qualify \"$:/state/popup/image-picker\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-popup\">\n<div class=\"tc-block-dropdown tc-popup-keep\" style=\"width: 80%; left: 10%; right: 10%; padding: 0.5em;\">\n<$macrocall $name=\"image-picker-include-tagged-images\" actions=\"\"\"\n<$action-setfield $field=\"icon\" $value=<<imageTitle>>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/image-picker\">>/>\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n</div>\n</p>\n"
},
"$:/Manager/ItemSidebar/Tags": {
"title": "$:/Manager/ItemSidebar/Tags",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Tags}}",
"text": "\\whitespace trim\n\\define tag-checkbox-actions()\n<$action-listops\n\t$tiddler=\"$:/config/Manager/RecentTags\"\n\t$subfilter=\"[<tag>] [list[$:/config/Manager/RecentTags]] +[limit[12]]\"\n/>\n\\end\n\n\\define tag-picker-actions()\n<<tag-checkbox-actions>>\n\\end\n\n<p>\n<$list filter=\"[all[current]tags[]] [list[$:/config/Manager/RecentTags]] +[sort[title]] \" variable=\"tag\" storyview=\"pop\">\n<div>\n<$checkbox tiddler=<<currentTiddler>> tag=<<tag>> actions=<<tag-checkbox-actions>>>\n<$macrocall $name=\"tag-pill\" tag=<<tag>>/>\n</$checkbox>\n</div>\n</$list>\n</p>\n<p>\n<$fieldmangler>\n<$macrocall $name=\"tag-picker\" actions=<<tag-picker-actions>>/>\n</$fieldmangler>\n</p>\n"
},
"$:/Manager/ItemSidebar/Tools": {
"title": "$:/Manager/ItemSidebar/Tools",
"tags": "$:/tags/Manager/ItemSidebar",
"caption": "{{$:/language/Manager/Item/Tools}}",
"text": "<p>\n<$button to=<<currentTiddler>>>{{$:/core/images/link}} open</$button>\n</p>\n<p>\n<$button message=\"tm-edit-tiddler\" param=<<currentTiddler>>>{{$:/core/images/edit-button}} edit</$button>\n</p>\n"
},
"$:/Manager": {
"title": "$:/Manager",
"icon": "$:/core/images/list",
"color": "#bbb",
"text": "\\define lingo-base() $:/language/Manager/\n\n\\define list-item-content-item()\n<div class=\"tc-manager-list-item-content-item\">\n\t<$vars state-title=\"\"\"$:/state/popup/manager/item/$(listItem)$\"\"\">\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"hide\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/down-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"nomatch\" text=\"show\" default=\"show\" tag=\"div\">\n\t\t\t<$button set=<<state-title>> setTo=\"show\" class=\"tc-btn-invisible tc-manager-list-item-content-item-heading\">\n\t\t\t\t{{$:/core/images/right-arrow}} <$transclude tiddler=<<listItem>> field=\"caption\"/>\n\t\t\t</$button>\n\t\t</$reveal>\n\t\t<$reveal state=<<state-title>> type=\"match\" text=\"show\" default=\"show\" tag=\"div\" class=\"tc-manager-list-item-content-item-body\">\n\t\t\t<$transclude tiddler=<<listItem>>/>\n\t\t</$reveal>\n\t</$vars>\n</div>\n\\end\n\n<div class=\"tc-manager-wrapper\">\n\t<div class=\"tc-manager-controls\">\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Show/Prompt>> <$select tiddler=\"$:/config/Manager/Show\" default=\"tiddlers\">\n\t\t\t\t<option value=\"tiddlers\"><<lingo Controls/Show/Option/Tiddlers>></option>\n\t\t\t\t<option value=\"tags\"><<lingo Controls/Show/Option/Tags>></option>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Search/Prompt>> <$edit-text tiddler=\"$:/config/Manager/Filter\" tag=\"input\" default=\"\" placeholder={{$:/language/Manager/Controls/Search/Placeholder}}/>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/FilterByTag/Prompt>> <$select tiddler=\"$:/config/Manager/Tag\" default=\"\">\n\t\t\t\t<option value=\"\"><<lingo Controls/FilterByTag/None>></option>\n\t\t\t\t<$list filter=\"[!is{$:/config/Manager/System}tags[]!is[system]sort[title]]\" variable=\"tag\">\n\t\t\t\t\t<option value=<<tag>>><$text text=<<tag>>/></option>\n\t\t\t\t</$list>\n\t\t\t</$select>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<<lingo Controls/Sort/Prompt>> <$select tiddler=\"$:/config/Manager/Sort\" default=\"title\">\n\t\t\t\t<optgroup label=\"Common\">\n\t\t\t\t\t<$list filter=\"title modified modifier created creator created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t\t<optgroup label=\"All\">\n\t\t\t\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}fields[]sort[title]] -title -modified -modifier -created -creator -created\" variable=\"field\">\n\t\t\t\t\t\t<option value=<<field>>><$text text=<<field>>/></option>\n\t\t\t\t\t</$list>\n\t\t\t\t</optgroup>\n\t\t\t</$select>\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/Order\" field=\"text\" checked=\"reverse\" unchecked=\"forward\" default=\"forward\">\n\t\t\t\t<<lingo Controls/Order/Prompt>>\n\t\t\t</$checkbox>\n\t\t</div>\n\t\t<div class=\"tc-manager-control\">\n\t\t\t<$checkbox tiddler=\"$:/config/Manager/System\" field=\"text\" checked=\"\" unchecked=\"system\" default=\"system\">\n\t\t\t\t{{$:/language/SystemTiddlers/Include/Prompt}}\n\t\t\t</$checkbox>\n\t\t</div>\n\t</div>\n\t<div class=\"tc-manager-list\">\n\t\t<$list filter=\"[all{$:/config/Manager/Show}!is{$:/config/Manager/System}search{$:/config/Manager/Filter}tag:strict{$:/config/Manager/Tag}sort{$:/config/Manager/Sort}order{$:/config/Manager/Order}]\">\n\t\t\t<$vars transclusion=<<currentTiddler>>>\n\t\t\t\t<div style=\"tc-manager-list-item\">\n\t\t\t\t\t<$button popup=<<qualify \"$:/state/manager/popup\">> class=\"tc-btn-invisible tc-manager-list-item-heading\" selectedClass=\"tc-manager-list-item-heading-selected\">\n\t\t\t\t\t\t<$text text=<<currentTiddler>>/>\n\t\t\t\t\t</$button>\n\t\t\t\t\t<$reveal state=<<qualify \"$:/state/manager/popup\">> type=\"nomatch\" text=\"\" default=\"\" tag=\"div\" class=\"tc-manager-list-item-content tc-popup-handle\">\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-tiddler\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemMain]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div class=\"tc-manager-list-item-content-sidebar\">\n\t\t\t\t\t\t\t<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Manager/ItemSidebar]!has[draft.of]]\" variable=\"listItem\">\n\t\t\t\t\t\t\t\t<<list-item-content-item>>\n\t\t\t\t\t\t\t</$list>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</$reveal>\n\t\t\t\t</div>\n\t\t\t</$vars>\n\t\t</$list>\n\t</div>\n</div>\n"
},
"$:/core/ui/MissingTemplate": {
"title": "$:/core/ui/MissingTemplate",
"text": "<div class=\"tc-tiddler-missing\">\n<$button popup=<<qualify \"$:/state/popup/missing\">> class=\"tc-btn-invisible tc-missing-tiddler-label\">\n<$view field=\"title\" format=\"text\" />\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/missing\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n<hr>\n<$list filter=\"[all[current]backlinks[]sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n</div>\n"
},
"$:/core/ui/MoreSideBar/All": {
"title": "$:/core/ui/MoreSideBar/All",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/All/Caption}}",
"text": "<$list filter={{$:/core/Filters/AllTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Drafts": {
"title": "$:/core/ui/MoreSideBar/Drafts",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Drafts/Caption}}",
"text": "<$list filter={{$:/core/Filters/Drafts!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Explorer": {
"title": "$:/core/ui/MoreSideBar/Explorer",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Explorer/Caption}}",
"text": "<<tree \"$:/\">>\n"
},
"$:/core/ui/MoreSideBar/Missing": {
"title": "$:/core/ui/MoreSideBar/Missing",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Missing/Caption}}",
"text": "<$list filter={{$:/core/Filters/Missing!!filter}} template=\"$:/core/ui/MissingTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Orphans": {
"title": "$:/core/ui/MoreSideBar/Orphans",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Orphans/Caption}}",
"text": "<$list filter={{$:/core/Filters/Orphans!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Languages": {
"title": "$:/core/ui/MoreSideBar/Plugins/Languages",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Languages/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[language]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Plugins": {
"title": "$:/core/ui/MoreSideBar/Plugins/Plugins",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Plugins/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[plugin]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}>>/>\n"
},
"$:/core/ui/MoreSideBar/Plugins/Theme": {
"title": "$:/core/ui/MoreSideBar/Plugins/Theme",
"tags": "$:/tags/MoreSideBar/Plugins",
"caption": "{{$:/language/ControlPanel/Plugins/Themes/Caption}}",
"text": "<$list filter=\"[!has[draft.of]plugin-type[theme]sort[description]]\" template=\"$:/core/ui/PluginListItemTemplate\" emptyMessage={{$:/language/ControlPanel/Plugins/Empty/Hint}}/>\n"
},
"$:/core/ui/MoreSideBar/Plugins": {
"title": "$:/core/ui/MoreSideBar/Plugins",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/ControlPanel/Plugins/Caption}}",
"text": "\n{{$:/language/ControlPanel/Plugins/Installed/Hint}}\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar/Plugins]!has[draft.of]]\" default=\"$:/core/ui/MoreSideBar/Plugins/Plugins\" explicitState=\"$:/state/tab-1163638994\"/>\n"
},
"$:/core/ui/MoreSideBar/Recent": {
"title": "$:/core/ui/MoreSideBar/Recent",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/MoreSideBar/Shadows": {
"title": "$:/core/ui/MoreSideBar/Shadows",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Shadows/Caption}}",
"text": "<$list filter={{$:/core/Filters/ShadowTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/System": {
"title": "$:/core/ui/MoreSideBar/System",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/System/Caption}}",
"text": "<$list filter={{$:/core/Filters/SystemTiddlers!!filter}} template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/MoreSideBar/Tags": {
"title": "$:/core/ui/MoreSideBar/Tags",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Tags/Caption}}",
"text": "<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n{{$:/core/ui/Buttons/tag-manager}}\n\n</$set>\n\n</$set>\n\n</$set>\n\n<$list filter={{$:/core/Filters/AllTags!!filter}}>\n\n<$transclude tiddler=\"$:/core/ui/TagTemplate\"/>\n\n</$list>\n\n<hr class=\"tc-untagged-separator\">\n\n{{$:/core/ui/UntaggedTemplate}}\n"
},
"$:/core/ui/MoreSideBar/Types": {
"title": "$:/core/ui/MoreSideBar/Types",
"tags": "$:/tags/MoreSideBar",
"caption": "{{$:/language/SideBar/Types/Caption}}",
"text": "<$list filter={{$:/core/Filters/TypedTiddlers!!filter}}>\n<div class=\"tc-menu-list-item\">\n<$view field=\"type\"/>\n<$list filter=\"[type{!!type}!is[system]sort[title]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><$view field=\"title\"/></$link>\n</div>\n</$list>\n</div>\n</$list>\n"
},
"$:/core/ui/Buttons/advanced-search": {
"title": "$:/core/ui/Buttons/advanced-search",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/advanced-search-button}} {{$:/language/Buttons/AdvancedSearch/Caption}}",
"description": "{{$:/language/Buttons/AdvancedSearch/Hint}}",
"text": "\\whitespace trim\n\\define advanced-search-button(class)\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/advanced-search-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/AdvancedSearch/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/AdvancedSearch]]\" emptyMessage=<<advanced-search-button>>>\n<<advanced-search-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/close-all": {
"title": "$:/core/ui/Buttons/close-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/close-all-button}} {{$:/language/Buttons/CloseAll/Caption}}",
"description": "{{$:/language/Buttons/CloseAll/Hint}}",
"text": "<$button message=\"tm-close-all-tiddlers\" tooltip={{$:/language/Buttons/CloseAll/Hint}} aria-label={{$:/language/Buttons/CloseAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/CloseAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/control-panel": {
"title": "$:/core/ui/Buttons/control-panel",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/options-button}} {{$:/language/Buttons/ControlPanel/Caption}}",
"description": "{{$:/language/Buttons/ControlPanel/Hint}}",
"text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/ControlPanel\" tooltip={{$:/language/Buttons/ControlPanel/Hint}} aria-label={{$:/language/Buttons/ControlPanel/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/options-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/ControlPanel/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/ControlPanel]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/encryption": {
"title": "$:/core/ui/Buttons/encryption",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/locked-padlock}} {{$:/language/Buttons/Encryption/Caption}}",
"description": "{{$:/language/Buttons/Encryption/Hint}}",
"text": "\\whitespace trim\n<$reveal type=\"match\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-clear-password\" tooltip={{$:/language/Buttons/Encryption/ClearPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/ClearPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/locked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/ClearPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=\"$:/isEncrypted\" text=\"yes\">\n<$button message=\"tm-set-password\" tooltip={{$:/language/Buttons/Encryption/SetPassword/Hint}} aria-label={{$:/language/Buttons/Encryption/SetPassword/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/unlocked-padlock}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Encryption/SetPassword/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
},
"$:/core/ui/Buttons/export-page": {
"title": "$:/core/ui/Buttons/export-page",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportPage/Caption}}",
"description": "{{$:/language/Buttons/ExportPage/Hint}}",
"text": "<$macrocall $name=\"exportButton\" exportFilter=\"[!is[system]sort[title]]\" lingoBase=\"$:/language/Buttons/ExportPage/\"/>"
},
"$:/core/ui/Buttons/fold-all": {
"title": "$:/core/ui/Buttons/fold-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/fold-all-button}} {{$:/language/Buttons/FoldAll/Caption}}",
"description": "{{$:/language/Buttons/FoldAll/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/FoldAll/Hint}} aria-label={{$:/language/Buttons/FoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FoldAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/full-screen": {
"title": "$:/core/ui/Buttons/full-screen",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/full-screen-button}} {{$:/language/Buttons/FullScreen/Caption}}",
"description": "{{$:/language/Buttons/FullScreen/Hint}}",
"text": "<$button message=\"tm-full-screen\" tooltip={{$:/language/Buttons/FullScreen/Hint}} aria-label={{$:/language/Buttons/FullScreen/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/full-screen-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/FullScreen/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/home": {
"title": "$:/core/ui/Buttons/home",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/home-button}} {{$:/language/Buttons/Home/Caption}}",
"description": "{{$:/language/Buttons/Home/Hint}}",
"text": "<$button message=\"tm-home\" tooltip={{$:/language/Buttons/Home/Hint}} aria-label={{$:/language/Buttons/Home/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/home-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Home/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/import": {
"title": "$:/core/ui/Buttons/import",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/import-button}} {{$:/language/Buttons/Import/Caption}}",
"description": "{{$:/language/Buttons/Import/Hint}}",
"text": "<div class=\"tc-file-input-wrapper\">\n<$button tooltip={{$:/language/Buttons/Import/Hint}} aria-label={{$:/language/Buttons/Import/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/import-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Import/Caption}}/></span>\n</$list>\n</$button>\n<$browse tooltip={{$:/language/Buttons/Import/Hint}}/>\n</div>"
},
"$:/core/ui/Buttons/language": {
"title": "$:/core/ui/Buttons/language",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/globe}} {{$:/language/Buttons/Language/Caption}}",
"description": "{{$:/language/Buttons/Language/Hint}}",
"text": "\\whitespace trim\n\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/language\">> tooltip={{$:/language/Buttons/Language/Hint}} aria-label={{$:/language/Buttons/Language/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value={{$:/language}}>\n<$image source=<<flag-title>>/>\n</$set>\n</span>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Language/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/language\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/languageswitcher}}\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/manager": {
"title": "$:/core/ui/Buttons/manager",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/list}} {{$:/language/Buttons/Manager/Caption}}",
"description": "{{$:/language/Buttons/Manager/Hint}}",
"text": "\\whitespace trim\n\\define manager-button(class)\n<$button to=\"$:/Manager\" tooltip={{$:/language/Buttons/Manager/Hint}} aria-label={{$:/language/Buttons/Manager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/list}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Manager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/Manager]]\" emptyMessage=<<manager-button>>>\n<<manager-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/more-page-actions": {
"title": "$:/core/ui/Buttons/more-page-actions",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/More/Caption}}/></span>\n</$list>\n</$button><$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"below\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]] -[[$:/core/ui/Buttons/more-page-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
},
"$:/core/ui/Buttons/new-image": {
"title": "$:/core/ui/Buttons/new-image",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-image-button}} {{$:/language/Buttons/NewImage/Caption}}",
"description": "{{$:/language/Buttons/NewImage/Hint}}",
"text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/NewImage/Hint}} aria-label={{$:/language/Buttons/NewImage/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-image}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-image-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewImage/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/core/ui/Buttons/new-journal": {
"title": "$:/core/ui/Buttons/new-journal",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournal/Caption}}",
"description": "{{$:/language/Buttons/NewJournal/Hint}}",
"text": "\\whitespace trim\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournal/Hint}} aria-label={{$:/language/Buttons/NewJournal/Caption}} class=<<tv-config-toolbar-class>> actions={{$:/core/ui/Actions/new-journal}}>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewJournal/Caption}}/></span>\n</$list>\n</$button>\n\\end\n<<journalButton>>\n"
},
"$:/core/ui/Buttons/new-tiddler": {
"title": "$:/core/ui/Buttons/new-tiddler",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/new-button}} {{$:/language/Buttons/NewTiddler/Caption}}",
"description": "{{$:/language/Buttons/NewTiddler/Hint}}",
"text": "\\whitespace trim\n<$button actions={{$:/core/ui/Actions/new-tiddler}} tooltip={{$:/language/Buttons/NewTiddler/Hint}} aria-label={{$:/language/Buttons/NewTiddler/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/NewTiddler/Caption}}/></span>\n</$list>\n</$button>\n"
},
"$:/core/ui/Buttons/palette": {
"title": "$:/core/ui/Buttons/palette",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/palette}} {{$:/language/Buttons/Palette/Caption}}",
"description": "{{$:/language/Buttons/Palette/Hint}}",
"text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/palette\">> tooltip={{$:/language/Buttons/Palette/Hint}} aria-label={{$:/language/Buttons/Palette/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/palette}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Palette/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/palette\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\" style=\"font-size:0.7em;\">\n{{$:/snippets/paletteswitcher}}\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/print": {
"title": "$:/core/ui/Buttons/print",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/print-button}} {{$:/language/Buttons/Print/Caption}}",
"description": "{{$:/language/Buttons/Print/Hint}}",
"text": "<$button message=\"tm-print\" tooltip={{$:/language/Buttons/Print/Hint}} aria-label={{$:/language/Buttons/Print/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/print-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Print/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/refresh": {
"title": "$:/core/ui/Buttons/refresh",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/refresh-button}} {{$:/language/Buttons/Refresh/Caption}}",
"description": "{{$:/language/Buttons/Refresh/Hint}}",
"text": "<$button message=\"tm-browser-refresh\" tooltip={{$:/language/Buttons/Refresh/Hint}} aria-label={{$:/language/Buttons/Refresh/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/refresh-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Refresh/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/save-wiki": {
"title": "$:/core/ui/Buttons/save-wiki",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/save-button}} {{$:/language/Buttons/SaveWiki/Caption}}",
"description": "{{$:/language/Buttons/SaveWiki/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/SaveWiki/Hint}} aria-label={{$:/language/Buttons/SaveWiki/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"site-title\" text={{$:/config/SaveWikiButton/Filename}}>\n<$action-sendmessage $message=\"tm-save-wiki\" $param={{$:/config/SaveWikiButton/Template}} filename=<<site-title>>/>\n</$wikify>\n<span class=\"tc-dirty-indicator\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/save-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/SaveWiki/Caption}}/></span>\n</$list>\n</span>\n</$button>"
},
"$:/core/ui/Buttons/storyview": {
"title": "$:/core/ui/Buttons/storyview",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/storyview-classic}} {{$:/language/Buttons/StoryView/Caption}}",
"description": "{{$:/language/Buttons/StoryView/Hint}}",
"text": "\\whitespace trim\n\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/storyview\">> tooltip={{$:/language/Buttons/StoryView/Hint}} aria-label={{$:/language/Buttons/StoryView/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n<$set name=\"storyview\" value={{$:/view}}>\n<$transclude tiddler=<<icon>>/>\n</$set>\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/StoryView/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/storyview\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n{{$:/snippets/viewswitcher}}\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/tag-manager": {
"title": "$:/core/ui/Buttons/tag-manager",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/tag-button}} {{$:/language/Buttons/TagManager/Caption}}",
"description": "{{$:/language/Buttons/TagManager/Hint}}",
"text": "\\whitespace trim\n\\define control-panel-button(class)\n<$button to=\"$:/TagManager\" tooltip={{$:/language/Buttons/TagManager/Hint}} aria-label={{$:/language/Buttons/TagManager/Caption}} class=\"\"\"$(tv-config-toolbar-class)$ $class$\"\"\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/tag-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/TagManager/Caption}}/></span>\n</$list>\n</$button>\n\\end\n\n<$list filter=\"[list[$:/StoryList]] +[field:title[$:/TagManager]]\" emptyMessage=<<control-panel-button>>>\n<<control-panel-button \"tc-selected\">>\n</$list>\n"
},
"$:/core/ui/Buttons/theme": {
"title": "$:/core/ui/Buttons/theme",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/theme-button}} {{$:/language/Buttons/Theme/Caption}}",
"description": "{{$:/language/Buttons/Theme/Hint}}",
"text": "\\whitespace trim\n<span class=\"tc-popup-keep\">\n<$button popup=<<qualify \"$:/state/popup/theme\">> tooltip={{$:/language/Buttons/Theme/Hint}} aria-label={{$:/language/Buttons/Theme/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/theme-button}}\n</$list>\n<$text text=\" \"/>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Theme/Caption}}/></span>\n</$list>\n</$button>\n</span>\n<$reveal state=<<qualify \"$:/state/popup/theme\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$linkcatcher to=\"$:/theme\">\n{{$:/snippets/themeswitcher}}\n</$linkcatcher>\n</div>\n</$reveal>\n"
},
"$:/core/ui/Buttons/timestamp": {
"title": "$:/core/ui/Buttons/timestamp",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/timestamp-on}} {{$:/language/Buttons/Timestamp/Caption}}",
"description": "{{$:/language/Buttons/Timestamp/Hint}}",
"text": "\\whitespace trim\n<$reveal type=\"nomatch\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/On/Hint}} aria-label={{$:/language/Buttons/Timestamp/On/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"yes\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-on}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/On/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" state=\"$:/config/TimestampDisable\" text=\"yes\">\n<$button tooltip={{$:/language/Buttons/Timestamp/Off/Hint}} aria-label={{$:/language/Buttons/Timestamp/Off/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-setfield $tiddler=\"$:/config/TimestampDisable\" $value=\"no\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/timestamp-off}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/Timestamp/Off/Caption}}/></span>\n</$list>\n</$button>\n</$reveal>\n"
},
"$:/core/ui/Buttons/unfold-all": {
"title": "$:/core/ui/Buttons/unfold-all",
"tags": "$:/tags/PageControls",
"caption": "{{$:/core/images/unfold-all-button}} {{$:/language/Buttons/UnfoldAll/Caption}}",
"description": "{{$:/language/Buttons/UnfoldAll/Hint}}",
"text": "<$button tooltip={{$:/language/Buttons/UnfoldAll/Hint}} aria-label={{$:/language/Buttons/UnfoldAll/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-unfold-all-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-all-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$:/language/Buttons/UnfoldAll/Caption}}/></span>\n</$list>\n</$button>"
},
"$:/core/ui/PageTemplate/pagecontrols": {
"title": "$:/core/ui/PageTemplate/pagecontrols",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-page-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n<$set name=\"hidden\" value=<<config-title>>>\n<$list filter=\"[<hidden>!text[hide]]\" storyview=\"pop\" variable=\"ignore\">\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n</$set>\n</$list>\n</$set>\n</$list>\n</div>\n"
},
"$:/core/ui/PageStylesheet": {
"title": "$:/core/ui/PageStylesheet",
"text": "\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$set name=\"currentTiddler\" value={{$:/language}}>\n\n<$set name=\"languageTitle\" value={{!!name}}>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/PageTemplate/alerts": {
"title": "$:/core/ui/PageTemplate/alerts",
"tags": "$:/tags/PageTemplate",
"text": "<div class=\"tc-alerts\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Alert]!has[draft.of]]\" template=\"$:/core/ui/AlertTemplate\" storyview=\"pop\"/>\n\n</div>\n"
},
"$:/core/ui/PageTemplate/drafts": {
"title": "$:/core/ui/PageTemplate/drafts",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n<$reveal state=\"$:/status/IsReadOnly\" type=\"nomatch\" text=\"yes\" tag=\"div\" class=\"tc-drafts-list\">\n<$list filter=\"[has[draft.of]!sort[modified]] -[list[$:/StoryList]]\">\n<$link>\n{{$:/core/images/edit-button}} <$text text=<<currentTiddler>>/>\n</$link>\n</$list>\n</$reveal>\n"
},
"$:/core/ui/PageTemplate/pluginreloadwarning": {
"title": "$:/core/ui/PageTemplate/pluginreloadwarning",
"tags": "$:/tags/PageTemplate",
"text": "\\define lingo-base() $:/language/\n\n<$list filter=\"[{$:/status/RequireReloadDueToPluginChange}match[yes]]\">\n\n<$reveal type=\"nomatch\" state=\"$:/temp/HidePluginWarning\" text=\"yes\">\n\n<div class=\"tc-plugin-reload-warning\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<<lingo PluginReloadWarning>> <$button set=\"$:/temp/HidePluginWarning\" setTo=\"yes\" class=\"tc-btn-invisible\">{{$:/core/images/close-button}}</$button>\n\n</$set>\n\n</div>\n\n</$reveal>\n\n</$list>\n"
},
"$:/core/ui/PageTemplate/sidebar": {
"title": "$:/core/ui/PageTemplate/sidebar",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/SideBarSegments/Visibility/$(listItem)$\n\\end\n\n<$scrollable fallthrough=\"no\" class=\"tc-sidebar-scrollable\">\n\n<div class=\"tc-sidebar-header\">\n\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SideBarSegment]!has[draft.of]]\" variable=\"listItem\">\n\n<$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\" tag=\"div\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n\n</$reveal>\n\n</$list>\n\n</$reveal>\n\n</div>\n\n</$scrollable>\n"
},
"$:/core/ui/PageTemplate/story": {
"title": "$:/core/ui/PageTemplate/story",
"tags": "$:/tags/PageTemplate",
"text": "\\whitespace trim\n<section class=\"tc-story-river\">\n\n<section class=\"story-backdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/AboveStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n<$list filter=\"[list[$:/StoryList]]\" history=\"$:/HistoryList\" template={{$:/config/ui/ViewTemplate}} editTemplate={{$:/config/ui/EditTemplate}} storyview={{$:/view}} emptyMessage={{$:/config/EmptyStoryMessage}}/>\n\n<section class=\"story-frontdrop\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/BelowStory]!has[draft.of]]\">\n\n<$transclude/>\n\n</$list>\n\n</section>\n\n</section>\n"
},
"$:/core/ui/PageTemplate/topleftbar": {
"title": "$:/core/ui/PageTemplate/topleftbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-left\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopLeftBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate/toprightbar": {
"title": "$:/core/ui/PageTemplate/toprightbar",
"tags": "$:/tags/PageTemplate",
"text": "<span class=\"tc-topbar tc-topbar-right\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TopRightBar]!has[draft.of]]\" variable=\"listItem\" storyview=\"pop\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$list>\n\n</span>\n"
},
"$:/core/ui/PageTemplate": {
"title": "$:/core/ui/PageTemplate",
"name": "{{$:/language/PageTemplate/Name}}",
"description": "{{$:/language/PageTemplate/Description}}",
"text": "\\whitespace trim\n\\define containerClasses()\ntc-page-container tc-page-view-$(storyviewTitle)$ tc-language-$(languageTitle)$\n\\end\n\\import [[$:/core/ui/PageMacros]] [all[shadows+tiddlers]tag[$:/tags/Macro]!has[draft.of]]\n\n<$vars\n\ttv-config-toolbar-icons={{$:/config/Toolbar/Icons}}\n\ttv-config-toolbar-text={{$:/config/Toolbar/Text}}\n\ttv-config-toolbar-class={{$:/config/Toolbar/ButtonClass}}\n\ttv-enable-drag-and-drop={{$:/config/DragAndDrop/Enable}}\n\ttv-show-missing-links={{$:/config/MissingLinks}}\n\tstoryviewTitle={{$:/view}}\n\tlanguageTitle={{{ [{$:/language}get[name]] }}}>\n\n<div class=<<containerClasses>>>\n\n<$navigator story=\"$:/StoryList\" history=\"$:/HistoryList\" openLinkFromInsideRiver={{$:/config/Navigation/openLinkFromInsideRiver}} openLinkFromOutsideRiver={{$:/config/Navigation/openLinkFromOutsideRiver}} relinkOnRename={{$:/config/RelinkOnRename}}>\n\n<$dropzone enable=<<tv-enable-drag-and-drop>>>\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageTemplate]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>>/>\n\n</$list>\n\n</$dropzone>\n\n</$navigator>\n\n</div>\n\n</$vars>\n"
},
"$:/PaletteManager": {
"title": "$:/PaletteManager",
"text": "\\define lingo-base() $:/language/ControlPanel/Palette/Editor/\n\\define describePaletteColour(colour)\n<$transclude tiddler=\"$:/language/Docs/PaletteColours/$colour$\"><$text text=\"$colour$\"/></$transclude>\n\\end\n\\define edit-colour-placeholder()\n edit $(colourName)$\n\\end\n\\define colour-tooltip(showhide) $showhide$ editor for $(newColourName)$ \n\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define delete-colour-index-actions() <$action-setfield $index=<<colourName>>/>\n\\define palette-manager-colour-row-segment()\n\\whitespace trim\n<$edit-text index=<<colourName>> tag=\"input\" placeholder=<<edit-colour-placeholder>> default=\"\"/>\n<br>\n<$edit-text index=<<colourName>> type=\"color\" tag=\"input\" class=\"tc-palette-manager-colour-input\"/>\n<$list filter=\"[<currentTiddler>getindex<colourName>removeprefix[<<]removesuffix[>>]] [<currentTiddler>getindex<colourName>removeprefix[<$]removesuffix[/>]]\" variable=\"ignore\">\n<$set name=\"state\" value={{{ [[$:/state/palettemanager/]addsuffix<currentTiddler>addsuffix[/]addsuffix<colourName>] }}}>\n<$wikify name=\"newColourName\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall={{{ [<currentTiddler>getindex<colourName>] }}}/>\"\"\">\n<$reveal state=<<state>> type=\"nomatch\" text=\"show\">\n<$button tooltip=<<colour-tooltip show>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" set=<<state>> setTo=\"show\">{{$:/core/images/down-arrow}}<$text text=<<newColourName>> class=\"tc-small-gap-left\"/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$button tooltip=<<colour-tooltip hide>> aria-label=<<colour-tooltip show>> class=\"tc-btn-invisible\" actions=\"\"\"<$action-deletetiddler $tiddler=<<state>>/>\"\"\">{{$:/core/images/up-arrow}}<$text text=<<newColourName>> class=\"tc-small-gap-left\"/></$button><br>\n</$reveal>\n<$reveal state=<<state>> type=\"match\" text=\"show\">\n<$set name=\"colourName\" value=<<newColourName>>>\n<br>\n<<palette-manager-colour-row-segment>>\n<br><br>\n</$set>\n</$reveal>\n</$wikify>\n</$set>\n</$list>\n\\end\n\\define palette-manager-colour-row()\n\\whitespace trim\n<tr>\n<td>\n<span style=\"float:right;\">\n<$button tooltip={{$:/language/ControlPanel/Palette/Editor/Delete/Hint}} aria-label=<<lingo Delete/Hint>> class=\"tc-btn-invisible\" actions=<<delete-colour-index-actions>>>\n{{$:/core/images/delete-button}}</$button>\n</span>\n''<$macrocall $name=\"describePaletteColour\" colour=<<colourName>>/>''<br/>\n<$macrocall $name=\"colourName\" $output=\"text/plain\"/>\n</td>\n<td>\n<<palette-manager-colour-row-segment>>\n</td>\n</tr>\n\\end\n\\define palette-manager-table()\n\\whitespace trim\n<table>\n<tbody>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]indexes[]]\" variable=\"colourName\">\n<$list filter=\"[<currentTiddler>indexes[]removeprefix<colourName>suffix[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$list filter=\"[{$:/state/palettemanager/showexternal}removeprefix[yes]suffix[]]\" variable=\"ignore\">\n<<palette-manager-colour-row>>\n</$list>\n\"\"\">\n<<palette-manager-colour-row>>\n</$list>\n</$list>\n</tbody>\n</table>\n\\end\n<$set name=\"currentTiddler\" value={{$:/palette}}>\n\n<<lingo Prompt>> <$link to={{$:/palette}}><$macrocall $name=\"currentTiddler\" $output=\"text/plain\"/></$link>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\" variable=\"listItem\">\n<<lingo Prompt/Modified>>\n<$button message=\"tm-delete-tiddler\" param={{$:/palette}}><<lingo Reset/Caption>></$button>\n</$list>\n\n<$list filter=\"[all[current]is[shadow]!is[tiddler]]\" variable=\"listItem\">\n<<lingo Clone/Prompt>>\n</$list>\n\n<$button message=\"tm-new-tiddler\" param={{$:/palette}}><<lingo Clone/Caption>></$button>\n\n<$checkbox tiddler=\"$:/state/palettemanager/showexternal\" field=\"text\" checked=\"yes\" unchecked=\"no\"><span class=\"tc-small-gap-left\"><<lingo Names/External/Show>></span></$checkbox>\n\n<<palette-manager-table>>\n"
},
"$:/core/ui/PluginInfo": {
"title": "$:/core/ui/PluginInfo",
"text": "\\define localised-info-tiddler-title()\n$(currentTiddler)$/$(languageTitle)$/$(currentTab)$\n\\end\n\\define info-tiddler-title()\n$(currentTiddler)$/$(currentTab)$\n\\end\n\\define default-tiddler-title()\n$:/core/ui/PluginInfo/Default/$(currentTab)$\n\\end\n<$transclude tiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<localised-info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<currentTiddler>> subtiddler=<<info-tiddler-title>> mode=\"block\">\n<$transclude tiddler=<<default-tiddler-title>> mode=\"block\">\n{{$:/language/ControlPanel/Plugin/NoInfoFound/Hint}}\n</$transclude>\n</$transclude>\n</$transclude>\n</$transclude>\n"
},
"$:/core/ui/PluginInfo/Default/contents": {
"title": "$:/core/ui/PluginInfo/Default/contents",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link />\n</li>\n</$list>\n</ul>\n"
},
"$:/core/ui/PluginListItemTemplate": {
"title": "$:/core/ui/PluginListItemTemplate",
"text": "<div class=\"tc-menu-list-item\">\n<$link to={{!!title}}><$view field=\"description\"><$view field=\"title\"/></$view></$link>\n</div>"
},
"$:/core/ui/RootTemplate": {
"title": "$:/core/ui/RootTemplate",
"text": "<$transclude tiddler={{{ [{$:/layout}has[text]] ~[[$:/core/ui/PageTemplate]] }}} mode=\"inline\"/>\n\n"
},
"$:/core/ui/SearchResults": {
"title": "$:/core/ui/SearchResults",
"text": "<div class=\"tc-search-results\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]butfirst[]limit[1]]\" emptyMessage=\"\"\"\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\">\n<$transclude mode=\"block\"/>\n</$list>\n\"\"\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SearchResults]!has[draft.of]]\" default={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<currentTab>>/>\"\"\" explicitState=\"$:/state/tab/search-results/sidebar\"/>\n\n</$list>\n\n</div>\n"
},
"$:/core/ui/SideBar/More": {
"title": "$:/core/ui/SideBar/More",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/More/Caption}}",
"text": "<div class=\"tc-more-sidebar\">\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/MoreSideBar]!has[draft.of]]\" default={{$:/config/DefaultMoreSidebarTab}} state=\"$:/state/tab/moresidebar\" class=\"tc-vertical tc-sidebar-tabs-more\" explicitState=\"$:/state/tab/moresidebar-1850697562\"/>\n</div>\n"
},
"$:/core/ui/SideBar/Open": {
"title": "$:/core/ui/SideBar/Open",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Open/Caption}}",
"text": "\\whitespace trim\n\\define lingo-base() $:/language/CloseAll/\n\n\\define drop-actions()\n<$action-listops $tiddler=<<tv-story-list>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define placeholder()\n<div class=\"tc-droppable-placeholder\"/>\n\\end\n\n\\define droppable-item(button)\n\\whitespace trim\n<$droppable actions=<<drop-actions>> enable=<<tv-allow-drag-and-drop>>>\n<<placeholder>>\n<div>\n$button$\n</div>\n</$droppable>\n\\end\n\n<div class=\"tc-sidebar-tab-open\">\n<$list filter=\"[list<tv-story-list>]\" history=<<tv-history-list>> storyview=\"pop\">\n<div class=\"tc-sidebar-tab-open-item\">\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=\"tc-btn-invisible tc-btn-mini tc-small-gap-right\">{{$:/core/images/close-button}}</$button><$link to={{!!title}}><$view field=\"title\"/></$link>\"\"\"/>\n</div>\n</$list>\n<$tiddler tiddler=\"\">\n<div>\n<$macrocall $name=\"droppable-item\" button=\"\"\"<$button message=\"tm-close-all-tiddlers\" class=\"tc-btn-invisible tc-btn-mini\"><<lingo Button>></$button>\"\"\"/>\n</div>\n</$tiddler>\n</div>\n"
},
"$:/core/ui/SideBar/Recent": {
"title": "$:/core/ui/SideBar/Recent",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Recent/Caption}}",
"text": "<$macrocall $name=\"timeline\" format={{$:/language/RecentChanges/DateFormat}}/>\n"
},
"$:/core/ui/SideBar/Tools": {
"title": "$:/core/ui/SideBar/Tools",
"tags": "$:/tags/SideBar",
"caption": "{{$:/language/SideBar/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/ControlPanel/\n\\define config-title()\n$:/config/PageControlButtons/Visibility/$(listItem)$\n\\end\n\n<<lingo Basics/Version/Prompt>> <<version>>\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/PageControls]!has[draft.of]]\" variable=\"listItem\">\n\n<div style=\"position:relative;\" class={{{ [<listItem>encodeuricomponent[]addprefix[tc-btn-]] }}}>\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</div>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/SideBarLists": {
"title": "$:/core/ui/SideBarLists",
"text": "<$transclude tiddler=\"$:/core/ui/SideBarSegments/search\"/>\n\n<$transclude tiddler=\"$:/core/ui/SideBarSegments/tabs\"/>\n\n"
},
"$:/core/ui/SideBarSegments/page-controls": {
"title": "$:/core/ui/SideBarSegments/page-controls",
"tags": "$:/tags/SideBarSegment",
"text": "{{||$:/core/ui/PageTemplate/pagecontrols}}\n"
},
"$:/core/ui/SideBarSegments/search": {
"title": "$:/core/ui/SideBarSegments/search",
"tags": "$:/tags/SideBarSegment",
"text": "\\whitespace trim\n\n\\define count-popup-button()\n\\whitespace trim\n<$button popup=<<qualify \"$:/state/popup/search-dropdown\">> class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n<$list filter=\"[{$(searchTiddler)$}minlength{$:/config/Search/MinLength}limit[1]]\" variable=\"listItem\">\n<$vars userInput={{{ [<searchTiddler>get[text]] }}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}} replaceRegexp=\"limit\\[\\d+\\]\">\n<$vars primaryListFilter={{{ [<configTiddler>get[first-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}} secondaryListFilter={{{ [<configTiddler>get[second-search-filter]search-replace:g:regexp<replaceRegexp>,[]] }}}>\n<$set name=\"resultCount\" value=\"\"\"<$count filter=\"[subfilter<primaryListFilter>] [subfilter<secondaryListFilter>]\"/>\"\"\">\n{{$:/language/Search/Matches}}\n</$set>\n</$vars>\n</$vars>\n</$list>\n</$button>\n\\end\n\n\\define search-results-list()\n\\whitespace trim\n<$vars userInput={{$(searchTiddler)$}} configTiddler={{{ [[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}] }}}>\n<$list filter=\"[<userInput>minlength{$:/config/Search/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n\n<$tiddler tiddler=<<configTiddler>>>\n\n{{$:/core/ui/SearchResults}}\n\n</$tiddler>\n\n</$list>\n</$vars>\n\\end\n\n\\define cancel-search-actions() <$list filter=\"[<searchTiddler>get[text]!match{$:/temp/search}]\" emptyMessage=\"\"\"<$action-deletetiddler $filter=\"[[$:/temp/search]] [<searchTiddler>] [<searchListState>]\"/>\"\"\"><$action-setfield $tiddler=\"$:/temp/search\" text={{{ [<searchTiddler>get[text]] }}}/><$action-setfield $tiddler=\"$:/temp/search/refresh\" text=\"yes\"/></$list>\n\n\\define input-accept-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\"\"\"><$action-navigate $to={{{ [<__tiddler__>get[text]] }}}/></$list>\n\n\\define input-accept-variant-actions() <$list filter=\"[{$:/config/Search/NavigateOnEnter/enable}match[yes]]\" emptyMessage=\"\"\"<$list filter=\"[<__tiddler__>get[text]!is[missing]] ~[<__tiddler__>get[text]is[shadow]]\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\"\"\"><$list filter=\"[<__tiddler__>get[text]minlength[1]]\"><$action-sendmessage $message=\"tm-edit-tiddler\" $param={{{ [<__tiddler__>get[text]] }}}/></$list></$list>\n\n\\define set-next-input-tab(beforeafter:\"after\") <$macrocall $name=\"change-input-tab\" stateTitle=\"$:/state/tab/search-results/sidebar\" tag=\"$:/tags/SearchResults\" beforeafter=\"$beforeafter$\" defaultState={{$:/config/SearchResults/Default}} actions=\"\"\"<$action-setfield $tiddler=\"$:/state/search/currentTab\" text=<<nextTab>>/>\"\"\"/>\n\n\\define advanced-search-actions() <$action-setfield $tiddler=\"$:/temp/advancedsearch\" text={{$:/temp/search/input}}/><$action-setfield $tiddler=\"$:/temp/advancedsearch/input\" text={{$:/temp/search/input}}/><<delete-state-tiddlers>><$action-navigate $to=\"$:/AdvancedSearch\"/><$action-setfield $tiddler=\"$:/temp/advancedsearch/refresh\" text=\"yes\"/><$action-sendmessage $message=\"tm-focus-selector\" $param=\"\"\"[data-tiddler-title=\"$:/AdvancedSearch\"] .tc-search input\"\"\" preventScroll=\"true\"/><$action-deletetiddler $filter=\"$:/temp/search $:/temp/search/input $:/temp/search/refresh [<searchListState>]\"/>\n\n<div class=\"tc-sidebar-lists tc-sidebar-search\">\n\n<$vars editTiddler=\"$:/temp/search\" searchTiddler=\"$:/temp/search/input\" searchListState=<<qualify \"$:/state/search-list/selected-item\">>>\n<div class=\"tc-search\">\n<$keyboard key=\"((input-tab-right))\" actions=<<set-next-input-tab>>>\n<$keyboard key=\"((input-tab-left))\" actions=<<set-next-input-tab \"before\">>>\n<$keyboard key=\"((advanced-search-sidebar))\" actions=<<advanced-search-actions>>>\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<editTiddler>> storeTitle=<<searchTiddler>> \n\t\tselectionStateTitle=<<searchListState>> refreshTitle=\"$:/temp/search/refresh\" type=\"search\" \n\t\ttag=\"input\" focus={{$:/config/Search/AutoFocus}} focusPopup=<<qualify \"$:/state/popup/search-dropdown\">> \n\t\tclass=\"tc-popup-handle\" filterMinLength={{$:/config/Search/MinLength}} inputCancelActions=<<cancel-search-actions>> \n\t\tinputAcceptActions=<<input-accept-actions>> inputAcceptVariantActions=<<input-accept-variant-actions>> cancelPopups=\"yes\" \n\t\tconfigTiddlerFilter=\"[[$:/state/search/currentTab]!is[missing]get[text]] ~[{$:/config/SearchResults/Default}]\"/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n<$reveal state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n<$button tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n<<advanced-search-actions>>\n{{$:/core/images/advanced-search-button}}\n</$button>\n<$button class=\"tc-btn-invisible\">\n<<cancel-search-actions>><$action-sendmessage $message=\"tm-focus-selector\" $param=\".tc-search input\"/>\n{{$:/core/images/close-button}}\n</$button>\n<<count-popup-button>>\n</$reveal>\n<$reveal state=<<searchTiddler>> type=\"match\" text=\"\">\n<$button to=\"$:/AdvancedSearch\" tooltip={{$:/language/Buttons/AdvancedSearch/Hint}} aria-label={{$:/language/Buttons/AdvancedSearch/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/advanced-search-button}}\n</$button>\n</$reveal>\n</div>\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown-wrapper\" state=<<searchTiddler>> type=\"nomatch\" text=\"\">\n\n<$reveal tag=\"div\" class=\"tc-block-dropdown tc-search-drop-down tc-popup-handle\" state=<<qualify \"$:/state/popup/search-dropdown\">> type=\"nomatch\" text=\"\" default=\"\">\n\n<<search-results-list>>\n\n</$reveal>\n\n</$reveal>\n\n</$vars>\n\n</div>\n"
},
"$:/core/ui/SideBarSegments/site-subtitle": {
"title": "$:/core/ui/SideBarSegments/site-subtitle",
"tags": "$:/tags/SideBarSegment",
"text": "<div class=\"tc-site-subtitle\">\n\n<$transclude tiddler=\"$:/SiteSubtitle\" mode=\"inline\"/>\n\n</div>\n"
},
"$:/core/ui/SideBarSegments/site-title": {
"title": "$:/core/ui/SideBarSegments/site-title",
"tags": "$:/tags/SideBarSegment",
"text": "<h1 class=\"tc-site-title\">\n\n<$transclude tiddler=\"$:/SiteTitle\" mode=\"inline\"/>\n\n</h1>\n"
},
"$:/core/ui/SideBarSegments/tabs": {
"title": "$:/core/ui/SideBarSegments/tabs",
"tags": "$:/tags/SideBarSegment",
"text": "<div class=\"tc-sidebar-lists tc-sidebar-tabs\">\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/SideBar]!has[draft.of]]\" default={{$:/config/DefaultSidebarTab}} state=\"$:/state/tab/sidebar\" class=\"tc-sidebar-tabs-main\" explicitState=\"$:/state/tab/sidebar--595412856\"/>\n\n</div>\n"
},
"$:/core/ui/SwitcherModal": {
"title": "$:/core/ui/SwitcherModal",
"subtitle": "<$text text={{{[<switch>lookup[$:/language/Switcher/Subtitle/]]}}}/>",
"class": "tc-modal-centered",
"text": "<$tiddler tiddler={{{[<switch>lookup[$:/config/SwitcherTargets/]]}}}>\n\n\n<$transclude/>\n\n\n</$tiddler>"
},
"$:/TagManager": {
"title": "$:/TagManager",
"icon": "$:/core/images/tag-button",
"color": "#bbb",
"text": "\\define lingo-base() $:/language/TagManager/\n\\define iconEditorTab(type)\n\\whitespace trim\n<$link to=\"\"><<lingo Icons/None>></$link>\n<$list filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[sort[title]] +[$type$is[system]]\">\n<$link to={{!!title}}>\n<$transclude/> <$view field=\"title\"/>\n</$link>\n</$list>\n\\end\n\\define iconEditor(title)\n\\whitespace trim\n<div class=\"tc-drop-down-wrapper\">\n<$button popupTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal stateTitle={{{ [[$:/state/popup/icon/]addsuffix<__title__>] }}} type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$linkcatcher actions=\"\"\"<$action-setfield $tiddler=<<__title__>> icon=<<navigateTo>>/>\"\"\">\n<<iconEditorTab type:\"!\">>\n<hr/>\n<<iconEditorTab type:\"\">>\n</$linkcatcher>\n</div>\n</$reveal>\n</div>\n\\end\n\\define toggleButton(state)\n\\whitespace trim\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"closed\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"open\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n<$reveal stateTitle=<<__state__>> type=\"match\" text=\"open\" default=\"closed\">\n<$button setTitle=<<__state__>> setTo=\"closed\" class=\"tc-btn-invisible tc-btn-dropdown\" selectedClass=\"tc-selected\">\n{{$:/core/images/info-button}}\n</$button>\n</$reveal>\n\\end\n\\whitespace trim\n<table class=\"tc-tag-manager-table\">\n<tbody>\n<tr>\n<th><<lingo Colour/Heading>></th>\n<th class=\"tc-tag-manager-tag\"><<lingo Tag/Heading>></th>\n<th><<lingo Count/Heading>></th>\n<th><<lingo Icon/Heading>></th>\n<th><<lingo Info/Heading>></th>\n</tr>\n<$list filter=\"[tags[]!is[system]sort[title]]\">\n<tr>\n<td><$edit-text field=\"color\" tag=\"input\" type=\"color\"/></td>\n<td>{{||$:/core/ui/TagTemplate}}</td>\n<td><$count filter=\"[all[current]tagging[]]\"/></td>\n<td>\n<$macrocall $name=\"iconEditor\" title={{!!title}}/>\n</td>\n<td>\n<$macrocall $name=\"toggleButton\" state={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} /> \n</td>\n</tr>\n<tr>\n<td></td>\n<td colspan=\"4\">\n<$reveal stateTitle={{{ [[$:/state/tag-manager/]addsuffix<currentTiddler>] }}} type=\"match\" text=\"open\" default=\"\">\n<table>\n<tbody>\n<tr><td><<lingo Colour/Heading>></td><td><$edit-text field=\"color\" tag=\"input\" type=\"text\" size=\"9\"/></td></tr>\n<tr><td><<lingo Icon/Heading>></td><td><$edit-text field=\"icon\" tag=\"input\" size=\"45\"/></td></tr>\n</tbody>\n</table>\n</$reveal>\n</td>\n</tr>\n</$list>\n<tr>\n<td></td>\n<td style=\"position:relative;\">\n{{$:/core/ui/UntaggedTemplate}}\n</td>\n<td>\n<small class=\"tc-menu-list-count\"><$count filter=\"[untagged[]!is[system]] -[tags[]]\"/></small>\n</td>\n<td></td>\n<td></td>\n</tr>\n</tbody>\n</table>\n"
},
"$:/core/ui/TagPickerTagTemplate": {
"title": "$:/core/ui/TagPickerTagTemplate",
"text": "\\whitespace trim\n<$button class=<<button-classes>> tag=\"a\" tooltip={{$:/language/EditTemplate/Tags/Add/Button/Hint}}>\n<$list filter=\"[<saveTiddler>minlength[1]]\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<tagField>> $subfilter=\"[<tag>]\"/>\n</$list>\n<$set name=\"currentTiddlerCSSEscaped\" value={{{ [<saveTiddler>escapecss[]] }}}>\n<$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-tagpicker-focus-selector>> preventScroll=\"true\"/>\n</$set>\n<<delete-tag-state-tiddlers>>\n<$list filter=\"[<refreshTitle>minlength[1]]\">\n<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n<<actions>>\n<$set name=\"backgroundColor\" value={{!!color}}>\n<$wikify name=\"foregroundColor\" text=\"\"\"<$macrocall $name=\"contrastcolour\" target={{!!color}} fallbackTarget=<<fallbackTarget>> colourA=<<colourA>> colourB=<<colourB>>/>\"\"\">\n<span class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n<$transclude tiddler={{!!icon}}/><$view field=\"title\" format=\"text\"/>\n</span>\n</$wikify>\n</$set>\n</$button>\n"
},
"$:/core/ui/TagTemplate": {
"title": "$:/core/ui/TagTemplate",
"text": "\\whitespace trim\n<span class=\"tc-tag-list-item\">\n<$set name=\"transclusion\" value=<<currentTiddler>>>\n<$macrocall $name=\"tag-pill-body\" tag=<<currentTiddler>> icon={{!!icon}} colour={{!!color}} palette={{$:/palette}} element-tag=\"\"\"$button\"\"\" element-attributes=\"\"\"popup=<<qualify \"$:/state/popup/tag\">> dragFilter='[all[current]tagging[]]' tag='span'\"\"\"/>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\" animate=\"yes\" class=\"tc-drop-down\">\n<$set name=\"tv-show-missing-links\" value=\"yes\">\n<$transclude tiddler=\"$:/core/ui/ListItemTemplate\"/>\n</$set>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TagDropdown]!has[draft.of]]\" variable=\"listItem\"> \n<$transclude tiddler=<<listItem>>/> \n</$list>\n<hr>\n<$macrocall $name=\"list-tagged-draggable\" tag=<<currentTiddler>>/>\n</$reveal>\n</$set>\n</span>\n"
},
"$:/core/ui/TiddlerFields": {
"title": "$:/core/ui/TiddlerFields",
"text": "<table class=\"tc-view-field-table\">\n<tbody>\n<$list filter=\"[all[current]fields[]sort[title]] -text\" template=\"$:/core/ui/TiddlerFieldTemplate\" variable=\"listItem\"/>\n</tbody>\n</table>\n"
},
"$:/core/ui/TiddlerFieldTemplate": {
"title": "$:/core/ui/TiddlerFieldTemplate",
"text": "<tr class=\"tc-view-field\">\n<td class=\"tc-view-field-name\">\n<$text text=<<listItem>>/>\n</td>\n<td class=\"tc-view-field-value\">\n<$view field=<<listItem>>/>\n</td>\n</tr>"
},
"$:/core/ui/TiddlerInfo/Advanced/PluginInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/PluginInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/PluginInfo/\n<$list filter=\"[all[current]has[plugin-type]]\">\n\n! <<lingo Heading>>\n\n<<lingo Hint>>\n<ul>\n<$list filter=\"[all[current]plugintiddlers[]sort[title]]\" emptyMessage=<<lingo Empty/Hint>>>\n<li>\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</li>\n</$list>\n</ul>\n\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Advanced/ShadowInfo": {
"title": "$:/core/ui/TiddlerInfo/Advanced/ShadowInfo",
"tags": "$:/tags/TiddlerInfo/Advanced",
"text": "\\define lingo-base() $:/language/TiddlerInfo/Advanced/ShadowInfo/\n<$set name=\"infoTiddler\" value=<<currentTiddler>>>\n\n''<<lingo Heading>>''\n\n<$list filter=\"[all[current]!is[shadow]]\">\n\n<<lingo NotShadow/Hint>>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]]\">\n\n<<lingo Shadow/Hint>>\n\n<$list filter=\"[all[current]shadowsource[]]\">\n\n<$set name=\"pluginTiddler\" value=<<currentTiddler>>>\n<<lingo Shadow/Source>>\n</$set>\n\n</$list>\n\n<$list filter=\"[all[current]is[shadow]is[tiddler]]\">\n\n<<lingo OverriddenShadow/Hint>>\n\n</$list>\n\n\n</$list>\n</$set>\n"
},
"$:/core/ui/TiddlerInfo/Advanced": {
"title": "$:/core/ui/TiddlerInfo/Advanced",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Advanced/Caption}}",
"text": "<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo/Advanced]!has[draft.of]]\" variable=\"listItem\">\n\n<$transclude tiddler=<<listItem>> mode=\"block\"/>\n</$list>\n"
},
"$:/core/ui/TiddlerInfo/Fields": {
"title": "$:/core/ui/TiddlerInfo/Fields",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Fields/Caption}}",
"text": "<$transclude tiddler=\"$:/core/ui/TiddlerFields\"/>\n"
},
"$:/core/ui/TiddlerInfo/List": {
"title": "$:/core/ui/TiddlerInfo/List",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/List/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[list{!!title}]\" emptyMessage=<<lingo List/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Listed": {
"title": "$:/core/ui/TiddlerInfo/Listed",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Listed/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]listed[]!is[system]]\" emptyMessage=<<lingo Listed/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/References": {
"title": "$:/core/ui/TiddlerInfo/References",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/References/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]backlinks[]sort[title]]\" emptyMessage=<<lingo References/Empty>> template=\"$:/core/ui/ListItemTemplate\">\n</$list>"
},
"$:/core/ui/TiddlerInfo/Tagging": {
"title": "$:/core/ui/TiddlerInfo/Tagging",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tagging/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n<$list filter=\"[all[current]tagging[]]\" emptyMessage=<<lingo Tagging/Empty>> template=\"$:/core/ui/ListItemTemplate\"/>\n"
},
"$:/core/ui/TiddlerInfo/Tools": {
"title": "$:/core/ui/TiddlerInfo/Tools",
"tags": "$:/tags/TiddlerInfo",
"caption": "{{$:/language/TiddlerInfo/Tools/Caption}}",
"text": "\\define lingo-base() $:/language/TiddlerInfo/\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\">\n\n<$checkbox tiddler=<<config-title>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"show\"/> <$transclude tiddler=<<listItem>>/> <i class=\"tc-muted\"><$transclude tiddler=<<listItem>> field=\"description\"/></i>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n"
},
"$:/core/ui/TiddlerInfo": {
"title": "$:/core/ui/TiddlerInfo",
"text": "<div style=\"position:relative;\">\n<div class=\"tc-tiddler-controls\" style=\"position:absolute;right:0;\">\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=\"tc-btn-invisible\">\n{{$:/core/images/close-button}}\n</$button>\n</$reveal>\n</div>\n</div>\n\n<$macrocall $name=\"tabs\" tabsList=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfo]!has[draft.of]]\" default={{$:/config/TiddlerInfo/Default}}/>\n"
},
"$:/core/ui/TopBar/menu": {
"title": "$:/core/ui/TopBar/menu",
"tags": "$:/tags/TopRightBar",
"text": "<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]!match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"no\" tooltip={{$:/language/Buttons/HideSideBar/Hint}} aria-label={{$:/language/Buttons/HideSideBar/Caption}} class=\"tc-btn-invisible tc-hide-sidebar-btn\">{{$:/core/images/chevron-right}}</$button>\n</$list>\n<$list filter=\"[[$:/state/sidebar]get[text]] +[else[yes]match[no]]\" variable=\"ignore\">\n<$button set=\"$:/state/sidebar\" setTo=\"yes\" tooltip={{$:/language/Buttons/ShowSideBar/Hint}} aria-label={{$:/language/Buttons/ShowSideBar/Caption}} class=\"tc-btn-invisible tc-show-sidebar-btn\">{{$:/core/images/chevron-left}}</$button>\n</$list>\n"
},
"$:/core/ui/UntaggedTemplate": {
"title": "$:/core/ui/UntaggedTemplate",
"text": "\\define lingo-base() $:/language/SideBar/\n<$button popup=<<qualify \"$:/state/popup/tag\">> class=\"tc-btn-invisible tc-untagged-label tc-tag-label\">\n<<lingo Tags/Untagged/Caption>>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/tag\">> type=\"popup\" position=\"below\">\n<div class=\"tc-drop-down\">\n<$list filter=\"[untagged[]!is[system]] -[tags[]] +[sort[title]]\" template=\"$:/core/ui/ListItemTemplate\"/>\n</div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/body": {
"title": "$:/core/ui/ViewTemplate/body",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal tag=\"div\" class=\"tc-tiddler-body\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]!has[plugin-type]!field:hide-body[yes]]\">\n\n<$transclude>\n\n<$transclude tiddler=\"$:/language/MissingTiddler/Hint\"/>\n\n</$transclude>\n\n</$list>\n\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/classic": {
"title": "$:/core/ui/ViewTemplate/classic",
"tags": "$:/tags/ViewTemplate $:/tags/EditTemplate",
"text": "\\define lingo-base() $:/language/ClassicWarning/\n<$list filter=\"[all[current]type[text/x-tiddlywiki]]\">\n<div class=\"tc-message-box\">\n\n<<lingo Hint>>\n\n<$button set=\"!!type\" setTo=\"text/vnd.tiddlywiki\"><<lingo Upgrade/Caption>></$button>\n\n</div>\n</$list>\n"
},
"$:/core/ui/ViewTemplate/import": {
"title": "$:/core/ui/ViewTemplate/import",
"tags": "$:/tags/ViewTemplate",
"text": "\\define lingo-base() $:/language/Import/\n\n\\define buttons()\n<$button message=\"tm-delete-tiddler\" param=<<currentTiddler>>><<lingo Listing/Cancel/Caption>></$button>\n<$button message=\"tm-perform-import\" param=<<currentTiddler>>><<lingo Listing/Import/Caption>></$button>\n<<lingo Listing/Preview>> <$select tiddler=\"$:/state/importpreviewtype\" default=\"$:/core/ui/ImportPreviews/Text\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ImportPreview]!has[draft.of]]\">\n<option value=<<currentTiddler>>>{{!!caption}}</option>\n</$list>\n</$select>\n\\end\n\n<$list filter=\"[all[current]field:plugin-type[import]]\">\n\n<div class=\"tc-import\">\n\n<<lingo Listing/Hint>>\n\n<<buttons>>\n\n{{||$:/core/ui/ImportListing}}\n\n<<buttons>>\n\n</div>\n\n</$list>\n"
},
"$:/core/ui/ViewTemplate/plugin": {
"title": "$:/core/ui/ViewTemplate/plugin",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal tag=\"div\" class=\"tc-tiddler-plugin-info\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" retain=\"yes\" animate=\"yes\">\n\n<$list filter=\"[all[current]has[plugin-type]] -[all[current]field:plugin-type[import]]\">\n<$set name=\"plugin-type\" value={{!!plugin-type}}>\n<$set name=\"default-popup-state\" value=\"yes\">\n<$set name=\"qualified-state\" value=<<qualify \"$:/state/plugin-info\">>>\n{{||$:/core/ui/Components/plugin-info}}\n</$set>\n</$set>\n</$set>\n</$list>\n</$reveal>"
},
"$:/core/ui/ViewTemplate/subtitle": {
"title": "$:/core/ui/ViewTemplate/subtitle",
"tags": "$:/tags/ViewTemplate",
"text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-subtitle\">\n<$link to={{!!modifier}} />\n<$view field=\"modified\" format=\"date\" template={{$:/language/Tiddler/DateFormat}}/>\n</div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/tags": {
"title": "$:/core/ui/ViewTemplate/tags",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" tag=\"div\" retain=\"yes\" animate=\"yes\">\n<div class=\"tc-tags-wrapper\"><$list filter=\"[all[current]tags[]sort[title]]\" template=\"$:/core/ui/TagTemplate\" storyview=\"pop\"/></div>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate/title": {
"title": "$:/core/ui/ViewTemplate/title",
"tags": "$:/tags/ViewTemplate",
"text": "\\whitespace trim\n\\define title-styles()\nfill:$(foregroundColor)$;\n\\end\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<div class=\"tc-tiddler-title\">\n<div class=\"tc-titlebar\">\n<span class=\"tc-tiddler-controls\">\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]\" variable=\"listItem\"><$reveal type=\"nomatch\" state=<<config-title>> text=\"hide\"><$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>\n</span>\n<$set name=\"tv-wikilinks\" value={{$:/config/Tiddlers/TitleLinks}}>\n<$link>\n<$set name=\"foregroundColor\" value={{!!color}}>\n<$list filter=\"[all[current]has[icon]]~[[$:/config/DefaultTiddlerIcon]has[text]]\">\n<span class=\"tc-tiddler-title-icon\" style=<<title-styles>>>\n<$transclude tiddler={{!!icon}}>\n<$transclude tiddler={{$:/config/DefaultTiddlerIcon}}/>\n</$transclude>\n</span>\n</$list>\n</$set>\n<$list filter=\"[all[current]removeprefix[$:/]]\">\n<h2 class=\"tc-title\" title={{$:/language/SystemTiddler/Tooltip}}>\n<span class=\"tc-system-title-prefix\">$:/</span><$text text=<<currentTiddler>>/>\n</h2>\n</$list>\n<$list filter=\"[all[current]!prefix[$:/]]\">\n<h2 class=\"tc-title\">\n<$view field=\"title\"/>\n</h2>\n</$list>\n</$link>\n</$set>\n</div>\n\n<$reveal type=\"nomatch\" text=\"\" default=\"\" state=<<tiddlerInfoState>> class=\"tc-tiddler-info tc-popup-handle\" animate=\"yes\" retain=\"yes\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>> mode=\"block\"/></$list>\n\n</$reveal>\n</div>"
},
"$:/core/ui/ViewTemplate/unfold": {
"title": "$:/core/ui/ViewTemplate/unfold",
"tags": "$:/tags/ViewTemplate",
"text": "<$reveal tag=\"div\" type=\"nomatch\" state=\"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar\" text=\"hide\">\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=\"tc-fold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-up}}\n</$button>\n</$reveal>\n<$reveal tag=\"div\" type=\"nomatch\" stateTitle=<<folded-state>> text=\"show\" default=\"show\" retain=\"yes\" animate=\"yes\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=\"tc-unfold-banner\">\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n{{$:/core/images/chevron-down}}\n</$button>\n</$reveal>\n</$reveal>\n"
},
"$:/core/ui/ViewTemplate": {
"title": "$:/core/ui/ViewTemplate",
"text": "\\define folded-state()\n$:/state/folded/$(currentTiddler)$\n\\end\n\\define cancel-delete-tiddler-actions(message) <$action-sendmessage $message=\"tm-$message$-tiddler\"/>\n\\import [all[shadows+tiddlers]tag[$:/tags/Macro/View]!has[draft.of]]\n<$vars storyTiddler=<<currentTiddler>> tiddlerInfoState=<<qualify \"$:/state/popup/tiddler-info\">>><div data-tiddler-title=<<currentTiddler>> data-tags={{!!tags}} class={{{ tc-tiddler-frame tc-tiddler-view-frame [<currentTiddler>is[tiddler]then[tc-tiddler-exists]] [<currentTiddler>is[missing]!is[shadow]then[tc-tiddler-missing]] [<currentTiddler>is[shadow]then[tc-tiddler-exists tc-tiddler-shadow]] [<currentTiddler>is[shadow]is[tiddler]then[tc-tiddler-overridden-shadow]] [<currentTiddler>is[system]then[tc-tiddler-system]] [{!!class}] [<currentTiddler>tags[]encodeuricomponent[]addprefix[tc-tagged-]] +[join[ ]] }}}><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewTemplate]!has[draft.of]]\" variable=\"listItem\"><$transclude tiddler=<<listItem>>/></$list>\n</div>\n</$vars>\n"
},
"$:/core/ui/Buttons/clone": {
"title": "$:/core/ui/Buttons/clone",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/clone-button}} {{$:/language/Buttons/Clone/Caption}}",
"description": "{{$:/language/Buttons/Clone/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-new-tiddler\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/Clone/Hint}} aria-label={{$:/language/Buttons/Clone/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/clone-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Clone/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close-others": {
"title": "$:/core/ui/Buttons/close-others",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-others-button}} {{$:/language/Buttons/CloseOthers/Caption}}",
"description": "{{$:/language/Buttons/CloseOthers/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-close-other-tiddlers\" param=<<currentTiddler>> tooltip={{$:/language/Buttons/CloseOthers/Hint}} aria-label={{$:/language/Buttons/CloseOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/CloseOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/close": {
"title": "$:/core/ui/Buttons/close",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/close-button}} {{$:/language/Buttons/Close/Caption}}",
"description": "{{$:/language/Buttons/Close/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-close-tiddler\" tooltip={{$:/language/Buttons/Close/Hint}} aria-label={{$:/language/Buttons/Close/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/close-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Close/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/edit": {
"title": "$:/core/ui/Buttons/edit",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/edit-button}} {{$:/language/Buttons/Edit/Caption}}",
"description": "{{$:/language/Buttons/Edit/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-edit-tiddler\" tooltip={{$:/language/Buttons/Edit/Hint}} aria-label={{$:/language/Buttons/Edit/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/edit-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Edit/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/export-tiddler": {
"title": "$:/core/ui/Buttons/export-tiddler",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/export-button}} {{$:/language/Buttons/ExportTiddler/Caption}}",
"description": "{{$:/language/Buttons/ExportTiddler/Hint}}",
"text": "\\define makeExportFilter()\n[[$(currentTiddler)$]]\n\\end\n<$macrocall $name=\"exportButton\" exportFilter=<<makeExportFilter>> lingoBase=\"$:/language/Buttons/ExportTiddler/\" baseFilename=<<currentTiddler>>/>"
},
"$:/core/ui/Buttons/fold-bar": {
"title": "$:/core/ui/Buttons/fold-bar",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/chevron-up}} {{$:/language/Buttons/Fold/FoldBar/Caption}}",
"description": "{{$:/language/Buttons/Fold/FoldBar/Hint}}",
"text": "<!-- This dummy toolbar button is here to allow visibility of the fold-bar to be controlled as if it were a toolbar button -->"
},
"$:/core/ui/Buttons/fold-others": {
"title": "$:/core/ui/Buttons/fold-others",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/fold-others-button}} {{$:/language/Buttons/FoldOthers/Caption}}",
"description": "{{$:/language/Buttons/FoldOthers/Hint}}",
"text": "\\whitespace trim\n<$button tooltip={{$:/language/Buttons/FoldOthers/Hint}} aria-label={{$:/language/Buttons/FoldOthers/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-other-tiddlers\" $param=<<currentTiddler>> foldedStatePrefix=\"$:/state/folded/\"/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-others-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/FoldOthers/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/fold": {
"title": "$:/core/ui/Buttons/fold",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/fold-button}} {{$:/language/Buttons/Fold/Caption}}",
"description": "{{$:/language/Buttons/Fold/Hint}}",
"text": "\\whitespace trim\n<$reveal type=\"nomatch\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Fold/Hint}} aria-label={{$:/language/Buttons/Fold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/fold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Fold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<folded-state>> text=\"hide\" default=\"show\">\n<$button tooltip={{$:/language/Buttons/Unfold/Hint}} aria-label={{$:/language/Buttons/Unfold/Caption}} class=<<tv-config-toolbar-class>>>\n<$action-sendmessage $message=\"tm-fold-tiddler\" $param=<<currentTiddler>> foldedState=<<folded-state>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\" variable=\"listItem\">\n{{$:/core/images/unfold-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Unfold/Caption}}/>\n</span>\n</$list>\n</$button>\n</$reveal>\n"
},
"$:/core/ui/Buttons/info": {
"title": "$:/core/ui/Buttons/info",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/info-button}} {{$:/language/Buttons/Info/Caption}}",
"description": "{{$:/language/Buttons/Info/Hint}}",
"text": "\\whitespace trim\n\\define button-content()\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/info-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/Info/Caption}}/>\n</span>\n</$list>\n\\end\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"popup\">\n<$button popup=<<tiddlerInfoState>> tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=\"$:/config/TiddlerInfo/Mode\" type=\"match\" text=\"sticky\">\n<$reveal state=<<tiddlerInfoState>> type=\"match\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"yes\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n<$reveal state=<<tiddlerInfoState>> type=\"nomatch\" text=\"\" default=\"\">\n<$button set=<<tiddlerInfoState>> setTo=\"\" tooltip={{$:/language/Buttons/Info/Hint}} aria-label={{$:/language/Buttons/Info/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$macrocall $name=\"button-content\" mode=\"inline\"/>\n</$button>\n</$reveal>\n</$reveal>"
},
"$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/core/ui/Buttons/more-tiddler-actions",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/down-arrow}} {{$:/language/Buttons/More/Caption}}",
"description": "{{$:/language/Buttons/More/Hint}}",
"text": "\\whitespace trim\n\\define config-title()\n$:/config/ViewToolbarButtons/Visibility/$(listItem)$\n\\end\n<$button popup=<<qualify \"$:/state/popup/more\">> tooltip={{$:/language/Buttons/More/Hint}} aria-label={{$:/language/Buttons/More/Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/down-arrow}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/More/Caption}}/>\n</span>\n</$list>\n</$button>\n<$reveal state=<<qualify \"$:/state/popup/more\">> type=\"popup\" position=\"belowleft\" animate=\"yes\">\n\n<div class=\"tc-drop-down\">\n\n<$set name=\"tv-config-toolbar-icons\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-text\" value=\"yes\">\n\n<$set name=\"tv-config-toolbar-class\" value=\"tc-btn-invisible\">\n\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]] -[[$:/core/ui/Buttons/more-tiddler-actions]]\" variable=\"listItem\">\n\n<$reveal type=\"match\" state=<<config-title>> text=\"hide\">\n\n<$set name=\"tv-config-toolbar-class\" filter=\"[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]\">\n\n<$transclude tiddler=<<listItem>> mode=\"inline\"/>\n\n</$set>\n\n</$reveal>\n\n</$list>\n\n</$set>\n\n</$set>\n\n</$set>\n\n</div>\n\n</$reveal>"
},
"$:/core/ui/Buttons/new-here": {
"title": "$:/core/ui/Buttons/new-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-here-button}} {{$:/language/Buttons/NewHere/Caption}}",
"description": "{{$:/language/Buttons/NewHere/Hint}}",
"text": "\\whitespace trim\n\\define newHereActions()\n<$set name=\"tags\" filter=\"[<currentTiddler>] [{$:/config/NewTiddler/Tags}]\">\n<$action-sendmessage $message=\"tm-new-tiddler\" tags=<<tags>>/>\n</$set>\n\\end\n\\define newHereButton()\n<$button actions=<<newHereActions>> tooltip={{$:/language/Buttons/NewHere/Hint}} aria-label={{$:/language/Buttons/NewHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-here-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewHere/Caption}}/>\n</span>\n</$list>\n</$button>\n\\end\n<<newHereButton>>\n"
},
"$:/core/ui/Buttons/new-journal-here": {
"title": "$:/core/ui/Buttons/new-journal-here",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/new-journal-button}} {{$:/language/Buttons/NewJournalHere/Caption}}",
"description": "{{$:/language/Buttons/NewJournalHere/Hint}}",
"text": "\\whitespace trim\n\\define journalButtonTags()\n[[$(currentTiddlerTag)$]] $(journalTags)$\n\\end\n\\define journalButton()\n<$button tooltip={{$:/language/Buttons/NewJournalHere/Hint}} aria-label={{$:/language/Buttons/NewJournalHere/Caption}} class=<<tv-config-toolbar-class>>>\n<$wikify name=\"journalTitle\" text=\"\"\"<$macrocall $name=\"now\" format=<<journalTitleTemplate>>/>\"\"\">\n<$action-sendmessage $message=\"tm-new-tiddler\" title=<<journalTitle>> tags=<<journalButtonTags>>/>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/new-journal-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text={{$:/language/Buttons/NewJournalHere/Caption}}/>\n</span>\n</$list>\n</$wikify>\n</$button>\n\\end\n<$set name=\"journalTitleTemplate\" value={{$:/config/NewJournal/Title}}>\n<$set name=\"journalTags\" value={{$:/config/NewJournal/Tags}}>\n<$set name=\"currentTiddlerTag\" value=<<currentTiddler>>>\n<<journalButton>>\n</$set>\n</$set>\n</$set>\n"
},
"$:/core/ui/Buttons/open-window": {
"title": "$:/core/ui/Buttons/open-window",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/open-window}} {{$:/language/Buttons/OpenWindow/Caption}}",
"description": "{{$:/language/Buttons/OpenWindow/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-open-window\" tooltip={{$:/language/Buttons/OpenWindow/Hint}} aria-label={{$:/language/Buttons/OpenWindow/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/open-window}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/OpenWindow/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/permalink": {
"title": "$:/core/ui/Buttons/permalink",
"tags": "$:/tags/ViewToolbar",
"caption": "{{$:/core/images/permalink-button}} {{$:/language/Buttons/Permalink/Caption}}",
"description": "{{$:/language/Buttons/Permalink/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-permalink\" tooltip={{$:/language/Buttons/Permalink/Hint}} aria-label={{$:/language/Buttons/Permalink/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permalink-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permalink/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/core/ui/Buttons/permaview": {
"title": "$:/core/ui/Buttons/permaview",
"tags": "$:/tags/ViewToolbar $:/tags/PageControls",
"caption": "{{$:/core/images/permaview-button}} {{$:/language/Buttons/Permaview/Caption}}",
"description": "{{$:/language/Buttons/Permaview/Hint}}",
"text": "\\whitespace trim\n<$button message=\"tm-permaview\" tooltip={{$:/language/Buttons/Permaview/Hint}} aria-label={{$:/language/Buttons/Permaview/Caption}} class=<<tv-config-toolbar-class>>>\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/permaview-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\">\n<$text text=\" \"/>\n<$text text={{$:/language/Buttons/Permaview/Caption}}/>\n</span>\n</$list>\n</$button>"
},
"$:/temp/advancedsearch": {
"title": "$:/temp/advancedsearch",
"text": ""
},
"$:/snippets/allfields": {
"title": "$:/snippets/allfields",
"text": "\\define renderfield(title)\n<tr class=\"tc-view-field\"><td class=\"tc-view-field-name\">''$title$'':</td><td class=\"tc-view-field-value\">//{{$:/language/Docs/Fields/$title$}}//</td></tr>\n\\end\n<table class=\"tc-view-field-table\"><tbody><$list filter=\"[fields[]sort[title]]\" variable=\"listItem\"><$macrocall $name=\"renderfield\" title=<<listItem>>/></$list>\n</tbody></table>\n"
},
"$:/config/AnimationDuration": {
"title": "$:/config/AnimationDuration",
"text": "400"
},
"$:/config/AutoFocus": {
"title": "$:/config/AutoFocus",
"text": "title"
},
"$:/config/AutoSave": {
"title": "$:/config/AutoSave",
"text": "yes"
},
"$:/config/BitmapEditor/Colour": {
"title": "$:/config/BitmapEditor/Colour",
"text": "#444"
},
"$:/config/BitmapEditor/ImageSizes": {
"title": "$:/config/BitmapEditor/ImageSizes",
"text": "[[62px 100px]] [[100px 62px]] [[124px 200px]] [[200px 124px]] [[248px 400px]] [[371px 600px]] [[400px 248px]] [[556px 900px]] [[600px 371px]] [[742px 1200px]] [[900px 556px]] [[1200px 742px]]"
},
"$:/config/BitmapEditor/LineWidth": {
"title": "$:/config/BitmapEditor/LineWidth",
"text": "3px"
},
"$:/config/BitmapEditor/LineWidths": {
"title": "$:/config/BitmapEditor/LineWidths",
"text": "0.25px 0.5px 1px 2px 3px 4px 6px 8px 10px 16px 20px 28px 40px 56px 80px"
},
"$:/config/BitmapEditor/Opacities": {
"title": "$:/config/BitmapEditor/Opacities",
"text": "0.01 0.025 0.05 0.075 0.1 0.15 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0"
},
"$:/config/BitmapEditor/Opacity": {
"title": "$:/config/BitmapEditor/Opacity",
"text": "1.0"
},
"$:/config/DefaultMoreSidebarTab": {
"title": "$:/config/DefaultMoreSidebarTab",
"text": "$:/core/ui/MoreSideBar/Tags"
},
"$:/config/DefaultSidebarTab": {
"title": "$:/config/DefaultSidebarTab",
"text": "$:/core/ui/SideBar/Open"
},
"$:/config/DownloadSaver/AutoSave": {
"title": "$:/config/DownloadSaver/AutoSave",
"text": "no"
},
"$:/config/Drafts/TypingTimeout": {
"title": "$:/config/Drafts/TypingTimeout",
"text": "400"
},
"$:/config/EditMode/fieldname-filter": {
"title": "$:/config/EditMode/fieldname-filter",
"first-search-filter": "[!is[shadow]!is[system]fields[]search:title<userInput>sort[]] -created -creator -draft.of -draft.title -modified -modifier -tags -text -title -type",
"second-search-filter": "[fields[]search:title<userInput>sort[]] -[!is[shadow]!is[system]fields[]]"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-4",
"text": "hide"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-5",
"text": "hide"
},
"$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6": {
"title": "$:/config/EditorToolbarButtons/Visibility/$:/core/ui/EditorToolbar/heading-6",
"text": "hide"
},
"$:/config/EditorTypeMappings/image/gif": {
"title": "$:/config/EditorTypeMappings/image/gif",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/webp": {
"title": "$:/config/EditorTypeMappings/image/webp",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/heic": {
"title": "$:/config/EditorTypeMappings/image/heic",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/heif": {
"title": "$:/config/EditorTypeMappings/image/heif",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpeg": {
"title": "$:/config/EditorTypeMappings/image/jpeg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/jpg": {
"title": "$:/config/EditorTypeMappings/image/jpg",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/png": {
"title": "$:/config/EditorTypeMappings/image/png",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/image/x-icon": {
"title": "$:/config/EditorTypeMappings/image/x-icon",
"text": "bitmap"
},
"$:/config/EditorTypeMappings/text/vnd.tiddlywiki": {
"title": "$:/config/EditorTypeMappings/text/vnd.tiddlywiki",
"text": "text"
},
"$:/config/EditTabIndex": {
"title": "$:/config/EditTabIndex",
"text": "1\n"
},
"$:/config/EditTemplateFields/Visibility/title": {
"title": "$:/config/EditTemplateFields/Visibility/title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/tags": {
"title": "$:/config/EditTemplateFields/Visibility/tags",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/text": {
"title": "$:/config/EditTemplateFields/Visibility/text",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/creator": {
"title": "$:/config/EditTemplateFields/Visibility/creator",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/created": {
"title": "$:/config/EditTemplateFields/Visibility/created",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modified": {
"title": "$:/config/EditTemplateFields/Visibility/modified",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/modifier": {
"title": "$:/config/EditTemplateFields/Visibility/modifier",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/type": {
"title": "$:/config/EditTemplateFields/Visibility/type",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.title": {
"title": "$:/config/EditTemplateFields/Visibility/draft.title",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/draft.of": {
"title": "$:/config/EditTemplateFields/Visibility/draft.of",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/revision": {
"title": "$:/config/EditTemplateFields/Visibility/revision",
"text": "hide"
},
"$:/config/EditTemplateFields/Visibility/bag": {
"title": "$:/config/EditTemplateFields/Visibility/bag",
"text": "hide"
},
"$:/config/Manager/Show": {
"title": "$:/config/Manager/Show",
"text": "tiddlers"
},
"$:/config/Manager/Filter": {
"title": "$:/config/Manager/Filter",
"text": ""
},
"$:/config/Manager/Order": {
"title": "$:/config/Manager/Order",
"text": "forward"
},
"$:/config/Manager/Sort": {
"title": "$:/config/Manager/Sort",
"text": "title"
},
"$:/config/Manager/System": {
"title": "$:/config/Manager/System",
"text": "system"
},
"$:/config/Manager/Tag": {
"title": "$:/config/Manager/Tag",
"text": ""
},
"$:/state/popup/manager/item/$:/Manager/ItemMain/RawText": {
"title": "$:/state/popup/manager/item/$:/Manager/ItemMain/RawText",
"text": "hide"
},
"$:/config/MissingLinks": {
"title": "$:/config/MissingLinks",
"text": "yes"
},
"$:/config/Navigation/UpdateAddressBar": {
"title": "$:/config/Navigation/UpdateAddressBar",
"text": "no"
},
"$:/config/Navigation/UpdateHistory": {
"title": "$:/config/Navigation/UpdateHistory",
"text": "no"
},
"$:/config/NewImageType": {
"title": "$:/config/NewImageType",
"text": "jpeg"
},
"$:/config/OfficialPluginLibrary": {
"title": "$:/config/OfficialPluginLibrary",
"tags": "$:/tags/PluginLibrary",
"url": "https://tiddlywiki.com/library/v5.1.23/index.html",
"caption": "{{$:/language/OfficialPluginLibrary}}",
"text": "{{$:/language/OfficialPluginLibrary/Hint}}\n"
},
"$:/config/Navigation/openLinkFromInsideRiver": {
"title": "$:/config/Navigation/openLinkFromInsideRiver",
"text": "below"
},
"$:/config/Navigation/openLinkFromOutsideRiver": {
"title": "$:/config/Navigation/openLinkFromOutsideRiver",
"text": "top"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/advanced-search",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/close-all",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/encryption",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/export-page",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/fold-all",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/full-screen",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/home",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/refresh",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/import",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/language",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/tag-manager",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/manager",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/more-page-actions",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-journal",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/new-image",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/palette",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/print",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/storyview",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/timestamp",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/theme",
"text": "hide"
},
"$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all": {
"title": "$:/config/PageControlButtons/Visibility/$:/core/ui/Buttons/unfold-all",
"text": "hide"
},
"$:/config/Performance/Instrumentation": {
"title": "$:/config/Performance/Instrumentation",
"text": "no"
},
"$:/config/RegisterPluginType/plugin": {
"title": "$:/config/RegisterPluginType/plugin",
"text": "yes"
},
"$:/config/RegisterPluginType/theme": {
"title": "$:/config/RegisterPluginType/theme",
"text": "no"
},
"$:/config/RegisterPluginType/language": {
"title": "$:/config/RegisterPluginType/language",
"text": "no"
},
"$:/config/RegisterPluginType/info": {
"title": "$:/config/RegisterPluginType/info",
"text": "yes"
},
"$:/config/RegisterPluginType/import": {
"title": "$:/config/RegisterPluginType/import",
"text": "no"
},
"$:/config/SaverFilter": {
"title": "$:/config/SaverFilter",
"text": "[all[]] -[prefix[$:/HistoryList]] -[prefix[$:/StoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[[$:/UploadName]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n"
},
"$:/config/SaveWikiButton/Template": {
"title": "$:/config/SaveWikiButton/Template",
"text": "$:/core/save/all"
},
"$:/config/Search/AutoFocus": {
"title": "$:/config/Search/AutoFocus",
"text": "true"
},
"$:/config/Search/MinLength": {
"title": "$:/config/Search/MinLength",
"text": "3"
},
"$:/config/SearchResults/Default": {
"title": "$:/config/SearchResults/Default",
"text": "$:/core/ui/DefaultSearchResultList"
},
"$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]": {
"title": "$:/config/Server/ExternalFilters/[all[tiddlers]!is[system]sort[title]]",
"text": "yes"
},
"$:/config/ShortcutInfo/add-field": {
"title": "$:/config/ShortcutInfo/add-field",
"text": "{{$:/language/EditTemplate/Fields/Add/Button/Hint}}"
},
"$:/config/ShortcutInfo/advanced-search": {
"title": "$:/config/ShortcutInfo/advanced-search",
"text": "{{$:/language/Buttons/AdvancedSearch/Hint}}"
},
"$:/config/ShortcutInfo/advanced-search-sidebar": {
"title": "$:/config/ShortcutInfo/advanced-search-sidebar",
"text": "{{$:/language/Shortcuts/Input/AdvancedSearch/Hint}}"
},
"$:/config/ShortcutInfo/bold": {
"title": "$:/config/ShortcutInfo/bold",
"text": "{{$:/language/Buttons/Bold/Hint}}"
},
"$:/config/ShortcutInfo/cancel-edit-tiddler": {
"title": "$:/config/ShortcutInfo/cancel-edit-tiddler",
"text": "{{$:/language/Buttons/Cancel/Hint}}"
},
"$:/config/ShortcutInfo/change-sidebar-layout": {
"title": "$:/config/ShortcutInfo/change-sidebar-layout",
"text": "{{$:/language/Shortcuts/SidebarLayout/Hint}}"
},
"$:/config/ShortcutInfo/delete-field": {
"title": "$:/config/ShortcutInfo/delete-field",
"text": "{{$:/language/EditTemplate/Field/Remove/Hint}}"
},
"$:/config/ShortcutInfo/excise": {
"title": "$:/config/ShortcutInfo/excise",
"text": "{{$:/language/Buttons/Excise/Hint}}"
},
"$:/config/ShortcutInfo/heading-1": {
"title": "$:/config/ShortcutInfo/heading-1",
"text": "{{$:/language/Buttons/Heading1/Hint}}"
},
"$:/config/ShortcutInfo/heading-2": {
"title": "$:/config/ShortcutInfo/heading-2",
"text": "{{$:/language/Buttons/Heading2/Hint}}"
},
"$:/config/ShortcutInfo/heading-3": {
"title": "$:/config/ShortcutInfo/heading-3",
"text": "{{$:/language/Buttons/Heading3/Hint}}"
},
"$:/config/ShortcutInfo/heading-4": {
"title": "$:/config/ShortcutInfo/heading-4",
"text": "{{$:/language/Buttons/Heading4/Hint}}"
},
"$:/config/ShortcutInfo/heading-5": {
"title": "$:/config/ShortcutInfo/heading-5",
"text": "{{$:/language/Buttons/Heading5/Hint}}"
},
"$:/config/ShortcutInfo/heading-6": {
"title": "$:/config/ShortcutInfo/heading-6",
"text": "{{$:/language/Buttons/Heading6/Hint}}"
},
"$:/config/ShortcutInfo/input-accept": {
"title": "$:/config/ShortcutInfo/input-accept",
"text": "{{$:/language/Shortcuts/Input/Accept/Hint}}"
},
"$:/config/ShortcutInfo/input-accept-variant": {
"title": "$:/config/ShortcutInfo/input-accept-variant",
"text": "{{$:/language/Shortcuts/Input/AcceptVariant/Hint}}"
},
"$:/config/ShortcutInfo/input-cancel": {
"title": "$:/config/ShortcutInfo/input-cancel",
"text": "{{$:/language/Shortcuts/Input/Cancel/Hint}}"
},
"$:/config/ShortcutInfo/input-down": {
"title": "$:/config/ShortcutInfo/input-down",
"text": "{{$:/language/Shortcuts/Input/Down/Hint}}"
},
"$:/config/ShortcutInfo/input-tab-left": {
"title": "$:/config/ShortcutInfo/input-tab-left",
"text": "{{$:/language/Shortcuts/Input/Tab-Left/Hint}}"
},
"$:/config/ShortcutInfo/input-tab-right": {
"title": "$:/config/ShortcutInfo/input-tab-right",
"text": "{{$:/language/Shortcuts/Input/Tab-Right/Hint}}"
},
"$:/config/ShortcutInfo/input-up": {
"title": "$:/config/ShortcutInfo/input-up",
"text": "{{$:/language/Shortcuts/Input/Up/Hint}}"
},
"$:/config/ShortcutInfo/italic": {
"title": "$:/config/ShortcutInfo/italic",
"text": "{{$:/language/Buttons/Italic/Hint}}"
},
"$:/config/ShortcutInfo/layout-switcher": {
"title": "$:/config/ShortcutInfo/layout-switcher",
"text": "{{$:/language/LayoutSwitcher/Description}}"
},
"$:/config/ShortcutInfo/link": {
"title": "$:/config/ShortcutInfo/link",
"text": "{{$:/language/Buttons/Link/Hint}}"
},
"$:/config/ShortcutInfo/linkify": {
"title": "$:/config/ShortcutInfo/linkify",
"text": "{{$:/language/Buttons/Linkify/Hint}}"
},
"$:/config/ShortcutInfo/list-bullet": {
"title": "$:/config/ShortcutInfo/list-bullet",
"text": "{{$:/language/Buttons/ListBullet/Hint}}"
},
"$:/config/ShortcutInfo/list-number": {
"title": "$:/config/ShortcutInfo/list-number",
"text": "{{$:/language/Buttons/ListNumber/Hint}}"
},
"$:/config/ShortcutInfo/mono-block": {
"title": "$:/config/ShortcutInfo/mono-block",
"text": "{{$:/language/Buttons/MonoBlock/Hint}}"
},
"$:/config/ShortcutInfo/mono-line": {
"title": "$:/config/ShortcutInfo/mono-line",
"text": "{{$:/language/Buttons/MonoLine/Hint}}"
},
"$:/config/ShortcutInfo/new-image": {
"title": "$:/config/ShortcutInfo/new-image",
"text": "{{$:/language/Buttons/NewImage/Hint}}"
},
"$:/config/ShortcutInfo/new-journal": {
"title": "$:/config/ShortcutInfo/new-journal",
"text": "{{$:/language/Buttons/NewJournal/Hint}}"
},
"$:/config/ShortcutInfo/new-tiddler": {
"title": "$:/config/ShortcutInfo/new-tiddler",
"text": "{{$:/language/Buttons/NewTiddler/Hint}}"
},
"$:/config/ShortcutInfo/picture": {
"title": "$:/config/ShortcutInfo/picture",
"text": "{{$:/language/Buttons/Picture/Hint}}"
},
"$:/config/ShortcutInfo/preview": {
"title": "$:/config/ShortcutInfo/preview",
"text": "{{$:/language/Buttons/Preview/Hint}}"
},
"$:/config/ShortcutInfo/quote": {
"title": "$:/config/ShortcutInfo/quote",
"text": "{{$:/language/Buttons/Quote/Hint}}"
},
"$:/config/ShortcutInfo/save-tiddler": {
"title": "$:/config/ShortcutInfo/save-tiddler",
"text": "{{$:/language/Buttons/Save/Hint}}"
},
"$:/config/ShortcutInfo/save-wiki": {
"title": "$:/config/ShortcutInfo/save-wiki",
"text": "{{$:/language/Buttons/SaveWiki/Hint}}"
},
"$:/config/ShortcutInfo/sidebar-search": {
"title": "$:/config/ShortcutInfo/sidebar-search",
"text": "{{$:/language/Buttons/SidebarSearch/Hint}}"
},
"$:/config/ShortcutInfo/stamp": {
"title": "$:/config/ShortcutInfo/stamp",
"text": "{{$:/language/Buttons/Stamp/Hint}}"
},
"$:/config/ShortcutInfo/strikethrough": {
"title": "$:/config/ShortcutInfo/strikethrough",
"text": "{{$:/language/Buttons/Strikethrough/Hint}}"
},
"$:/config/ShortcutInfo/subscript": {
"title": "$:/config/ShortcutInfo/subscript",
"text": "{{$:/language/Buttons/Subscript/Hint}}"
},
"$:/config/ShortcutInfo/superscript": {
"title": "$:/config/ShortcutInfo/superscript",
"text": "{{$:/language/Buttons/Superscript/Hint}}"
},
"$:/config/ShortcutInfo/toggle-sidebar": {
"title": "$:/config/ShortcutInfo/toggle-sidebar",
"text": "{{$:/language/Buttons/ToggleSidebar/Hint}}"
},
"$:/config/ShortcutInfo/transcludify": {
"title": "$:/config/ShortcutInfo/transcludify",
"text": "{{$:/language/Buttons/Transcludify/Hint}}"
},
"$:/config/ShortcutInfo/underline": {
"title": "$:/config/ShortcutInfo/underline",
"text": "{{$:/language/Buttons/Underline/Hint}}"
},
"$:/config/shortcuts-mac/bold": {
"title": "$:/config/shortcuts-mac/bold",
"text": "meta-B"
},
"$:/config/shortcuts-mac/input-tab-left": {
"title": "$:/config/shortcuts-mac/input-tab-left",
"text": "ctrl-Left"
},
"$:/config/shortcuts-mac/input-tab-right": {
"title": "$:/config/shortcuts-mac/input-tab-right",
"text": "ctrl-Right"
},
"$:/config/shortcuts-mac/italic": {
"title": "$:/config/shortcuts-mac/italic",
"text": "meta-I"
},
"$:/config/shortcuts-mac/underline": {
"title": "$:/config/shortcuts-mac/underline",
"text": "meta-U"
},
"$:/config/shortcuts-mac/new-image": {
"title": "$:/config/shortcuts-mac/new-image",
"text": "ctrl-I"
},
"$:/config/shortcuts-mac/new-journal": {
"title": "$:/config/shortcuts-mac/new-journal",
"text": "ctrl-J"
},
"$:/config/shortcuts-mac/new-tiddler": {
"title": "$:/config/shortcuts-mac/new-tiddler",
"text": "ctrl-N"
},
"$:/config/shortcuts-mac/save-wiki": {
"title": "$:/config/shortcuts-mac/save-wiki",
"text": "meta-S"
},
"$:/config/shortcuts-not-mac/bold": {
"title": "$:/config/shortcuts-not-mac/bold",
"text": "ctrl-B"
},
"$:/config/shortcuts-not-mac/italic": {
"title": "$:/config/shortcuts-not-mac/italic",
"text": "ctrl-I"
},
"$:/config/shortcuts-not-mac/underline": {
"title": "$:/config/shortcuts-not-mac/underline",
"text": "ctrl-U"
},
"$:/config/shortcuts-not-mac/new-image": {
"title": "$:/config/shortcuts-not-mac/new-image",
"text": "alt-I"
},
"$:/config/shortcuts-not-mac/new-journal": {
"title": "$:/config/shortcuts-not-mac/new-journal",
"text": "alt-J"
},
"$:/config/shortcuts-not-mac/new-tiddler": {
"title": "$:/config/shortcuts-not-mac/new-tiddler",
"text": "alt-N"
},
"$:/config/shortcuts/add-field": {
"title": "$:/config/shortcuts/add-field",
"text": "enter"
},
"$:/config/shortcuts/advanced-search": {
"title": "$:/config/shortcuts/advanced-search",
"text": "ctrl-shift-A"
},
"$:/config/shortcuts/advanced-search-sidebar": {
"title": "$:/config/shortcuts/advanced-search-sidebar",
"text": "alt-Enter"
},
"$:/config/shortcuts/cancel-edit-tiddler": {
"title": "$:/config/shortcuts/cancel-edit-tiddler",
"text": "escape"
},
"$:/config/shortcuts/change-sidebar-layout": {
"title": "$:/config/shortcuts/change-sidebar-layout",
"text": "shift-alt-Down"
},
"$:/config/shortcuts/delete-field": {
"title": "$:/config/shortcuts/delete-field",
"text": "shift-alt-D"
},
"$:/config/shortcuts/excise": {
"title": "$:/config/shortcuts/excise",
"text": "ctrl-E"
},
"$:/config/shortcuts/sidebar-search": {
"title": "$:/config/shortcuts/sidebar-search",
"text": "ctrl-shift-F"
},
"$:/config/shortcuts/heading-1": {
"title": "$:/config/shortcuts/heading-1",
"text": "ctrl-1"
},
"$:/config/shortcuts/heading-2": {
"title": "$:/config/shortcuts/heading-2",
"text": "ctrl-2"
},
"$:/config/shortcuts/heading-3": {
"title": "$:/config/shortcuts/heading-3",
"text": "ctrl-3"
},
"$:/config/shortcuts/heading-4": {
"title": "$:/config/shortcuts/heading-4",
"text": "ctrl-4"
},
"$:/config/shortcuts/heading-5": {
"title": "$:/config/shortcuts/heading-5",
"text": "ctrl-5"
},
"$:/config/shortcuts/heading-6": {
"title": "$:/config/shortcuts/heading-6",
"text": "ctrl-6"
},
"$:/config/shortcuts/input-accept": {
"title": "$:/config/shortcuts/input-accept",
"text": "Enter"
},
"$:/config/shortcuts/input-accept-variant": {
"title": "$:/config/shortcuts/input-accept-variant",
"text": "ctrl-Enter"
},
"$:/config/shortcuts/input-cancel": {
"title": "$:/config/shortcuts/input-cancel",
"text": "Escape"
},
"$:/config/shortcuts/input-down": {
"title": "$:/config/shortcuts/input-down",
"text": "Down"
},
"$:/config/shortcuts/input-tab-left": {
"title": "$:/config/shortcuts/input-tab-left",
"text": "alt-Left"
},
"$:/config/shortcuts/input-tab-right": {
"title": "$:/config/shortcuts/input-tab-right",
"text": "alt-Right"
},
"$:/config/shortcuts/input-up": {
"title": "$:/config/shortcuts/input-up",
"text": "Up"
},
"$:/config/shortcuts/layout-switcher": {
"title": "$:/config/shortcuts/layout-switcher",
"text": "ctrl-shift-L"
},
"$:/config/shortcuts/link": {
"title": "$:/config/shortcuts/link",
"text": "ctrl-L"
},
"$:/config/shortcuts/linkify": {
"title": "$:/config/shortcuts/linkify",
"text": "alt-shift-L"
},
"$:/config/shortcuts/list-bullet": {
"title": "$:/config/shortcuts/list-bullet",
"text": "ctrl-shift-L"
},
"$:/config/shortcuts/list-number": {
"title": "$:/config/shortcuts/list-number",
"text": "ctrl-shift-N"
},
"$:/config/shortcuts/mono-block": {
"title": "$:/config/shortcuts/mono-block",
"text": "ctrl-shift-M"
},
"$:/config/shortcuts/mono-line": {
"title": "$:/config/shortcuts/mono-line",
"text": "ctrl-M"
},
"$:/config/shortcuts/picture": {
"title": "$:/config/shortcuts/picture",
"text": "ctrl-shift-I"
},
"$:/config/shortcuts/preview": {
"title": "$:/config/shortcuts/preview",
"text": "alt-P"
},
"$:/config/shortcuts/quote": {
"title": "$:/config/shortcuts/quote",
"text": "ctrl-Q"
},
"$:/config/shortcuts/save-tiddler": {
"title": "$:/config/shortcuts/save-tiddler",
"text": "ctrl+enter"
},
"$:/config/shortcuts/save-wiki": {
"title": "$:/config/shortcuts/save-wiki",
"text": "ctrl-S"
},
"$:/config/shortcuts/stamp": {
"title": "$:/config/shortcuts/stamp",
"text": "ctrl-S"
},
"$:/config/shortcuts/strikethrough": {
"title": "$:/config/shortcuts/strikethrough",
"text": "ctrl-T"
},
"$:/config/shortcuts/subscript": {
"title": "$:/config/shortcuts/subscript",
"text": "ctrl-shift-B"
},
"$:/config/shortcuts/superscript": {
"title": "$:/config/shortcuts/superscript",
"text": "ctrl-shift-P"
},
"$:/config/shortcuts/toggle-sidebar": {
"title": "$:/config/shortcuts/toggle-sidebar",
"text": "alt-shift-S"
},
"$:/config/shortcuts/transcludify": {
"title": "$:/config/shortcuts/transcludify",
"text": "alt-shift-T"
},
"$:/config/SwitcherTargets/layout": {
"title": "$:/config/SwitcherTargets/layout",
"text": "$:/snippets/LayoutSwitcher"
},
"$:/config/SwitcherTargets/language": {
"title": "$:/config/SwitcherTargets/language",
"text": "$:/snippets/languageswitcher"
},
"$:/config/SwitcherTargets/palette": {
"title": "$:/config/SwitcherTargets/palette",
"text": "$:/core/ui/ControlPanel/Palette"
},
"$:/config/SwitcherTargets/theme": {
"title": "$:/config/SwitcherTargets/theme",
"text": "$:/core/ui/ControlPanel/Theme"
},
"$:/config/SyncFilter": {
"title": "$:/config/SyncFilter",
"text": "[is[tiddler]] -[[$:/core]] -[[$:/library/sjcl.js]] -[prefix[$:/boot/]] -[prefix[$:/HistoryList]] -[status[pending]plugin-type[import]] -[[$:/isEncrypted]] -[prefix[$:/status/]] -[prefix[$:/state/]] -[prefix[$:/temp/]]\n"
},
"$:/config/SyncSystemTiddlersFromServer": {
"title": "$:/config/SyncSystemTiddlersFromServer",
"text": "no"
},
"$:/config/Tags/MinLength": {
"title": "$:/config/Tags/MinLength",
"text": "0"
},
"$:/config/TextEditor/EditorHeight/Height": {
"title": "$:/config/TextEditor/EditorHeight/Height",
"text": "400px"
},
"$:/config/TextEditor/EditorHeight/Mode": {
"title": "$:/config/TextEditor/EditorHeight/Mode",
"text": "auto"
},
"$:/config/TiddlerInfo/Default": {
"title": "$:/config/TiddlerInfo/Default",
"text": "$:/core/ui/TiddlerInfo/Fields"
},
"$:/config/TiddlerInfo/Mode": {
"title": "$:/config/TiddlerInfo/Mode",
"text": "popup"
},
"$:/config/Tiddlers/TitleLinks": {
"title": "$:/config/Tiddlers/TitleLinks",
"text": "no"
},
"$:/config/Toolbar/ButtonClass": {
"title": "$:/config/Toolbar/ButtonClass",
"text": "tc-btn-invisible"
},
"$:/config/Toolbar/Icons": {
"title": "$:/config/Toolbar/Icons",
"text": "yes"
},
"$:/config/Toolbar/Text": {
"title": "$:/config/Toolbar/Text",
"text": "no"
},
"$:/config/ui/EditTemplate": {
"title": "$:/config/ui/EditTemplate",
"text": "$:/core/ui/EditTemplate"
},
"$:/config/ui/ViewTemplate": {
"title": "$:/config/ui/ViewTemplate",
"text": "$:/core/ui/ViewTemplate"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/clone",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/close-others",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/export-tiddler",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/info",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/more-tiddler-actions",
"text": "show"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-here",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/new-journal-here",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/open-window",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permalink",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/permaview",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/delete",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-bar",
"text": "hide"
},
"$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others": {
"title": "$:/config/ViewToolbarButtons/Visibility/$:/core/ui/Buttons/fold-others",
"text": "hide"
},
"$:/config/WikiParserRules/Inline/wikilink": {
"title": "$:/config/WikiParserRules/Inline/wikilink",
"text": "enable"
},
"$:/snippets/currpalettepreview": {
"title": "$:/snippets/currpalettepreview",
"text": "\\define resolve-colour(macrocall)\n\\import $:/core/macros/utils\n\\whitespace trim\n<$wikify name=\"name\" text=\"\"\"$macrocall$\"\"\">\n<<name>>\n</$wikify>\n\\end\n\\define swatchStyle()\nbackground-color: $(swatchColour)$;\n\\end\n\\define swatch-inner()\n<$set name=\"swatchColour\" value={{##$(colourResolved)$}}>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall=<<swatchColour>>/>\"\"\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n\\end\n\\define swatch()\n<$set name=\"swatchColour\" value={{##$(colour)$}}>\n<$set name=\"swatchTitle\" value=<<colour>>>\n<$list filter=\"[<swatchColour>!prefix[<<colour ]!suffix[>>]]\" variable=\"ignore\">\n<div class=\"tc-swatch\" style=<<swatchStyle>> title=<<swatchTitle>>/>\n</$list>\n<$list filter=\"[<swatchColour>prefix[<<colour ]suffix[>>]]\" variable=\"ignore\">\n<$wikify name=\"colourResolved\" text=\"\"\"<$macrocall $name=\"resolve-colour\" macrocall=<<swatchColour>>/>\"\"\">\n<<swatch-inner>>\n</$wikify>\n</$list>\n</$set>\n</$set>\n\\end\n<div class=\"tc-swatches-horiz\"><$list filter=\"\nforeground\nbackground\nmuted-foreground\nprimary\npage-background\ntab-background\ntiddler-info-background\n\" variable=\"colour\"><<swatch>></$list></div>\n"
},
"$:/DefaultTiddlers": {
"title": "$:/DefaultTiddlers",
"text": "GettingStarted\n"
},
"$:/snippets/download-wiki-button": {
"title": "$:/snippets/download-wiki-button",
"text": "\\define lingo-base() $:/language/ControlPanel/Tools/Download/\n<$button class=\"tc-btn-big-green\">\n<$action-sendmessage $message=\"tm-download-file\" $param=\"$:/core/save/all\" filename=\"index.html\"/>\n<<lingo Full/Caption>> {{$:/core/images/save-button}}\n</$button>"
},
"$:/language": {
"title": "$:/language",
"text": "$:/languages/en-GB"
},
"$:/snippets/languageswitcher": {
"title": "$:/snippets/languageswitcher",
"text": "\\define flag-title()\n$(languagePluginTitle)$/icon\n\\end\n\n<$linkcatcher to=\"$:/language\">\n<div class=\"tc-chooser tc-language-chooser\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[description]]\">\n<$set name=\"cls\" filter=\"[all[current]field:title{$:/language}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link>\n<span class=\"tc-image-button\">\n<$set name=\"languagePluginTitle\" value=<<currentTiddler>>>\n<$transclude subtiddler=<<flag-title>>>\n<$list filter=\"[all[current]field:title[$:/languages/en-GB]]\">\n<$transclude tiddler=\"$:/languages/en-GB/icon\"/>\n</$list>\n</$transclude>\n</$set>\n</span>\n<$view field=\"description\">\n<$view field=\"name\">\n<$view field=\"title\"/>\n</$view>\n</$view>\n</$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
},
"$:/core/macros/colour-picker": {
"title": "$:/core/macros/colour-picker",
"tags": "$:/tags/Macro",
"text": "\\define colour-picker-update-recent()\n<$action-listops\n\t$tiddler=\"$:/config/ColourPicker/Recent\"\n\t$subfilter=\"$(colour-picker-value)$ [list[$:/config/ColourPicker/Recent]remove[$(colour-picker-value)$]] +[limit[8]]\"\n/>\n\\end\n\n\\define colour-picker-inner(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(colour-picker-value)$\"\"\">\n\n$(colour-picker-update-recent)$\n\n$actions$\n\n<span style=\"display:inline-block; background-color: $(colour-picker-value)$; width: 100%; height: 100%; border-radius: 50%;\"/>\n\n</$button>\n\\end\n\n\\define colour-picker-recent-inner(actions)\n<$set name=\"colour-picker-value\" value=\"$(recentColour)$\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\\end\n\n\\define colour-picker-recent(actions)\n{{$:/language/ColourPicker/Recent}} <$list filter=\"[list[$:/config/ColourPicker/Recent]]\" variable=\"recentColour\">\n<$macrocall $name=\"colour-picker-recent-inner\" actions=\"\"\"$actions$\"\"\"/></$list>\n\\end\n\n\\define colour-picker(actions)\n<div class=\"tc-colour-chooser\">\n\n<$macrocall $name=\"colour-picker-recent\" actions=\"\"\"$actions$\"\"\"/>\n\n---\n\n<$list filter=\"LightPink Pink Crimson LavenderBlush PaleVioletRed HotPink DeepPink MediumVioletRed Orchid Thistle Plum Violet Magenta Fuchsia DarkMagenta Purple MediumOrchid DarkViolet DarkOrchid Indigo BlueViolet MediumPurple MediumSlateBlue SlateBlue DarkSlateBlue Lavender GhostWhite Blue MediumBlue MidnightBlue DarkBlue Navy RoyalBlue CornflowerBlue LightSteelBlue LightSlateGrey SlateGrey DodgerBlue AliceBlue SteelBlue LightSkyBlue SkyBlue DeepSkyBlue LightBlue PowderBlue CadetBlue Azure LightCyan PaleTurquoise Cyan Aqua DarkTurquoise DarkSlateGrey DarkCyan Teal MediumTurquoise LightSeaGreen Turquoise Aquamarine MediumAquamarine MediumSpringGreen MintCream SpringGreen MediumSeaGreen SeaGreen Honeydew LightGreen PaleGreen DarkSeaGreen LimeGreen Lime ForestGreen Green DarkGreen Chartreuse LawnGreen GreenYellow DarkOliveGreen YellowGreen OliveDrab Beige LightGoldenrodYellow Ivory LightYellow Yellow Olive DarkKhaki LemonChiffon PaleGoldenrod Khaki Gold Cornsilk Goldenrod DarkGoldenrod FloralWhite OldLace Wheat Moccasin Orange PapayaWhip BlanchedAlmond NavajoWhite AntiqueWhite Tan BurlyWood Bisque DarkOrange Linen Peru PeachPuff SandyBrown Chocolate SaddleBrown Seashell Sienna LightSalmon Coral OrangeRed DarkSalmon Tomato MistyRose Salmon Snow LightCoral RosyBrown IndianRed Red Brown FireBrick DarkRed Maroon White WhiteSmoke Gainsboro LightGrey Silver DarkGrey Grey DimGrey Black\" variable=\"colour-picker-value\">\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\n---\n\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" tag=\"input\" default=\"\" placeholder=\"\"/>\n<$edit-text tiddler=\"$:/config/ColourPicker/New\" type=\"color\" tag=\"input\"/>\n<$set name=\"colour-picker-value\" value={{$:/config/ColourPicker/New}}>\n<$macrocall $name=\"colour-picker-inner\" actions=\"\"\"$actions$\"\"\"/>\n</$set>\n\n</div>\n\n\\end\n"
},
"$:/core/macros/copy-to-clipboard": {
"title": "$:/core/macros/copy-to-clipboard",
"tags": "$:/tags/Macro",
"text": "\\define copy-to-clipboard(src,class:\"tc-btn-invisible\",style)\n<$button class=<<__class__>> style=<<__style__>> message=\"tm-copy-to-clipboard\" param=<<__src__>> tooltip={{$:/language/Buttons/CopyToClipboard/Hint}}>\n{{$:/core/images/copy-clipboard}} <$text text={{$:/language/Buttons/CopyToClipboard/Caption}}/>\n</$button>\n\\end\n\n\\define copy-to-clipboard-above-right(src,class:\"tc-btn-invisible\",style)\n<div style=\"position: relative;\">\n<div style=\"position: absolute; bottom: 0; right: 0;\">\n<$macrocall $name=\"copy-to-clipboard\" src=<<__src__>> class=<<__class__>> style=<<__style__>>/>\n</div>\n</div>\n\\end\n\n"
},
"$:/core/macros/CSS": {
"title": "$:/core/macros/CSS",
"tags": "$:/tags/Macro",
"text": "\\define colour(name)\n<$transclude tiddler={{$:/palette}} index=\"$name$\"><$transclude tiddler=\"$:/palettes/Vanilla\" index=\"$name$\"><$transclude tiddler=\"$:/config/DefaultColourMappings/$name$\"/></$transclude></$transclude>\n\\end\n\n\\define color(name)\n<<colour $name$>>\n\\end\n\n\\define box-shadow(shadow)\n``\n -webkit-box-shadow: $shadow$;\n -moz-box-shadow: $shadow$;\n box-shadow: $shadow$;\n``\n\\end\n\n\\define filter(filter)\n``\n -webkit-filter: $filter$;\n -moz-filter: $filter$;\n filter: $filter$;\n``\n\\end\n\n\\define transition(transition)\n``\n -webkit-transition: $transition$;\n -moz-transition: $transition$;\n transition: $transition$;\n``\n\\end\n\n\\define transform-origin(origin)\n``\n -webkit-transform-origin: $origin$;\n -moz-transform-origin: $origin$;\n transform-origin: $origin$;\n``\n\\end\n\n\\define background-linear-gradient(gradient)\n``\nbackground-image: linear-gradient($gradient$);\nbackground-image: -o-linear-gradient($gradient$);\nbackground-image: -moz-linear-gradient($gradient$);\nbackground-image: -webkit-linear-gradient($gradient$);\nbackground-image: -ms-linear-gradient($gradient$);\n``\n\\end\n\n\\define column-count(columns)\n``\n-moz-column-count: $columns$;\n-webkit-column-count: $columns$;\ncolumn-count: $columns$;\n``\n\\end\n\n\\define datauri(title)\n<$macrocall $name=\"makedatauri\" type={{$title$!!type}} text={{$title$}} _canonical_uri={{$title$!!_canonical_uri}}/>\n\\end\n\n\\define if-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"match\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-no-sidebar(text)\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">$text$</$reveal>\n\\end\n\n\\define if-background-attachment(text)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" type=\"nomatch\" text=\"\">$text$</$reveal>\n\\end\n"
},
"$:/core/macros/diff": {
"title": "$:/core/macros/diff",
"tags": "$:/tags/Macro",
"text": "\\define compareTiddlerText(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle)\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>>>\n<$diff-text source=<<source>> dest=<<dest>>/>\n</$set>\n</$set>\n\\end\n\n\\define compareTiddlers(sourceTiddlerTitle,sourceSubTiddlerTitle,destTiddlerTitle,destSubTiddlerTitle,exclude)\n<table class=\"tc-diff-tiddlers\">\n<tbody>\n<$set name=\"sourceFields\" filter=\"[<__sourceTiddlerTitle__>fields[]sort[]]\">\n<$set name=\"destFields\" filter=\"[<__destSubTiddlerTitle__>subtiddlerfields<__destTiddlerTitle__>sort[]]\">\n<$list filter=\"[enlist<sourceFields>] [enlist<destFields>] -[enlist<__exclude__>] +[sort[]]\" variable=\"fieldName\">\n<tr>\n<th>\n<$text text=<<fieldName>>/> \n</th>\n<td>\n<$set name=\"source\" tiddler=<<__sourceTiddlerTitle__>> subtiddler=<<__sourceSubTiddlerTitle__>> field=<<fieldName>>>\n<$set name=\"dest\" tiddler=<<__destTiddlerTitle__>> subtiddler=<<__destSubTiddlerTitle__>> field=<<fieldName>>>\n<$diff-text source=<<source>> dest=<<dest>>>\n</$diff-text>\n</$set>\n</$set>\n</td>\n</tr>\n</$list>\n</$set>\n</$set>\n</tbody>\n</table>\n\\end\n"
},
"$:/core/macros/dumpvariables": {
"title": "$:/core/macros/dumpvariables",
"tags": "$:/tags/Macro",
"text": "\\define dumpvariables()\n<ul>\n<$list filter=\"[variables[]]\" variable=\"varname\">\n<li>\n<strong><code><$text text=<<varname>>/></code></strong>:<br/>\n<$codeblock code={{{ [<varname>getvariable[]] }}}/>\n</li>\n</$list>\n</ul>\n\\end\n"
},
"$:/core/macros/export": {
"title": "$:/core/macros/export",
"tags": "$:/tags/Macro",
"text": "\\define exportButtonFilename(baseFilename)\n$baseFilename$$(extension)$\n\\end\n\n\\define exportButton(exportFilter:\"[!is[system]sort[title]]\",lingoBase,baseFilename:\"tiddlers\")\n<span class=\"tc-popup-keep\"><$button popup=<<qualify \"$:/state/popup/export\">> tooltip={{$lingoBase$Hint}} aria-label={{$lingoBase$Caption}} class=<<tv-config-toolbar-class>> selectedClass=\"tc-selected\">\n<$list filter=\"[<tv-config-toolbar-icons>match[yes]]\">\n{{$:/core/images/export-button}}\n</$list>\n<$list filter=\"[<tv-config-toolbar-text>match[yes]]\">\n<span class=\"tc-btn-text\"><$text text={{$lingoBase$Caption}}/></span>\n</$list>\n</$button></span><$reveal state=<<qualify \"$:/state/popup/export\">> type=\"popup\" position=\"below\" animate=\"yes\">\n<div class=\"tc-drop-down\">\n<$set name=\"count\" value={{{ [subfilter<__exportFilter__>count[]] }}}>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Exporter]]\">\n<$list filter=\"[<currentTiddler>has[condition]subfilter{!!condition}limit[1]] ~[<currentTiddler>!has[condition]then[true]]\" variable=\"ignore\">\n<$set name=\"extension\" value={{!!extension}}>\n<$button class=\"tc-btn-invisible\">\n<$action-sendmessage $message=\"tm-download-file\" $param=<<currentTiddler>> exportFilter=<<__exportFilter__>> filename=<<exportButtonFilename \"\"\"$baseFilename$\"\"\">>/>\n<$action-deletetiddler $tiddler=<<qualify \"$:/state/popup/export\">>/>\n<$transclude field=\"description\"/>\n</$button>\n</$set>\n</$list>\n</$list>\n</$set>\n</div>\n</$reveal>\n\\end\n"
},
"$:/core/macros/image-picker": {
"title": "$:/core/macros/image-picker",
"created": "20170715180840889",
"modified": "20170715180914005",
"tags": "$:/tags/Macro",
"type": "text/vnd.tiddlywiki",
"text": "\\define image-picker-thumbnail(actions)\n<$button tag=\"a\" tooltip=\"\"\"$(imageTitle)$\"\"\">\n$actions$\n<$transclude tiddler=<<imageTitle>>/>\n</$button>\n\\end\n\n\\define image-picker-list(filter,actions)\n<$list filter=\"\"\"$filter$\"\"\" variable=\"imageTitle\">\n<$macrocall $name=\"image-picker-thumbnail\" actions=\"\"\"$actions$\"\"\"/>\n</$list>\n\\end\n\n\\define image-picker(actions,filter:\"[all[shadows+tiddlers]is[image]] -[type[application/pdf]] +[!has[draft.of]$subfilter$sort[title]]\",subfilter:\"\")\n<div class=\"tc-image-chooser\">\n<$vars state-system=<<qualify \"$:/state/image-picker/system\">>>\n<$checkbox tiddler=<<state-system>> field=\"text\" checked=\"show\" unchecked=\"hide\" default=\"hide\">\n{{$:/language/SystemTiddlers/Include/Prompt}}\n</$checkbox>\n<$reveal state=<<state-system>> type=\"match\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$ +[!is[system]]\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n<$reveal state=<<state-system>> type=\"nomatch\" text=\"hide\" default=\"hide\" tag=\"div\">\n<$macrocall $name=\"image-picker-list\" filter=\"\"\"$filter$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</$reveal>\n</$vars>\n</div>\n\\end\n\n\\define image-picker-include-tagged-images(actions)\n<$macrocall $name=\"image-picker\" filter=\"[all[shadows+tiddlers]is[image]] [all[shadows+tiddlers]tag[$:/tags/Image]] -[type[application/pdf]] +[!has[draft.of]sort[title]]\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n"
},
"$:/core/macros/keyboard-driven-input": {
"title": "$:/core/macros/keyboard-driven-input",
"tags": "$:/tags/Macro",
"text": "\\define change-input-tab(stateTitle,tag,beforeafter,defaultState,actions)\n<$set name=\"tabsList\" filter=\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]]\">\n<$vars currentState={{{ [<__stateTitle__>!is[missing]get[text]] ~[<__defaultState__>] }}} firstTab={{{ [enlist<tabsList>nth[1]] }}} lastTab={{{ [enlist<tabsList>last[]] }}}>\n<$set name=\"nextTab\" value={{{ [all[shadows+tiddlers]tag<__tag__>!has[draft.of]$beforeafter$<currentState>] ~[[$beforeafter$]removeprefix[after]suffix[]addprefix<firstTab>] ~[[$beforeafter$]removeprefix[before]suffix[]addprefix<lastTab>] }}}>\n<$action-setfield $tiddler=<<__stateTitle__>> text=<<nextTab>>/>\n$actions$\n</$set>\n</$vars>\n</$set>\n\\end\n\n\\define keyboard-input-actions()\n<$list filter=\"[<__index__>match[]]\">\n<$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>get<__field__>] }}}/>\n</$list>\n<$list filter=\"[<__index__>!match[]]\">\n<$action-setfield $tiddler=<<__storeTitle__>> text={{{ [<__tiddler__>getindex<__index__>] }}}/>\n</$list>\n\\end\n\n\\define input-next-actions-inner()\n<$list filter=\"[<nextItem>minlength[1]]\" variable=\"ignore\">\n<$action-setfield $tiddler=<<__selectionStateTitle__>> text=<<nextItem>>/>\n<$list filter=\"[<__index__>match[]]\">\n<$action-setfield $tiddler=<<__tiddler__>> $field=<<__field__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/>\n</$list>\n<$list filter=\"[<__index__>!match[]]\">\n<$action-setfield $tiddler=<<__tiddler__>> $index=<<__index__>> $value={{{ [<nextItem>] +[splitregexp[(?:.(?!-))+$]] }}}/>\n</$list>\n<$action-setfield $tiddler=<<__refreshTitle__>> text=\"yes\"/>\n</$list>\n\\end\n\n\\define input-next-actions(afterOrBefore:\"after\",reverse:\"\")\n<$list filter=\"[<__storeTitle__>get[text]minlength<__filterMinLength__>] [<__filterMinLength__>match[0]] +[limit[1]]\" variable=\"ignore\">\n<$vars userInput={{{ [<__storeTitle__>get[text]] }}} selectedItem={{{ [<__selectionStateTitle__>get[text]] }}}>\n<$set name=\"configTiddler\" value={{{ [subfilter<__configTiddlerFilter__>] }}}>\n<$vars primaryListFilter={{{ [<configTiddler>get<__firstSearchFilterField__>] }}} secondaryListFilter={{{ [<configTiddler>get<__secondSearchFilterField__>] }}}>\n<$set name=\"filteredList\" filter=\"[subfilter<primaryListFilter>addsuffix[-primaryList]] =[subfilter<secondaryListFilter>addsuffix[-secondaryList]]\">\n<$vars nextItem={{{ [enlist<filteredList>$afterOrBefore$<selectedItem>] ~[enlist<filteredList>$reverse$nth[1]] }}} firstItem={{{ [enlist<filteredList>nth[1]] }}} lastItem={{{ [enlist<filteredList>last[]] }}}>\n<$list filter=\"[<selectedItem>match<firstItem>!match<lastItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [[$afterOrBefore$]match[before]then<userInput>addsuffix[-userInput]] ~[<nextItem>] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>match<lastItem>!match<firstItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [[$afterOrBefore$]match[after]then<userInput>addsuffix[-userInput]] ~[<nextItem>] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>match<firstItem>match<lastItem>]\" variable=\"ignore\">\n<$set name=\"nextItem\" value={{{ [<userInput>addsuffix[-userInput]] }}}>\n<<input-next-actions-inner>>\n</$set>\n</$list>\n<$list filter=\"[<selectedItem>!match<firstItem>!match<lastItem>]\" variable=\"ignore\">\n<<input-next-actions-inner>>\n</$list>\n</$vars>\n</$set>\n</$vars>\n</$set>\n</$vars>\n</$list>\n\\end\n\n\\define keyboard-driven-input(tiddler,storeTitle,field:\"text\",index:\"\",tag:\"input\",type,focus:\"\",inputAcceptActions,inputAcceptVariantActions,inputCancelActions,placeholder:\"\",default:\"\",class,focusPopup,rows,minHeight,tabindex,size,autoHeight,filterMinLength:\"0\",refreshTitle,selectionStateTitle,cancelPopups:\"\",configTiddlerFilter,firstSearchFilterField:\"first-search-filter\",secondSearchFilterField:\"second-search-filter\")\n\\whitespace trim\n<$keyboard key=\"((input-accept))\" actions=<<__inputAcceptActions__>>>\n<$keyboard key=\"((input-accept-variant))\" actions=<<__inputAcceptVariantActions__>>>\n<$keyboard key=\"((input-up))\" actions=<<input-next-actions \"before\" \"reverse[]\">>>\n<$keyboard key=\"((input-down))\" actions=<<input-next-actions>>>\n<$keyboard key=\"((input-cancel))\" actions=<<__inputCancelActions__>>>\n<$edit-text tiddler=<<__tiddler__>> field=<<__field__>> index=<<__index__>> \n\t\tinputActions=<<keyboard-input-actions>> tag=<<__tag__>> class=<<__class__>> \n\t\tplaceholder=<<__placeholder__>> default=<<__default__>> focusPopup=<<__focusPopup__>> \n\t\tfocus=<<__focus__>> type=<<__type__>> rows=<<__rows__>> minHeight=<<__minHeight__>> \n\t\ttabindex=<<__tabindex__>> size=<<__size__>> autoHeight=<<__autoHeight__>> \n\t\trefreshTitle=<<__refreshTitle__>> cancelPopups=<<__cancelPopups__>>/>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n</$keyboard>\n\\end\n"
},
"$:/core/macros/lingo": {
"title": "$:/core/macros/lingo",
"tags": "$:/tags/Macro",
"text": "\\define lingo-base()\n$:/language/\n\\end\n\n\\define lingo(title)\n{{$(lingo-base)$$title$}}\n\\end\n"
},
"$:/core/macros/list": {
"title": "$:/core/macros/list",
"tags": "$:/tags/Macro",
"text": "\\define list-links(filter,type:\"ul\",subtype:\"li\",class:\"\",emptyMessage)\n\\whitespace trim\n<$type$ class=\"$class$\">\n<$list filter=\"$filter$\" emptyMessage=<<__emptyMessage__>>>\n<$subtype$>\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$subtype$>\n</$list>\n</$type$>\n\\end\n\n\\define list-links-draggable-drop-actions()\n<$action-listops $tiddler=<<targetTiddler>> $field=<<targetField>> $subfilter=\"+[insertbefore:currentTiddler<actionTiddler>]\"/>\n\\end\n\n\\define list-links-draggable(tiddler,field:\"list\",type:\"ul\",subtype:\"li\",class:\"\",itemTemplate)\n\\whitespace trim\n<span class=\"tc-links-draggable-list\">\n<$vars targetTiddler=\"\"\"$tiddler$\"\"\" targetField=\"\"\"$field$\"\"\">\n<$type$ class=\"$class$\">\n<$list filter=\"[list[$tiddler$!!$field$]]\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"\"\"$subtype$\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\"/>\n<div>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$transclude field=\"caption\">\n<$view field=\"title\"/>\n</$transclude>\n</$link>\n</$transclude>\n</div>\n</$droppable>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=<<list-links-draggable-drop-actions>> tag=\"div\" enable=<<tv-enable-drag-and-drop>>>\n<div class=\"tc-droppable-placeholder\">\n{{$:/core/images/blank}}\n</div>\n<div style=\"height:0.5em;\"/>\n</$droppable>\n</$tiddler>\n</$type$>\n</$vars>\n</span>\n\\end\n\n\\define list-tagged-draggable-drop-actions(tag)\n<!-- Save the current ordering of the tiddlers with this tag -->\n<$set name=\"order\" filter=\"[<__tag__>tagging[]]\">\n<!-- Remove any list-after or list-before fields from the tiddlers with this tag -->\n<$list filter=\"[<__tag__>tagging[]]\">\n<$action-deletefield $field=\"list-before\"/>\n<$action-deletefield $field=\"list-after\"/>\n</$list>\n<!-- Save the new order to the Tag Tiddler -->\n<$action-listops $tiddler=<<__tag__>> $field=\"list\" $filter=\"+[enlist<order>] +[insertbefore:currentTiddler<actionTiddler>]\"/>\n<!-- Make sure the newly added item has the right tag -->\n<!-- Removing this line makes dragging tags within the dropdown work as intended -->\n<!--<$action-listops $tiddler=<<actionTiddler>> $tags=<<__tag__>>/>-->\n<!-- Using the following 5 lines as replacement makes dragging titles from outside into the dropdown apply the tag -->\n<$list filter=\"[<actionTiddler>!contains:tags<__tag__>]\">\n<$fieldmangler tiddler=<<actionTiddler>>>\n<$action-sendmessage $message=\"tm-add-tag\" $param=<<__tag__>>/>\n</$fieldmangler>\n</$list>\n</$set>\n\\end\n\n\\define list-tagged-draggable(tag,subFilter,emptyMessage,itemTemplate,elementTag:\"div\",storyview:\"\")\n\\whitespace trim\n<span class=\"tc-tagged-draggable-list\">\n<$set name=\"tag\" value=<<__tag__>>>\n<$list filter=\"[<__tag__>tagging[]$subFilter$]\" emptyMessage=<<__emptyMessage__>> storyview=<<__storyview__>>>\n<$elementTag$ class=\"tc-menu-list-item\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$>\n<$transclude tiddler=\"\"\"$itemTemplate$\"\"\">\n<$link to={{!!title}}>\n<$view field=\"title\"/>\n</$link>\n</$transclude>\n</$elementTag$>\n</$droppable>\n</$elementTag$>\n</$list>\n<$tiddler tiddler=\"\">\n<$droppable actions=\"\"\"<$macrocall $name=\"list-tagged-draggable-drop-actions\" tag=<<__tag__>>/>\"\"\" enable=<<tv-enable-drag-and-drop>>>\n<$elementTag$ class=\"tc-droppable-placeholder\"/>\n<$elementTag$ style=\"height:0.5em;\">\n</$elementTag$>\n</$droppable>\n</$tiddler>\n</$set>\n</span>\n\\end\n"
},
"$:/core/macros/tabs": {
"title": "$:/core/macros/tabs",
"tags": "$:/tags/Macro",
"text": "\\define tabs(tabsList,default,state:\"$:/state/tab\",class,template,buttonTemplate,retain,actions,explicitState)\n<$set name=\"qualifiedState\" value=<<qualify \"$state$\">>>\n<$vars tabsState={{{ [<__explicitState__>minlength[1]] ~[<qualifiedState>] }}}>\n<div class=\"tc-tab-set $class$\">\n<div class=\"tc-tab-buttons $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\" storyview=\"pop\"><$set name=\"save-currentTiddler\" value=<<currentTiddler>>><$tiddler tiddler=<<currentTab>>><$button set=<<tabsState>> setTo=<<currentTab>> default=\"$default$\" selectedClass=\"tc-tab-selected\" tooltip={{!!tooltip}}>\n<$tiddler tiddler=<<save-currentTiddler>>>\n<$set name=\"tv-wikilinks\" value=\"no\">\n<$transclude tiddler=\"$buttonTemplate$\" mode=\"inline\">\n<$transclude tiddler=<<currentTab>> field=\"caption\">\n<$macrocall $name=\"currentTab\" $type=\"text/plain\" $output=\"text/plain\"/>\n</$transclude>\n</$transclude>\n</$set></$tiddler>$actions$</$button></$tiddler></$set></$list>\n</div>\n<div class=\"tc-tab-divider $class$\"/>\n<div class=\"tc-tab-content $class$\">\n<$list filter=\"$tabsList$\" variable=\"currentTab\">\n\n<$reveal type=\"match\" state=<<tabsState>> text=<<currentTab>> default=\"$default$\" retain=\"\"\"$retain$\"\"\">\n\n<$transclude tiddler=\"$template$\" mode=\"block\">\n\n<$transclude tiddler=<<currentTab>> mode=\"block\"/>\n\n</$transclude>\n\n</$reveal>\n\n</$list>\n</div>\n</div>\n</$vars>\n</$set>\n\\end\n"
},
"$:/core/macros/tag-picker": {
"title": "$:/core/macros/tag-picker",
"tags": "$:/tags/Macro",
"first-search-filter": "[tags[]!is[system]search:title<userInput>sort[]]",
"second-search-filter": "[tags[]is[system]search:title<userInput>sort[]]",
"text": "\\define get-tagpicker-focus-selector() [data-tiddler-title=\"$(currentTiddlerCSSEscaped)$\"] .tc-add-tag-name input\n\n\\define delete-tag-state-tiddlers() <$action-deletetiddler $filter=\"[<newTagNameTiddler>] [<storeTitle>] [<tagSelectionState>]\"/>\n\n\\define add-tag-actions(actions,tagField:\"tags\")\n<$set name=\"tag\" value={{{ [<__tiddler__>get[text]] }}}>\n<$list filter=\"[<saveTiddler>!contains:$tagField$<tag>!match[]]\" variable=\"ignore\" emptyMessage=\"\"\"\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"-[<tag>]\"/>\n\"\"\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"[<tag>]\"/>\n$actions$\n</$list>\n</$set>\n<<delete-tag-state-tiddlers>>\n<$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n\\end\n\n\\define clear-tags-actions-inner()\n<$list filter=\"[<storeTitle>has[text]] [<newTagNameTiddler>has[text]]\" variable=\"ignore\" emptyMessage=\"\"\"<<cancel-delete-tiddler-actions \"cancel\">>\"\"\">\n<<delete-tag-state-tiddlers>>\n</$list>\n\\end\n\n\\define clear-tags-actions()\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<newTagNameTiddler>get[text]!match<userInput>]\" emptyMessage=\"\"\"<<clear-tags-actions-inner>>\"\"\">\n<$action-setfield $tiddler=<<newTagNameTiddler>> text=<<userInput>>/><$action-setfield $tiddler=<<refreshTitle>> text=\"yes\"/>\n</$list>\n</$set>\n\\end\n\n\\define tag-picker-inner(actions,tagField:\"tags\")\n\\whitespace trim\n<$vars newTagNameInputTiddlerQualified=<<qualify \"$:/temp/NewTagName/input\">> newTagNameSelectionTiddlerQualified=<<qualify \"$:/temp/NewTagName/selected-item\">> fallbackTarget={{$(palette)$##tag-background}} colourA={{$(palette)$##foreground}} colourB={{$(palette)$##background}}>\n<$vars storeTitle={{{ [<newTagNameInputTiddler>!match[]] ~[<newTagNameInputTiddlerQualified>] }}} tagSelectionState={{{ [<newTagNameSelectionTiddler>!match[]] ~[<newTagNameSelectionTiddlerQualified>] }}}>\n<$vars refreshTitle=<<qualify \"$:/temp/NewTagName/refresh\">> nonSystemTagsFilter=\"[tags[]!is[system]search:title<userInput>sort[]]\" systemTagsFilter=\"[tags[]is[system]search:title<userInput>sort[]]\">\n<div class=\"tc-edit-add-tag\">\n<div>\n<span class=\"tc-add-tag-name tc-small-gap-right\">\n<$macrocall $name=\"keyboard-driven-input\" tiddler=<<newTagNameTiddler>> storeTitle=<<storeTitle>> refreshTitle=<<refreshTitle>>\n\t\tselectionStateTitle=<<tagSelectionState>> inputAcceptActions=\"\"\"<$macrocall $name=\"add-tag-actions\" actions=<<__actions__>> tagField=<<__tagField__>>/>\"\"\"\n\t\tinputCancelActions=<<clear-tags-actions>> tag=\"input\" placeholder={{$:/language/EditTemplate/Tags/Add/Placeholder}}\n\t\tfocusPopup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-edit-texteditor tc-popup-handle\" tabindex=<<tabIndex>> \n\t\tfocus={{{ [{$:/config/AutoFocus}match[tags]then[true]] ~[[false]] }}} filterMinLength={{$:/config/Tags/MinLength}} \n\t\tcancelPopups=<<cancelPopups>> configTiddlerFilter=\"[[$:/core/macros/tag-picker]]\"/>\n</span><$button popup=<<qualify \"$:/state/popup/tags-auto-complete\">> class=\"tc-btn-invisible tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/Dropdown/Hint}} aria-label={{$:/language/EditTemplate/Tags/Dropdown/Caption}}>{{$:/core/images/down-arrow}}</$button><$reveal state=<<storeTitle>> type=\"nomatch\" text=\"\"><$button class=\"tc-btn-invisible tc-small-gap tc-btn-dropdown\" tooltip={{$:/language/EditTemplate/Tags/ClearInput/Hint}} aria-label={{$:/language/EditTemplate/Tags/ClearInput/Caption}}>{{$:/core/images/close-button}}<<delete-tag-state-tiddlers>></$button></$reveal><span class=\"tc-add-tag-button tc-small-gap-left\">\n<$set name=\"tag\" value={{{ [<newTagNameTiddler>get[text]] }}}>\n<$button set=<<newTagNameTiddler>> setTo=\"\" class=\"\">\n<$action-listops $tiddler=<<saveTiddler>> $field=<<__tagField__>> $subfilter=\"[<tag>]\"/>\n$actions$\n<$set name=\"currentTiddlerCSSEscaped\" value={{{ [<saveTiddler>escapecss[]] }}}>\n<<delete-tag-state-tiddlers>><$action-sendmessage $message=\"tm-focus-selector\" $param=<<get-tagpicker-focus-selector>>/>\n</$set>\n{{$:/language/EditTemplate/Tags/Add/Button}}\n</$button>\n</$set>\n</span>\n</div>\n<div class=\"tc-block-dropdown-wrapper\">\n<$reveal state=<<qualify \"$:/state/popup/tags-auto-complete\">> type=\"nomatch\" text=\"\" default=\"\">\n<div class=\"tc-block-dropdown tc-block-tags-dropdown\">\n<$set name=\"userInput\" value={{{ [<storeTitle>get[text]] }}}>\n<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=<<nonSystemTagsFilter>> variable=\"tag\">\n<$list filter=\"[<tag>addsuffix[-primaryList]] -[<tagSelectionState>get[text]]\" emptyMessage=\"\"\"<$vars button-classes=\"tc-btn-invisible tc-tag-button-selected\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\"\"\">\n<$vars button-classes=\"tc-btn-invisible\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\n</$list>\n</$list></$list>\n<hr>\n<$list filter=\"[<userInput>minlength{$:/config/Tags/MinLength}limit[1]]\" emptyMessage=\"\"\"<div class=\"tc-search-results\">{{$:/language/Search/Search/TooShort}}</div>\"\"\" variable=\"listItem\">\n<$list filter=<<systemTagsFilter>> variable=\"tag\">\n<$list filter=\"[<tag>addsuffix[-secondaryList]] -[<tagSelectionState>get[text]]\" emptyMessage=\"\"\"<$vars button-classes=\"tc-btn-invisible tc-tag-button-selected\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\"\"\">\n<$vars button-classes=\"tc-btn-invisible\" actions=<<__actions__>> tagField=<<__tagField__>> currentTiddler=<<tag>>>{{||$:/core/ui/TagPickerTagTemplate}}</$vars>\n</$list>\n</$list></$list>\n</$set>\n</div>\n</$reveal>\n</div>\n</div>\n</$vars>\n</$vars>\n</$vars>\n\\end\n\\define tag-picker(actions,tagField:\"tags\")\n\\whitespace trim\n<$vars saveTiddler=<<currentTiddler>> palette={{$:/palette}}>\n<$list filter=\"[<newTagNameTiddler>match[]]\" emptyMessage=\"\"\"<$macrocall $name=\"tag-picker-inner\" actions=<<__actions__>> tagField=<<__tagField__>>/>\"\"\">\n<$set name=\"newTagNameTiddler\" value=<<qualify \"$:/temp/NewTagName\">>>\n<$macrocall $name=\"tag-picker-inner\" actions=<<__actions__>> tagField=<<__tagField__>>/>\n</$set>\n</$list>\n</$vars>\n\\end\n"
},
"$:/core/macros/tag": {
"title": "$:/core/macros/tag",
"tags": "$:/tags/Macro",
"text": "\\define tag-pill-styles()\nbackground-color:$(backgroundColor)$;\nfill:$(foregroundColor)$;\ncolor:$(foregroundColor)$;\n\\end\n\n\\define tag-pill-inner(tag,icon,colour,fallbackTarget,colourA,colourB,element-tag,element-attributes,actions)\n<$vars foregroundColor=<<contrastcolour target:\"\"\"$colour$\"\"\" fallbackTarget:\"\"\"$fallbackTarget$\"\"\" colourA:\"\"\"$colourA$\"\"\" colourB:\"\"\"$colourB$\"\"\">> backgroundColor=\"\"\"$colour$\"\"\">\n<$element-tag$ $element-attributes$ class=\"tc-tag-label tc-btn-invisible\" style=<<tag-pill-styles>>>\n$actions$<$transclude tiddler=\"\"\"$icon$\"\"\"/><$view tiddler=<<__tag__>> field=\"title\" format=\"text\" />\n</$element-tag$>\n</$vars>\n\\end\n\n\\define tag-pill-body(tag,icon,colour,palette,element-tag,element-attributes,actions)\n<$macrocall $name=\"tag-pill-inner\" tag=<<__tag__>> icon=\"\"\"$icon$\"\"\" colour=\"\"\"$colour$\"\"\" fallbackTarget={{$palette$##tag-background}} colourA={{$palette$##foreground}} colourB={{$palette$##background}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n\\end\n\n\\define tag-pill(tag,element-tag:\"span\",element-attributes:\"\",actions:\"\")\n<span class=\"tc-tag-list-item\">\n<$macrocall $name=\"tag-pill-body\" tag=<<__tag__>> icon={{{ [<__tag__>get[icon]] }}} colour={{{ [<__tag__>get[color]] }}} palette={{$:/palette}} element-tag=\"\"\"$element-tag$\"\"\" element-attributes=\"\"\"$element-attributes$\"\"\" actions=\"\"\"$actions$\"\"\"/>\n</span>\n\\end\n\n\\define tag(tag)\n{{$tag$||$:/core/ui/TagTemplate}}\n\\end\n"
},
"$:/core/macros/thumbnails": {
"title": "$:/core/macros/thumbnails",
"tags": "$:/tags/Macro",
"text": "\\define thumbnail(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<$link to=\"\"\"$link$\"\"\"><div class=\"tc-thumbnail-wrapper\">\n<div class=\"tc-thumbnail-image\" style=\"width:$width$px;height:$height$px;\"><$reveal type=\"nomatch\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" style=\"width:$width$px;height:$height$px;\">\n[img[$image$]]\n</$reveal><$reveal type=\"match\" text=\"\" default=\"\"\"$image$\"\"\" tag=\"div\" class=\"tc-thumbnail-background\" style=\"width:$width$px;height:$height$px;background-color:$background-color$;\"></$reveal></div><div class=\"tc-thumbnail-icon\" style=\"fill:$color$;color:$color$;\">\n$icon$\n</div><div class=\"tc-thumbnail-caption\">\n$caption$\n</div>\n</div></$link>\n\\end\n\n\\define thumbnail-right(link,icon,color,background-color,image,caption,width:\"280\",height:\"157\")\n<div class=\"tc-thumbnail-right-wrapper\"><<thumbnail \"\"\"$link$\"\"\" \"\"\"$icon$\"\"\" \"\"\"$color$\"\"\" \"\"\"$background-color$\"\"\" \"\"\"$image$\"\"\" \"\"\"$caption$\"\"\" \"\"\"$width$\"\"\" \"\"\"$height$\"\"\">></div>\n\\end\n\n\\define list-thumbnails(filter,width:\"280\",height:\"157\")\n<$list filter=\"\"\"$filter$\"\"\"><$macrocall $name=\"thumbnail\" link={{!!link}} icon={{!!icon}} color={{!!color}} background-color={{!!background-color}} image={{!!image}} caption={{!!caption}} width=\"\"\"$width$\"\"\" height=\"\"\"$height$\"\"\"/></$list>\n\\end\n"
},
"$:/core/macros/timeline": {
"title": "$:/core/macros/timeline",
"created": "20141212105914482",
"modified": "20141212110330815",
"tags": "$:/tags/Macro",
"text": "\\define timeline-title()\n\\whitespace trim\n<!-- Override this macro with a global macro \n of the same name if you need to change \n how titles are displayed on the timeline \n -->\n<$view field=\"title\"/>\n\\end\n\\define timeline(limit:\"100\",format:\"DDth MMM YYYY\",subfilter:\"\",dateField:\"modified\")\n<div class=\"tc-timeline\">\n<$list filter=\"[!is[system]$subfilter$has[$dateField$]!sort[$dateField$]limit[$limit$]eachday[$dateField$]]\">\n<div class=\"tc-menu-list-item\">\n<$view field=\"$dateField$\" format=\"date\" template=\"$format$\"/>\n<$list filter=\"[sameday:$dateField${!!$dateField$}!is[system]$subfilter$!sort[$dateField$]]\">\n<div class=\"tc-menu-list-subitem\">\n<$link to={{!!title}}><<timeline-title>></$link>\n</div>\n</$list>\n</div>\n</$list>\n</div>\n\\end\n"
},
"$:/core/macros/toc": {
"title": "$:/core/macros/toc",
"tags": "$:/tags/Macro",
"text": "\\define toc-caption()\n<$set name=\"tv-wikilinks\" value=\"no\">\n <$transclude field=\"caption\">\n <$view field=\"title\"/>\n </$transclude>\n</$set>\n\\end\n\n\\define toc-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<ol class=\"tc-toc\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$vars item=<<currentTiddler>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=\"<$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}><$view field='caption'><$view field='title'/></$view></$link>\">\n <<toc-caption>>\n </$list>\n <$macrocall $name=\"toc-body\" tag=<<item>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n </li>\n </$set>\n </$set>\n </$vars>\n </$list>\n</ol>\n\\end\n\n\\define toc(tag,sort:\"\",itemClassFilter:\"\")\n<$macrocall $name=\"toc-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> />\n\\end\n\n\\define toc-linked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n </$button>\n </$reveal>\n <<toc-caption>>\n </$link>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<!-- helper function -->\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-expandable-empty-message()\n<$macrocall $name=\"toc-linked-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-expandable(tag,sort:\"\",itemClassFilter:\"\",exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <ol class=\"tc-toc toc-expandable\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$list filter=\"[all[current]toc-link[no]]\" emptyMessage=<<toc-expandable-empty-message>> >\n <$macrocall $name=\"toc-unlinked-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"\"\"itemClassFilter\"\"\" exclude=<<excluded>> path=<<path>> />\n </$list>\n </$list>\n </ol>\n </$set>\n</$vars>\n\\end\n\n\\define toc-linked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\" >\n <li class=<<toc-item-class>>>\n <$link to={{{ [<currentTiddler>get[target]else<currentTiddler>] }}}>\n <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button>\">\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n </$button>\n </$reveal>\n </$list>\n <<toc-caption>>\n </$link>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-unlinked-selective-expandable-body(tag,sort:\"\",itemClassFilter,exclude,path)\n<$qualify name=\"toc-state\" title={{{ [[$:/state/toc]addsuffix<__path__>addsuffix[-]addsuffix<currentTiddler>] }}}>\n <$set name=\"toc-item-class\" filter=<<__itemClassFilter__>> emptyValue=\"toc-item-selected\" value=\"toc-item\">\n <li class=<<toc-item-class>>>\n <$list filter=\"[all[current]tagging[]$sort$limit[1]]\" variable=\"ignore\" emptyMessage=\"<$button class='tc-btn-invisible'>{{$:/core/images/blank}}</$button> <$view field='caption'><$view field='title'/></$view>\">\n <$reveal type=\"nomatch\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"open\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/right-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$button setTitle=<<toc-state>> setTo=\"close\" class=\"tc-btn-invisible tc-popup-keep\">\n {{$:/core/images/down-arrow}}\n <<toc-caption>>\n </$button>\n </$reveal>\n </$list>\n <$reveal type=\"match\" stateTitle=<<toc-state>> text=\"open\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<currentTiddler>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<__exclude__>> path=<<__path__>>/>\n </$reveal>\n </li>\n </$set>\n</$qualify>\n\\end\n\n\\define toc-selective-expandable-empty-message()\n<$macrocall $name=\"toc-linked-selective-expandable-body\" tag=<<tag>> sort=<<sort>> itemClassFilter=<<itemClassFilter>> exclude=<<excluded>> path=<<path>>/>\n\\end\n\n\\define toc-selective-expandable(tag,sort:\"\",itemClassFilter,exclude,path)\n<$vars tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> path={{{ [<__path__>addsuffix[/]addsuffix<__tag__>] }}}>\n <$set name=\"excluded\" filter=\"\"\"[enlist<__exclude__>] [<__tag__>]\"\"\">\n <ol class=\"tc-toc toc-selective-expandable\">\n <$list filter=\"\"\"[all[shadows+tiddlers]tag<__tag__>!has[draft.of]$sort$] -[<__tag__>] -[enlist<__exclude__>]\"\"\">\n <$list filter=\"[all[current]toc-link[no]]\" variable=\"ignore\" emptyMessage=<<toc-selective-expandable-empty-message>> >\n <$macrocall $name=\"toc-unlinked-selective-expandable-body\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=<<__itemClassFilter__>> exclude=<<excluded>> path=<<path>>/>\n </$list>\n </$list>\n </ol>\n </$set>\n</$vars>\n\\end\n\n\\define toc-tabbed-external-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$tiddler tiddler={{{ [<__selectedTiddler__>get[text]] }}}>\n <div class=\"tc-tabbed-table-of-contents\">\n <$linkcatcher to=<<__selectedTiddler__>>>\n <div class=\"tc-table-of-contents\">\n <$macrocall $name=\"toc-selective-expandable\" tag=<<__tag__>> sort=<<__sort__>> itemClassFilter=\"[all[current]] -[<__selectedTiddler__>get[text]]\"/>\n </div>\n </$linkcatcher>\n <div class=\"tc-tabbed-table-of-contents-content\">\n <$reveal stateTitle=<<__selectedTiddler__>> type=\"nomatch\" text=\"\">\n <$transclude mode=\"block\" tiddler=<<__template__>>>\n <h1><<toc-caption>></h1>\n <$transclude mode=\"block\">$missingText$</$transclude>\n </$transclude>\n </$reveal>\n <$reveal stateTitle=<<__selectedTiddler__>> type=\"match\" text=\"\">\n $unselectedText$\n </$reveal>\n </div>\n </div>\n</$tiddler>\n\\end\n\n\\define toc-tabbed-internal-nav(tag,sort:\"\",selectedTiddler:\"$:/temp/toc/selectedTiddler\",unselectedText,missingText,template:\"\")\n<$linkcatcher to=<<__selectedTiddler__>>>\n <$macrocall $name=\"toc-tabbed-external-nav\" tag=<<__tag__>> sort=<<__sort__>> selectedTiddler=<<__selectedTiddler__>> unselectedText=<<__unselectedText__>> missingText=<<__missingText__>> template=<<__template__>>/>\n</$linkcatcher>\n\\end\n\n"
},
"$:/core/macros/translink": {
"title": "$:/core/macros/translink",
"tags": "$:/tags/Macro",
"text": "\\define translink(title,mode:\"block\")\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: black; foreground; white;\">\n<$link to=\"\"\"$title$\"\"\">\n<$text text=\"\"\"$title$\"\"\"/>\n</$link>\n<div style=\"border:1px solid #ccc; padding: 0.5em; background: white; foreground; black;\">\n<$transclude tiddler=\"\"\"$title$\"\"\" mode=\"$mode$\">\n\"<$text text=\"\"\"$title$\"\"\"/>\" is missing\n</$transclude>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/tree": {
"title": "$:/core/macros/tree",
"tags": "$:/tags/Macro",
"text": "\\define leaf-link(full-title,chunk,separator: \"/\")\n<$link to=<<__full-title__>>><$text text=<<__chunk__>>/></$link>\n\\end\n\n\\define leaf-node(prefix,chunk)\n<li>\n<$list filter=\"[<__prefix__>addsuffix<__chunk__>is[shadow]] [<__prefix__>addsuffix<__chunk__>is[tiddler]]\" variable=\"full-title\">\n<$list filter=\"[<full-title>removeprefix<__prefix__>]\" variable=\"chunk\">\n<span>{{$:/core/images/file}}</span> <$macrocall $name=\"leaf-link\" full-title=<<full-title>> chunk=<<chunk>>/>\n</$list>\n</$list>\n</li>\n\\end\n\n\\define branch-node(prefix,chunk,separator: \"/\")\n<li>\n<$set name=\"reveal-state\" value={{{ [[$:/state/tree/]addsuffix<__prefix__>addsuffix<__chunk__>] }}}>\n<$reveal type=\"nomatch\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"show\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$button setTitle=<<reveal-state>> setTo=\"hide\" class=\"tc-btn-invisible\">\n{{$:/core/images/folder}} <$text text=<<__chunk__>>/>\n</$button>\n</$reveal>\n<span>(<$count filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>removeprefix<__chunk__>] -[<__prefix__>addsuffix<__chunk__>]\"/>)</span>\n<$reveal type=\"match\" stateTitle=<<reveal-state>> text=\"show\">\n<$macrocall $name=\"tree-node\" prefix={{{ [<__prefix__>addsuffix<__chunk__>] }}} separator=<<__separator__>>/>\n</$reveal>\n</$set>\n</li>\n\\end\n\n\\define tree-node(prefix,separator: \"/\")\n<ol>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]!suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"leaf-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n<$list filter=\"[all[shadows+tiddlers]removeprefix<__prefix__>splitbefore<__separator__>sort[]suffix<__separator__>]\" variable=\"chunk\">\n<$macrocall $name=\"branch-node\" prefix=<<__prefix__>> chunk=<<chunk>> separator=<<__separator__>>/>\n</$list>\n</ol>\n\\end\n\n\\define tree(prefix: \"$:/\",separator: \"/\")\n<div class=\"tc-tree\">\n<span><$text text=<<__prefix__>>/></span>\n<div>\n<$macrocall $name=\"tree-node\" prefix=<<__prefix__>> separator=<<__separator__>>/>\n</div>\n</div>\n\\end\n"
},
"$:/core/macros/utils": {
"title": "$:/core/macros/utils",
"text": "\\define colour(colour)\n$colour$\n\\end\n"
},
"$:/snippets/minifocusswitcher": {
"title": "$:/snippets/minifocusswitcher",
"text": "<$select tiddler=\"$:/config/AutoFocus\">\n<$list filter=\"title tags text type fields\">\n<option value=<<currentTiddler>>><<currentTiddler>></option>\n</$list>\n</$select>\n"
},
"$:/snippets/minilanguageswitcher": {
"title": "$:/snippets/minilanguageswitcher",
"text": "<$select tiddler=\"$:/language\">\n<$list filter=\"[[$:/languages/en-GB]] [plugin-type[language]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"description\"><$view field=\"name\"><$view field=\"title\"/></$view></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/minithemeswitcher": {
"title": "$:/snippets/minithemeswitcher",
"text": "\\define lingo-base() $:/language/ControlPanel/Theme/\n<<lingo Prompt>> <$select tiddler=\"$:/theme\">\n<$list filter=\"[plugin-type[theme]sort[title]]\">\n<option value=<<currentTiddler>>><$view field=\"name\"><$view field=\"title\"/></$view></option>\n</$list>\n</$select>"
},
"$:/snippets/modules": {
"title": "$:/snippets/modules",
"text": "\\define describeModuleType(type)\n{{$:/language/Docs/ModuleTypes/$type$}}\n\\end\n<$list filter=\"[moduletypes[]]\">\n\n!! <$macrocall $name=\"currentTiddler\" $type=\"text/plain\" $output=\"text/plain\"/>\n\n<$macrocall $name=\"describeModuleType\" type=<<currentTiddler>>/>\n\n<ul><$list filter=\"[all[current]modules[]]\"><li><$link><<currentTiddler>></$link>\n</li>\n</$list>\n</ul>\n</$list>\n"
},
"$:/palette": {
"title": "$:/palette",
"text": "$:/palettes/Vanilla"
},
"$:/snippets/paletteeditor": {
"title": "$:/snippets/paletteeditor",
"text": "<$transclude tiddler=\"$:/PaletteManager\"/>\n"
},
"$:/snippets/palettepreview": {
"title": "$:/snippets/palettepreview",
"text": "<$set name=\"currentTiddler\" value={{$:/palette}}>\n{{||$:/snippets/currpalettepreview}}\n</$set>\n"
},
"$:/snippets/paletteswitcher": {
"title": "$:/snippets/paletteswitcher",
"text": "<$linkcatcher to=\"$:/palette\">\n<div class=\"tc-chooser\"><$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Palette]sort[name]]\"><$set name=\"cls\" filter=\"[all[current]prefix{$:/palette}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' - <$view field=\"description\" format=\"text\"/>{{||$:/snippets/currpalettepreview}}</$link>\n</div></$set>\n</$list>\n</div>\n</$linkcatcher>\n"
},
"$:/snippets/peek-stylesheets": {
"title": "$:/snippets/peek-stylesheets",
"text": "\\define expandable-stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<$vars state=<<qualify \"$:/state/peek-stylesheets/open/\">>>\n<$set name=\"state\" value={{{ [<state>addsuffix<currentTiddler>] }}}>\n<li>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"no\" class=\"tc-btn-invisible\">\n{{$:/core/images/down-arrow}}\n</$button>\n</$reveal>\n<$reveal type=\"nomatch\" state=<<state>> text=\"yes\" tag=\"span\">\n<$button set=<<state>> setTo=\"yes\" class=\"tc-btn-invisible\">\n{{$:/core/images/right-arrow}}\n</$button>\n</$reveal>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$reveal type=\"match\" state=<<state>> text=\"yes\" tag=\"div\">\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</$reveal>\n</li>\n</$set>\n</$vars>\n</$list>\n</ol>\n\\end\n\n\\define stylesheets-list()\n<ol>\n<$list filter=\"[all[shadows+tiddlers]tag[$:/tags/Stylesheet]!has[draft.of]]\">\n<li>\n<$link>\n<$view field=\"title\"/>\n</$link>\n<$set name=\"source\" tiddler=<<currentTiddler>>>\n<$wikify name=\"styles\" text=<<source>>>\n<pre>\n<code>\n<$text text=<<styles>>/>\n</code>\n</pre>\n</$wikify>\n</$set>\n</li>\n</$list>\n</ol>\n\\end\n\n<$vars modeState=<<qualify \"$:/state/peek-stylesheets/mode/\">>>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"expanded\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-right}} {{$:/language/ControlPanel/Stylesheets/Expand/Caption}}</$button>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<$button set=<<modeState>> setTo=\"restored\" class=\"tc-btn-invisible\">{{$:/core/images/chevron-down}} {{$:/language/ControlPanel/Stylesheets/Restore/Caption}}</$button>\n</$reveal>\n\n<$reveal type=\"nomatch\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<expandable-stylesheets-list>>\n</$reveal>\n<$reveal type=\"match\" state=<<modeState>> text=\"expanded\" tag=\"div\">\n<<stylesheets-list>>\n</$reveal>\n\n</$vars>\n"
},
"$:/temp/search": {
"title": "$:/temp/search",
"text": ""
},
"$:/tags/AdvancedSearch": {
"title": "$:/tags/AdvancedSearch",
"list": "[[$:/core/ui/AdvancedSearch/Standard]] [[$:/core/ui/AdvancedSearch/System]] [[$:/core/ui/AdvancedSearch/Shadows]] [[$:/core/ui/AdvancedSearch/Filter]]"
},
"$:/tags/AdvancedSearch/FilterButton": {
"title": "$:/tags/AdvancedSearch/FilterButton",
"list": "$:/core/ui/AdvancedSearch/Filter/FilterButtons/dropdown $:/core/ui/AdvancedSearch/Filter/FilterButtons/clear $:/core/ui/AdvancedSearch/Filter/FilterButtons/export $:/core/ui/AdvancedSearch/Filter/FilterButtons/delete"
},
"$:/tags/ControlPanel": {
"title": "$:/tags/ControlPanel",
"list": "$:/core/ui/ControlPanel/Info $:/core/ui/ControlPanel/Appearance $:/core/ui/ControlPanel/Settings $:/core/ui/ControlPanel/Saving $:/core/ui/ControlPanel/Plugins $:/core/ui/ControlPanel/Tools $:/core/ui/ControlPanel/Internals"
},
"$:/tags/ControlPanel/Info": {
"title": "$:/tags/ControlPanel/Info",
"list": "$:/core/ui/ControlPanel/Basics $:/core/ui/ControlPanel/Advanced"
},
"$:/tags/ControlPanel/Plugins": {
"title": "$:/tags/ControlPanel/Plugins",
"list": "[[$:/core/ui/ControlPanel/Plugins/Installed]] [[$:/core/ui/ControlPanel/Plugins/Add]]"
},
"$:/tags/EditorToolbar": {
"title": "$:/tags/EditorToolbar",
"list": "$:/core/ui/EditorToolbar/paint $:/core/ui/EditorToolbar/opacity $:/core/ui/EditorToolbar/line-width $:/core/ui/EditorToolbar/rotate-left $:/core/ui/EditorToolbar/clear $:/core/ui/EditorToolbar/bold $:/core/ui/EditorToolbar/italic $:/core/ui/EditorToolbar/strikethrough $:/core/ui/EditorToolbar/underline $:/core/ui/EditorToolbar/superscript $:/core/ui/EditorToolbar/subscript $:/core/ui/EditorToolbar/mono-line $:/core/ui/EditorToolbar/mono-block $:/core/ui/EditorToolbar/quote $:/core/ui/EditorToolbar/list-bullet $:/core/ui/EditorToolbar/list-number $:/core/ui/EditorToolbar/heading-1 $:/core/ui/EditorToolbar/heading-2 $:/core/ui/EditorToolbar/heading-3 $:/core/ui/EditorToolbar/heading-4 $:/core/ui/EditorToolbar/heading-5 $:/core/ui/EditorToolbar/heading-6 $:/core/ui/EditorToolbar/link $:/core/ui/EditorToolbar/excise $:/core/ui/EditorToolbar/picture $:/core/ui/EditorToolbar/stamp $:/core/ui/EditorToolbar/size $:/core/ui/EditorToolbar/editor-height $:/core/ui/EditorToolbar/more $:/core/ui/EditorToolbar/preview $:/core/ui/EditorToolbar/preview-type"
},
"$:/tags/EditTemplate": {
"title": "$:/tags/EditTemplate",
"list": "[[$:/core/ui/EditTemplate/controls]] [[$:/core/ui/EditTemplate/title]] [[$:/core/ui/EditTemplate/tags]] [[$:/core/ui/EditTemplate/shadow]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/EditTemplate/body]] [[$:/core/ui/EditTemplate/type]] [[$:/core/ui/EditTemplate/fields]]"
},
"$:/tags/EditToolbar": {
"title": "$:/tags/EditToolbar",
"list": "[[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/cancel]] [[$:/core/ui/Buttons/save]]"
},
"$:/tags/Manager/ItemMain": {
"title": "$:/tags/Manager/ItemMain",
"list": "$:/Manager/ItemMain/WikifiedText $:/Manager/ItemMain/RawText $:/Manager/ItemMain/Fields"
},
"$:/tags/Manager/ItemSidebar": {
"title": "$:/tags/Manager/ItemSidebar",
"list": "$:/Manager/ItemSidebar/Tags $:/Manager/ItemSidebar/Colour $:/Manager/ItemSidebar/Icon $:/Manager/ItemSidebar/Tools"
},
"$:/tags/MoreSideBar": {
"title": "$:/tags/MoreSideBar",
"list": "[[$:/core/ui/MoreSideBar/All]] [[$:/core/ui/MoreSideBar/Recent]] [[$:/core/ui/MoreSideBar/Tags]] [[$:/core/ui/MoreSideBar/Missing]] [[$:/core/ui/MoreSideBar/Drafts]] [[$:/core/ui/MoreSideBar/Orphans]] [[$:/core/ui/MoreSideBar/Types]] [[$:/core/ui/MoreSideBar/System]] [[$:/core/ui/MoreSideBar/Shadows]] [[$:/core/ui/MoreSideBar/Explorer]] [[$:/core/ui/MoreSideBar/Plugins]]",
"text": ""
},
"$:/tags/PageControls": {
"title": "$:/tags/PageControls",
"list": "[[$:/core/ui/Buttons/home]] [[$:/core/ui/Buttons/close-all]] [[$:/core/ui/Buttons/fold-all]] [[$:/core/ui/Buttons/unfold-all]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/new-tiddler]] [[$:/core/ui/Buttons/new-journal]] [[$:/core/ui/Buttons/new-image]] [[$:/core/ui/Buttons/import]] [[$:/core/ui/Buttons/export-page]] [[$:/core/ui/Buttons/control-panel]] [[$:/core/ui/Buttons/advanced-search]] [[$:/core/ui/Buttons/manager]] [[$:/core/ui/Buttons/tag-manager]] [[$:/core/ui/Buttons/language]] [[$:/core/ui/Buttons/palette]] [[$:/core/ui/Buttons/theme]] [[$:/core/ui/Buttons/storyview]] [[$:/core/ui/Buttons/encryption]] [[$:/core/ui/Buttons/timestamp]] [[$:/core/ui/Buttons/full-screen]] [[$:/core/ui/Buttons/print]] [[$:/core/ui/Buttons/save-wiki]] [[$:/core/ui/Buttons/refresh]] [[$:/core/ui/Buttons/more-page-actions]]"
},
"$:/tags/PageTemplate": {
"title": "$:/tags/PageTemplate",
"list": "[[$:/core/ui/PageTemplate/topleftbar]] [[$:/core/ui/PageTemplate/toprightbar]] [[$:/core/ui/PageTemplate/sidebar]] [[$:/core/ui/PageTemplate/story]] [[$:/core/ui/PageTemplate/alerts]]",
"text": ""
},
"$:/tags/PluginLibrary": {
"title": "$:/tags/PluginLibrary",
"list": "$:/config/OfficialPluginLibrary"
},
"$:/tags/SideBar": {
"title": "$:/tags/SideBar",
"list": "[[$:/core/ui/SideBar/Open]] [[$:/core/ui/SideBar/Recent]] [[$:/core/ui/SideBar/Tools]] [[$:/core/ui/SideBar/More]]",
"text": ""
},
"$:/tags/SideBarSegment": {
"title": "$:/tags/SideBarSegment",
"list": "[[$:/core/ui/SideBarSegments/site-title]] [[$:/core/ui/SideBarSegments/site-subtitle]] [[$:/core/ui/SideBarSegments/page-controls]] [[$:/core/ui/SideBarSegments/search]] [[$:/core/ui/SideBarSegments/tabs]]"
},
"$:/tags/TiddlerInfo": {
"title": "$:/tags/TiddlerInfo",
"list": "[[$:/core/ui/TiddlerInfo/Tools]] [[$:/core/ui/TiddlerInfo/References]] [[$:/core/ui/TiddlerInfo/Tagging]] [[$:/core/ui/TiddlerInfo/List]] [[$:/core/ui/TiddlerInfo/Listed]] [[$:/core/ui/TiddlerInfo/Fields]]",
"text": ""
},
"$:/tags/TiddlerInfo/Advanced": {
"title": "$:/tags/TiddlerInfo/Advanced",
"list": "[[$:/core/ui/TiddlerInfo/Advanced/ShadowInfo]] [[$:/core/ui/TiddlerInfo/Advanced/PluginInfo]]"
},
"$:/tags/ViewTemplate": {
"title": "$:/tags/ViewTemplate",
"list": "[[$:/core/ui/ViewTemplate/title]] [[$:/core/ui/ViewTemplate/unfold]] [[$:/core/ui/ViewTemplate/subtitle]] [[$:/core/ui/ViewTemplate/tags]] [[$:/core/ui/ViewTemplate/classic]] [[$:/core/ui/ViewTemplate/body]]"
},
"$:/tags/ViewToolbar": {
"title": "$:/tags/ViewToolbar",
"list": "[[$:/core/ui/Buttons/more-tiddler-actions]] [[$:/core/ui/Buttons/info]] [[$:/core/ui/Buttons/new-here]] [[$:/core/ui/Buttons/new-journal-here]] [[$:/core/ui/Buttons/clone]] [[$:/core/ui/Buttons/export-tiddler]] [[$:/core/ui/Buttons/edit]] [[$:/core/ui/Buttons/delete]] [[$:/core/ui/Buttons/permalink]] [[$:/core/ui/Buttons/permaview]] [[$:/core/ui/Buttons/open-window]] [[$:/core/ui/Buttons/close-others]] [[$:/core/ui/Buttons/close]] [[$:/core/ui/Buttons/fold-others]] [[$:/core/ui/Buttons/fold]]"
},
"$:/snippets/themeswitcher": {
"title": "$:/snippets/themeswitcher",
"text": "<$linkcatcher to=\"$:/theme\">\n<div class=\"tc-chooser\"><$list filter=\"[plugin-type[theme]sort[title]]\"><$set name=\"cls\" filter=\"[all[current]field:title{$:/theme}] [[$:/theme]!has[text]addsuffix[s/tiddlywiki/vanilla]field:title<currentTiddler>] +[limit[1]]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>><$link to={{!!title}}>''<$view field=\"name\" format=\"text\"/>'' <$view field=\"description\" format=\"text\"/></$link></div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
},
"$:/core/wiki/title": {
"title": "$:/core/wiki/title",
"text": "{{$:/SiteTitle}} --- {{$:/SiteSubtitle}}"
},
"$:/view": {
"title": "$:/view",
"text": "classic"
},
"$:/snippets/viewswitcher": {
"title": "$:/snippets/viewswitcher",
"text": "\\define icon()\n$:/core/images/storyview-$(storyview)$\n\\end\n<$linkcatcher to=\"$:/view\">\n<div class=\"tc-chooser tc-viewswitcher\">\n<$list filter=\"[storyviews[]]\" variable=\"storyview\">\n<$set name=\"cls\" filter=\"[<storyview>prefix{$:/view}]\" value=\"tc-chooser-item tc-chosen\" emptyValue=\"tc-chooser-item\"><div class=<<cls>>>\n<$link to=<<storyview>>><$transclude tiddler=<<icon>>/><$text text=<<storyview>>/></$link>\n</div>\n</$set>\n</$list>\n</div>\n</$linkcatcher>"
}
}
}
\whitespace trim
\define title-styles()
fill:$(foregroundColor)$;
\end
\define config-title()
$:/config/ViewToolbarButtons/Visibility/$(listItem)$
\end
<div class="tc-tiddler-title">
<div class="tc-titlebar">
<span class="tc-tiddler-controls">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/ViewToolbar]!has[draft.of]]" variable="listItem"><$reveal type="nomatch" state=<<config-title>> text="hide"><$set name="tv-config-toolbar-class" filter="[<tv-config-toolbar-class>] [<listItem>encodeuricomponent[]addprefix[tc-btn-]]"><$transclude tiddler=<<listItem>>/></$set></$reveal></$list>
</span>
<$set name="tv-wikilinks" value={{$:/config/Tiddlers/TitleLinks}}>
<$link>
<$set name="foregroundColor" value={{!!color}}>
<span class="tc-tiddler-title-icon" style=<<title-styles>>>
<$transclude tiddler={{!!icon}}>
<$transclude tiddler={{$:/config/DefaultTiddlerIcon}}/>
</$transclude>
<$list filter="[all[current]field:a-actions[1]]">
<$transclude tiddler="OneAction"/>
</$list>
<$list filter="[all[current]field:a-actions[2]]">
<$transclude tiddler="TwoAction"/>
</$list>
<$list filter="[all[current]field:a-actions[3]]">
<$transclude tiddler="ThreeAction"/>
</$list>
<$list filter="[all[current]tag[Ritual]]">
<$transclude tiddler="RitualIcon"/>
</$list>
<$list filter="[all[current]tag[Free]]">
<$transclude tiddler="FreeAction"/>
</$list>
<$list filter="[all[current]tag[Reaction]]">
<$transclude tiddler="ReactionIcon"/>
</$list>
<$list filter="[all[current]!tag[Ritual]has[m-time]]">
<$transclude tiddler="ClockIcon"/>
</$list>
<$list filter="[all[current]has[a-time]]">
<$transclude tiddler="ClockIcon"/>
</$list>
<$list filter="[all[current]!tag[Reaction]!tag[Free]!has[a-actions]!has[m-time]]">
<$list filter="[list[!!m-components]count[]compare:number:eq[1]]">
<$transclude tiddler="OneAction"/>
</$list>
<$list filter="[list[!!m-components]count[]compare:number:eq[2]]">
<$transclude tiddler="TwoAction"/>
</$list>
<$list filter="[list[!!m-components]count[]compare:number:eq[3]]">
<$transclude tiddler="ThreeAction"/>
</$list></$list>
</span>
</$set>
<$list filter="[all[current]removeprefix[$:/]]">
<h2 class="tc-title" title={{$:/language/SystemTiddler/Tooltip}}>
<span class="tc-system-title-prefix">$:/</span><$text text=<<currentTiddler>>/>
</h2>
</$list>
<$list filter="[all[current]!prefix[$:/]]">
<h2 class="tc-title">
<$view field="title"/>
</h2>
</$list>
</$link>
</$set>
</div>
<$reveal type="nomatch" text="" default="" state=<<tiddlerInfoState>> class="tc-tiddler-info tc-popup-handle" animate="yes" retain="yes">
<$list filter="[all[shadows+tiddlers]tag[$:/tags/TiddlerInfoSegment]!has[draft.of]] [[$:/core/ui/TiddlerInfo]]" variable="listItem"><$transclude tiddler=<<listItem>> mode="block"/></$list>
</$reveal>
</div>
background: #282a36
untagged-background: #6272a4
foreground: #f8f8f2
tiddler-border: #44475a
page-background: #282a36
primary: #8be9fd
tag-background: #bd93f9
muted-foreground: rgba(255,255,255,0.5)
alert-background: <<colour tag-background>>
alert-border: <<colour tag-background>>
alert-highlight: <<colour primary>>
alert-muted-foreground: <<colour muted-foreground>>
blockquote-bar: <<colour muted-foreground>>
button-background: <<colour tag-background>>
button-foreground: <<colour foreground>>
button-border: <<colour tag-background>>
code-background: <<colour page-background>>
code-border: <<colour page-background>>
code-foreground: <<colour muted-foreground>>
dirty-indicator: <<colour primary>>
download-background: <<colour tag-background>>
download-foreground: <<colour background>>
dragger-background: <<colour foreground>>
dragger-foreground: <<colour background>>
dropdown-background: <<colour background>>
dropdown-border: <<colour background>>
dropdown-tab-background-selected: <<colour background>>
dropdown-tab-background: <<colour background>>
dropzone-background: <<colour primary>>
external-link-background-hover: inherit
external-link-background-visited: inherit
external-link-background: inherit
external-link-foreground-hover: inherit
external-link-foreground-visited: <<colour tag-background>>
external-link-foreground: <<color primary>>
message-background: <<colour tag-background>>
message-border: <<colour tag-background>>
message-foreground: <<colour foreground>>
modal-backdrop: <<colour page-background>>
modal-background: <<colour background>>
modal-border: <<colour background>>
modal-footer-background: <<colour background>>
modal-footer-border: <<colour background>>
modal-header-border: <<colour muted-foreground>>
notification-background: <<colour tag-background>>
notification-border: <<colour tag-background>>
pre-background: <<colour page-background>>
pre-border: <<colour page-background>>
sidebar-button-foreground: <<colour foreground>>
sidebar-controls-foreground-hover: <<colour primary>>
sidebar-controls-foreground: <<colour muted-foreground>>
sidebar-foreground-shadow: transparent
sidebar-foreground: <<colour foreground>>
sidebar-muted-foreground-hover: <<colour primary>>
sidebar-muted-foreground: <<colour muted-foreground>>
sidebar-tab-background-selected: <<colour page-background>>
sidebar-tab-background: transparent
sidebar-tab-border-selected: <<colour tiddler-border>>
sidebar-tab-border: <<colour tiddler-border>>
sidebar-tab-divider: <<colour tiddler-border>>
sidebar-tab-foreground-selected: <<colour primary>>
sidebar-tab-foreground: <<colour foreground>>
sidebar-tiddler-link-foreground-hover: <<colour primary>>
sidebar-tiddler-link-foreground: <<colour primary>>
site-title-foreground: <<colour foreground>>
static-alert-foreground: <<colour foreground>>
tab-background-selected: <<colour background>>
tab-background: transparent
tab-border-selected: <<colour tiddler-border>>
tab-border: <<colour tiddler-border>>
tab-divider: <<colour tiddler-border>>
tab-foreground-selected: <<colour primary>>
tab-foreground: <<colour muted-foreground>>
table-border: <<colour page-background>>
table-footer-background: rgba(0, 0, 0, 0.1)
table-header-background: rgba(0, 0, 0, 0.2)
tag-foreground: <<colour foreground>>
tiddler-background: <<colour background>>
tiddler-controls-foreground-hover: inherit
tiddler-controls-foreground-selected: <<colour foreground>>
tiddler-controls-foreground: <<colour forground>>
tiddler-editor-background: <<colour background>>
tiddler-editor-border-image: <<colour background>>
tiddler-editor-border: rgba(255,255,255,0.1)
tiddler-editor-fields-even: <<colour tiddler-border>>
tiddler-editor-fields-odd: <<colour page-background>>
tiddler-info-background: <<colour background>>
tiddler-info-border: <<colour page-background>>
tiddler-info-tab-background: <<colour background>>
tiddler-link-background: <<colour background>>
tiddler-link-foreground: <<colour primary>>
tiddler-subtitle-foreground: <<colour muted-foreground>>
tiddler-title-foreground: <<colour primary>>
very-muted-foreground: rgba(255,255,255,0.2)
{
"tiddlers": {
"$:/plugins/tiddlywiki/highlight/highlight.js": {
"text": "var hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\n/*! highlight.js v9.18.1 | BSD3 License | git.io/hljslicense */\n!function(e){var n=\"object\"==typeof window&&window||\"object\"==typeof self&&self;\"undefined\"==typeof exports||exports.nodeType?n&&(n.hljs=e({}),\"function\"==typeof define&&define.amd&&define([],function(){return n.hljs})):e(exports)}(function(a){var f=[],i=Object.keys,_={},c={},C=!0,n=/^(no-?highlight|plain|text)$/i,l=/\\blang(?:uage)?-([\\w-]+)\\b/i,t=/((^(<[^>]+>|\\t|)+|(?:\\n)))/gm,r={case_insensitive:\"cI\",lexemes:\"l\",contains:\"c\",keywords:\"k\",subLanguage:\"sL\",className:\"cN\",begin:\"b\",beginKeywords:\"bK\",end:\"e\",endsWithParent:\"eW\",illegal:\"i\",excludeBegin:\"eB\",excludeEnd:\"eE\",returnBegin:\"rB\",returnEnd:\"rE\",variants:\"v\",IDENT_RE:\"IR\",UNDERSCORE_IDENT_RE:\"UIR\",NUMBER_RE:\"NR\",C_NUMBER_RE:\"CNR\",BINARY_NUMBER_RE:\"BNR\",RE_STARTERS_RE:\"RSR\",BACKSLASH_ESCAPE:\"BE\",APOS_STRING_MODE:\"ASM\",QUOTE_STRING_MODE:\"QSM\",PHRASAL_WORDS_MODE:\"PWM\",C_LINE_COMMENT_MODE:\"CLCM\",C_BLOCK_COMMENT_MODE:\"CBCM\",HASH_COMMENT_MODE:\"HCM\",NUMBER_MODE:\"NM\",C_NUMBER_MODE:\"CNM\",BINARY_NUMBER_MODE:\"BNM\",CSS_NUMBER_MODE:\"CSSNM\",REGEXP_MODE:\"RM\",TITLE_MODE:\"TM\",UNDERSCORE_TITLE_MODE:\"UTM\",COMMENT:\"C\",beginRe:\"bR\",endRe:\"eR\",illegalRe:\"iR\",lexemesRe:\"lR\",terminators:\"t\",terminator_end:\"tE\"},m=\"</span>\",O=\"Could not find the language '{}', did you forget to load/include a language module?\",B={classPrefix:\"hljs-\",tabReplace:null,useBR:!1,languages:void 0},o=\"of and for in not or if then\".split(\" \");function x(e){return e.replace(/&/g,\"&\").replace(/</g,\"<\").replace(/>/g,\">\")}function g(e){return e.nodeName.toLowerCase()}function u(e){return n.test(e)}function s(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function E(e){var a=[];return function e(n,t){for(var r=n.firstChild;r;r=r.nextSibling)3===r.nodeType?t+=r.nodeValue.length:1===r.nodeType&&(a.push({event:\"start\",offset:t,node:r}),t=e(r,t),g(r).match(/br|hr|img|input/)||a.push({event:\"stop\",offset:t,node:r}));return t}(e,0),a}function d(e,n,t){var r=0,a=\"\",i=[];function o(){return e.length&&n.length?e[0].offset!==n[0].offset?e[0].offset<n[0].offset?e:n:\"start\"===n[0].event?e:n:e.length?e:n}function c(e){a+=\"<\"+g(e)+f.map.call(e.attributes,function(e){return\" \"+e.nodeName+'=\"'+x(e.value).replace(/\"/g,\""\")+'\"'}).join(\"\")+\">\"}function l(e){a+=\"</\"+g(e)+\">\"}function u(e){(\"start\"===e.event?c:l)(e.node)}for(;e.length||n.length;){var s=o();if(a+=x(t.substring(r,s[0].offset)),r=s[0].offset,s===e){for(i.reverse().forEach(l);u(s.splice(0,1)[0]),(s=o())===e&&s.length&&s[0].offset===r;);i.reverse().forEach(c)}else\"start\"===s[0].event?i.push(s[0].node):i.pop(),u(s.splice(0,1)[0])}return a+x(t.substr(r))}function R(n){return n.v&&!n.cached_variants&&(n.cached_variants=n.v.map(function(e){return s(n,{v:null},e)})),n.cached_variants?n.cached_variants:function e(n){return!!n&&(n.eW||e(n.starts))}(n)?[s(n,{starts:n.starts?s(n.starts):null})]:Object.isFrozen(n)?[s(n)]:[n]}function p(e){if(r&&!e.langApiRestored){for(var n in e.langApiRestored=!0,r)e[n]&&(e[r[n]]=e[n]);(e.c||[]).concat(e.v||[]).forEach(p)}}function v(n,r){var a={};return\"string\"==typeof n?t(\"keyword\",n):i(n).forEach(function(e){t(e,n[e])}),a;function t(t,e){r&&(e=e.toLowerCase()),e.split(\" \").forEach(function(e){var n=e.split(\"|\");a[n[0]]=[t,function(e,n){return n?Number(n):function(e){return-1!=o.indexOf(e.toLowerCase())}(e)?0:1}(n[0],n[1])]})}}function S(r){function s(e){return e&&e.source||e}function f(e,n){return new RegExp(s(e),\"m\"+(r.cI?\"i\":\"\")+(n?\"g\":\"\"))}function a(a){var i,e,o={},c=[],l={},t=1;function n(e,n){o[t]=e,c.push([e,n]),t+=function(e){return new RegExp(e.toString()+\"|\").exec(\"\").length-1}(n)+1}for(var r=0;r<a.c.length;r++){n(e=a.c[r],e.bK?\"\\\\.?(?:\"+e.b+\")\\\\.?\":e.b)}a.tE&&n(\"end\",a.tE),a.i&&n(\"illegal\",a.i);var u=c.map(function(e){return e[1]});return i=f(function(e,n){for(var t=/\\[(?:[^\\\\\\]]|\\\\.)*\\]|\\(\\??|\\\\([1-9][0-9]*)|\\\\./,r=0,a=\"\",i=0;i<e.length;i++){var o=r+=1,c=s(e[i]);for(0<i&&(a+=n),a+=\"(\";0<c.length;){var l=t.exec(c);if(null==l){a+=c;break}a+=c.substring(0,l.index),c=c.substring(l.index+l[0].length),\"\\\\\"==l[0][0]&&l[1]?a+=\"\\\\\"+String(Number(l[1])+o):(a+=l[0],\"(\"==l[0]&&r++)}a+=\")\"}return a}(u,\"|\"),!0),l.lastIndex=0,l.exec=function(e){var n;if(0===c.length)return null;i.lastIndex=l.lastIndex;var t=i.exec(e);if(!t)return null;for(var r=0;r<t.length;r++)if(null!=t[r]&&null!=o[\"\"+r]){n=o[\"\"+r];break}return\"string\"==typeof n?(t.type=n,t.extra=[a.i,a.tE]):(t.type=\"begin\",t.rule=n),t},l}if(r.c&&-1!=r.c.indexOf(\"self\")){if(!C)throw new Error(\"ERR: contains `self` is not supported at the top-level of a language. See documentation.\");r.c=r.c.filter(function(e){return\"self\"!=e})}!function n(t,e){t.compiled||(t.compiled=!0,t.k=t.k||t.bK,t.k&&(t.k=v(t.k,r.cI)),t.lR=f(t.l||/\\w+/,!0),e&&(t.bK&&(t.b=\"\\\\b(\"+t.bK.split(\" \").join(\"|\")+\")\\\\b\"),t.b||(t.b=/\\B|\\b/),t.bR=f(t.b),t.endSameAsBegin&&(t.e=t.b),t.e||t.eW||(t.e=/\\B|\\b/),t.e&&(t.eR=f(t.e)),t.tE=s(t.e)||\"\",t.eW&&e.tE&&(t.tE+=(t.e?\"|\":\"\")+e.tE)),t.i&&(t.iR=f(t.i)),null==t.relevance&&(t.relevance=1),t.c||(t.c=[]),t.c=Array.prototype.concat.apply([],t.c.map(function(e){return R(\"self\"===e?t:e)})),t.c.forEach(function(e){n(e,t)}),t.starts&&n(t.starts,e),t.t=a(t))}(r)}function T(n,e,a,t){var i=e;function o(e,n){if(function(e,n){var t=e&&e.exec(n);return t&&0===t.index}(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}if(e.eW)return o(e.parent,n)}function c(e,n,t,r){if(!t&&\"\"===n)return\"\";if(!e)return n;var a='<span class=\"'+(r?\"\":B.classPrefix);return(a+=e+'\">')+n+(t?\"\":m)}function l(){p+=null!=d.sL?function(){var e=\"string\"==typeof d.sL;if(e&&!_[d.sL])return x(v);var n=e?T(d.sL,v,!0,R[d.sL]):w(v,d.sL.length?d.sL:void 0);return 0<d.relevance&&(M+=n.relevance),e&&(R[d.sL]=n.top),c(n.language,n.value,!1,!0)}():function(){var e,n,t,r,a,i,o;if(!d.k)return x(v);for(r=\"\",n=0,d.lR.lastIndex=0,t=d.lR.exec(v);t;)r+=x(v.substring(n,t.index)),a=d,i=t,void 0,o=g.cI?i[0].toLowerCase():i[0],(e=a.k.hasOwnProperty(o)&&a.k[o])?(M+=e[1],r+=c(e[0],x(t[0]))):r+=x(t[0]),n=d.lR.lastIndex,t=d.lR.exec(v);return r+x(v.substr(n))}(),v=\"\"}function u(e){p+=e.cN?c(e.cN,\"\",!0):\"\",d=Object.create(e,{parent:{value:d}})}function s(e){var n=e[0],t=e.rule;return t&&t.endSameAsBegin&&(t.eR=function(e){return new RegExp(e.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\"),\"m\")}(n)),t.skip?v+=n:(t.eB&&(v+=n),l(),t.rB||t.eB||(v=n)),u(t),t.rB?0:n.length}var f={};function r(e,n){var t=n&&n[0];if(v+=e,null==t)return l(),0;if(\"begin\"==f.type&&\"end\"==n.type&&f.index==n.index&&\"\"===t)return v+=i.slice(n.index,n.index+1),1;if(\"begin\"===(f=n).type)return s(n);if(\"illegal\"===n.type&&!a)throw new Error('Illegal lexeme \"'+t+'\" for mode \"'+(d.cN||\"<unnamed>\")+'\"');if(\"end\"===n.type){var r=function(e){var n=e[0],t=i.substr(e.index),r=o(d,t);if(r){var a=d;for(a.skip?v+=n:(a.rE||a.eE||(v+=n),l(),a.eE&&(v=n));d.cN&&(p+=m),d.skip||d.sL||(M+=d.relevance),(d=d.parent)!==r.parent;);return r.starts&&(r.endSameAsBegin&&(r.starts.eR=r.eR),u(r.starts)),a.rE?0:n.length}}(n);if(null!=r)return r}return v+=t,t.length}var g=D(n);if(!g)throw console.error(O.replace(\"{}\",n)),new Error('Unknown language: \"'+n+'\"');S(g);var E,d=t||g,R={},p=\"\";for(E=d;E!==g;E=E.parent)E.cN&&(p=c(E.cN,\"\",!0)+p);var v=\"\",M=0;try{for(var b,h,N=0;d.t.lastIndex=N,b=d.t.exec(i);)h=r(i.substring(N,b.index),b),N=b.index+h;for(r(i.substr(N)),E=d;E.parent;E=E.parent)E.cN&&(p+=m);return{relevance:M,value:p,i:!1,language:n,top:d}}catch(e){if(e.message&&-1!==e.message.indexOf(\"Illegal\"))return{i:!0,relevance:0,value:x(i)};if(C)return{relevance:0,value:x(i),language:n,top:d,errorRaised:e};throw e}}function w(t,e){e=e||B.languages||i(_);var r={relevance:0,value:x(t)},a=r;return e.filter(D).filter(L).forEach(function(e){var n=T(e,t,!1);n.language=e,n.relevance>a.relevance&&(a=n),n.relevance>r.relevance&&(a=r,r=n)}),a.language&&(r.second_best=a),r}function M(e){return B.tabReplace||B.useBR?e.replace(t,function(e,n){return B.useBR&&\"\\n\"===e?\"<br>\":B.tabReplace?n.replace(/\\t/g,B.tabReplace):\"\"}):e}function b(e){var n,t,r,a,i,o=function(e){var n,t,r,a,i=e.className+\" \";if(i+=e.parentNode?e.parentNode.className:\"\",t=l.exec(i)){var o=D(t[1]);return o||(console.warn(O.replace(\"{}\",t[1])),console.warn(\"Falling back to no-highlight mode for this block.\",e)),o?t[1]:\"no-highlight\"}for(n=0,r=(i=i.split(/\\s+/)).length;n<r;n++)if(u(a=i[n])||D(a))return a}(e);u(o)||(B.useBR?(n=document.createElement(\"div\")).innerHTML=e.innerHTML.replace(/\\n/g,\"\").replace(/<br[ \\/]*>/g,\"\\n\"):n=e,i=n.textContent,r=o?T(o,i,!0):w(i),(t=E(n)).length&&((a=document.createElement(\"div\")).innerHTML=r.value,r.value=d(t,E(a),i)),r.value=M(r.value),e.innerHTML=r.value,e.className=function(e,n,t){var r=n?c[n]:t,a=[e.trim()];return e.match(/\\bhljs\\b/)||a.push(\"hljs\"),-1===e.indexOf(r)&&a.push(r),a.join(\" \").trim()}(e.className,o,r.language),e.result={language:r.language,re:r.relevance},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.relevance}))}function h(){if(!h.called){h.called=!0;var e=document.querySelectorAll(\"pre code\");f.forEach.call(e,b)}}var N={disableAutodetect:!0};function D(e){return e=(e||\"\").toLowerCase(),_[e]||_[c[e]]}function L(e){var n=D(e);return n&&!n.disableAutodetect}return a.highlight=T,a.highlightAuto=w,a.fixMarkup=M,a.highlightBlock=b,a.configure=function(e){B=s(B,e)},a.initHighlighting=h,a.initHighlightingOnLoad=function(){window.addEventListener(\"DOMContentLoaded\",h,!1),window.addEventListener(\"load\",h,!1)},a.registerLanguage=function(n,e){var t;try{t=e(a)}catch(e){if(console.error(\"Language definition for '{}' could not be registered.\".replace(\"{}\",n)),!C)throw e;console.error(e),t=N}p(_[n]=t),t.rawDefinition=e.bind(null,a),t.aliases&&t.aliases.forEach(function(e){c[e]=n})},a.listLanguages=function(){return i(_)},a.getLanguage=D,a.requireLanguage=function(e){var n=D(e);if(n)return n;throw new Error(\"The '{}' language is required, but not loaded.\".replace(\"{}\",e))},a.autoDetection=L,a.inherit=s,a.debugMode=function(){C=!1},a.IR=a.IDENT_RE=\"[a-zA-Z]\\\\w*\",a.UIR=a.UNDERSCORE_IDENT_RE=\"[a-zA-Z_]\\\\w*\",a.NR=a.NUMBER_RE=\"\\\\b\\\\d+(\\\\.\\\\d+)?\",a.CNR=a.C_NUMBER_RE=\"(-?)(\\\\b0[xX][a-fA-F0-9]+|(\\\\b\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)([eE][-+]?\\\\d+)?)\",a.BNR=a.BINARY_NUMBER_RE=\"\\\\b(0b[01]+)\",a.RSR=a.RE_STARTERS_RE=\"!|!=|!==|%|%=|&|&&|&=|\\\\*|\\\\*=|\\\\+|\\\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\\\?|\\\\[|\\\\{|\\\\(|\\\\^|\\\\^=|\\\\||\\\\|=|\\\\|\\\\||~\",a.BE=a.BACKSLASH_ESCAPE={b:\"\\\\\\\\[\\\\s\\\\S]\",relevance:0},a.ASM=a.APOS_STRING_MODE={cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\",c:[a.BE]},a.QSM=a.QUOTE_STRING_MODE={cN:\"string\",b:'\"',e:'\"',i:\"\\\\n\",c:[a.BE]},a.PWM=a.PHRASAL_WORDS_MODE={b:/\\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\\b/},a.C=a.COMMENT=function(e,n,t){var r=a.inherit({cN:\"comment\",b:e,e:n,c:[]},t||{});return r.c.push(a.PWM),r.c.push({cN:\"doctag\",b:\"(?:TODO|FIXME|NOTE|BUG|XXX):\",relevance:0}),r},a.CLCM=a.C_LINE_COMMENT_MODE=a.C(\"//\",\"$\"),a.CBCM=a.C_BLOCK_COMMENT_MODE=a.C(\"/\\\\*\",\"\\\\*/\"),a.HCM=a.HASH_COMMENT_MODE=a.C(\"#\",\"$\"),a.NM=a.NUMBER_MODE={cN:\"number\",b:a.NR,relevance:0},a.CNM=a.C_NUMBER_MODE={cN:\"number\",b:a.CNR,relevance:0},a.BNM=a.BINARY_NUMBER_MODE={cN:\"number\",b:a.BNR,relevance:0},a.CSSNM=a.CSS_NUMBER_MODE={cN:\"number\",b:a.NR+\"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?\",relevance:0},a.RM=a.REGEXP_MODE={cN:\"regexp\",b:/\\//,e:/\\/[gimuy]*/,i:/\\n/,c:[a.BE,{b:/\\[/,e:/\\]/,relevance:0,c:[a.BE]}]},a.TM=a.TITLE_MODE={cN:\"title\",b:a.IR,relevance:0},a.UTM=a.UNDERSCORE_TITLE_MODE={cN:\"title\",b:a.UIR,relevance:0},a.METHOD_GUARD={b:\"\\\\.\\\\s*\"+a.UIR,relevance:0},[a.BE,a.ASM,a.QSM,a.PWM,a.C,a.CLCM,a.CBCM,a.HCM,a.NM,a.CNM,a.BNM,a.CSSNM,a.RM,a.TM,a.UTM,a.METHOD_GUARD].forEach(function(e){!function n(t){Object.freeze(t);var r=\"function\"==typeof t;Object.getOwnPropertyNames(t).forEach(function(e){!t.hasOwnProperty(e)||null===t[e]||\"object\"!=typeof t[e]&&\"function\"!=typeof t[e]||r&&(\"caller\"===e||\"callee\"===e||\"arguments\"===e)||Object.isFrozen(t[e])||n(t[e])});return t}(e)}),a});hljs.registerLanguage(\"swift\",function(e){var i={keyword:\"#available #colorLiteral #column #else #elseif #endif #file #fileLiteral #function #if #imageLiteral #line #selector #sourceLocation _ __COLUMN__ __FILE__ __FUNCTION__ __LINE__ Any as as! as? associatedtype associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet\",literal:\"true false nil\",built_in:\"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip\"},t=e.C(\"/\\\\*\",\"\\\\*/\",{c:[\"self\"]}),n={cN:\"subst\",b:/\\\\\\(/,e:\"\\\\)\",k:i,c:[]},r={cN:\"string\",c:[e.BE,n],v:[{b:/\"\"\"/,e:/\"\"\"/},{b:/\"/,e:/\"/}]},a={cN:\"number\",b:\"\\\\b([\\\\d_]+(\\\\.[\\\\deE_]+)?|0x[a-fA-F0-9_]+(\\\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\\\b\",relevance:0};return n.c=[a],{k:i,c:[r,e.CLCM,t,{cN:\"type\",b:\"\\\\b[A-Z][\\\\wÀ-ʸ']*[!?]\"},{cN:\"type\",b:\"\\\\b[A-Z][\\\\wÀ-ʸ']*\",relevance:0},a,{cN:\"function\",bK:\"func\",e:\"{\",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{b:/</,e:/>/},{cN:\"params\",b:/\\(/,e:/\\)/,endsParent:!0,k:i,c:[\"self\",a,r,e.CBCM,{b:\":\"}],i:/[\"']/}],i:/\\[|%/},{cN:\"class\",bK:\"struct protocol class extension enum\",k:i,e:\"\\\\{\",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][\\u00C0-\\u02B80-9A-Za-z$_]*/})]},{cN:\"meta\",b:\"(@discardableResult|@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@objcMembers|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain|@dynamicMemberLookup|@propertyWrapper)\"},{bK:\"import\",e:/$/,c:[e.CLCM,t]}]}});hljs.registerLanguage(\"less\",function(e){function r(e){return{cN:\"string\",b:\"~?\"+e+\".*?\"+e}}function t(e,r,t){return{cN:e,b:r,relevance:t}}var a=\"[\\\\w-]+\",c=\"(\"+a+\"|@{\"+a+\"})\",s=[],n=[],b={b:\"\\\\(\",e:\"\\\\)\",c:n,relevance:0};n.push(e.CLCM,e.CBCM,r(\"'\"),r('\"'),e.CSSNM,{b:\"(url|data-uri)\\\\(\",starts:{cN:\"string\",e:\"[\\\\)\\\\n]\",eE:!0}},t(\"number\",\"#[0-9A-Fa-f]+\\\\b\"),b,t(\"variable\",\"@@?\"+a,10),t(\"variable\",\"@{\"+a+\"}\"),t(\"built_in\",\"~?`[^`]*?`\"),{cN:\"attribute\",b:a+\"\\\\s*:\",e:\":\",rB:!0,eE:!0},{cN:\"meta\",b:\"!important\"});var i=n.concat({b:\"{\",e:\"}\",c:s}),l={bK:\"when\",eW:!0,c:[{bK:\"and not\"}].concat(n)},o={b:c+\"\\\\s*:\",rB:!0,e:\"[;}]\",relevance:0,c:[{cN:\"attribute\",b:c,e:\":\",eE:!0,starts:{eW:!0,i:\"[<=$]\",relevance:0,c:n}}]},u={cN:\"keyword\",b:\"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\\\b\",starts:{e:\"[;{}]\",rE:!0,c:n,relevance:0}},v={cN:\"variable\",v:[{b:\"@\"+a+\"\\\\s*:\",relevance:15},{b:\"@\"+a}],starts:{e:\"[;}]\",rE:!0,c:i}},C={v:[{b:\"[\\\\.#:&\\\\[>]\",e:\"[;{}]\"},{b:c,e:\"{\"}],rB:!0,rE:!0,i:\"[<='$\\\"]\",relevance:0,c:[e.CLCM,e.CBCM,l,t(\"keyword\",\"all\\\\b\"),t(\"variable\",\"@{\"+a+\"}\"),t(\"selector-tag\",c+\"%?\",0),t(\"selector-id\",\"#\"+c),t(\"selector-class\",\"\\\\.\"+c,0),t(\"selector-tag\",\"&\",0),{cN:\"selector-attr\",b:\"\\\\[\",e:\"\\\\]\"},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"\\\\(\",e:\"\\\\)\",c:i},{b:\"!important\"}]};return s.push(e.CLCM,e.CBCM,u,v,o,C),{cI:!0,i:\"[=>'/<($\\\"]\",c:s}});hljs.registerLanguage(\"armasm\",function(s){return{cI:!0,aliases:[\"arm\"],l:\"\\\\.?\"+s.IR,k:{meta:\".2byte .4byte .align .ascii .asciz .balign .byte .code .data .else .end .endif .endm .endr .equ .err .exitm .extern .global .hword .if .ifdef .ifndef .include .irp .long .macro .rept .req .section .set .skip .space .text .word .arm .thumb .code16 .code32 .force_thumb .thumb_func .ltorg ALIAS ALIGN ARM AREA ASSERT ATTR CN CODE CODE16 CODE32 COMMON CP DATA DCB DCD DCDU DCDO DCFD DCFDU DCI DCQ DCQU DCW DCWU DN ELIF ELSE END ENDFUNC ENDIF ENDP ENTRY EQU EXPORT EXPORTAS EXTERN FIELD FILL FUNCTION GBLA GBLL GBLS GET GLOBAL IF IMPORT INCBIN INCLUDE INFO KEEP LCLA LCLL LCLS LTORG MACRO MAP MEND MEXIT NOFP OPT PRESERVE8 PROC QN READONLY RELOC REQUIRE REQUIRE8 RLIST FN ROUT SETA SETL SETS SN SPACE SUBT THUMB THUMBX TTL WHILE WEND \",built_in:\"r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 r12 r13 r14 r15 pc lr sp ip sl sb fp a1 a2 a3 a4 v1 v2 v3 v4 v5 v6 v7 v8 f0 f1 f2 f3 f4 f5 f6 f7 p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 c0 c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 c13 c14 c15 q0 q1 q2 q3 q4 q5 q6 q7 q8 q9 q10 q11 q12 q13 q14 q15 cpsr_c cpsr_x cpsr_s cpsr_f cpsr_cx cpsr_cxs cpsr_xs cpsr_xsf cpsr_sf cpsr_cxsf spsr_c spsr_x spsr_s spsr_f spsr_cx spsr_cxs spsr_xs spsr_xsf spsr_sf spsr_cxsf s0 s1 s2 s3 s4 s5 s6 s7 s8 s9 s10 s11 s12 s13 s14 s15 s16 s17 s18 s19 s20 s21 s22 s23 s24 s25 s26 s27 s28 s29 s30 s31 d0 d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 d21 d22 d23 d24 d25 d26 d27 d28 d29 d30 d31 {PC} {VAR} {TRUE} {FALSE} {OPT} {CONFIG} {ENDIAN} {CODESIZE} {CPU} {FPU} {ARCHITECTURE} {PCSTOREOFFSET} {ARMASM_VERSION} {INTER} {ROPI} {RWPI} {SWST} {NOSWST} . @\"},c:[{cN:\"keyword\",b:\"\\\\b(adc|(qd?|sh?|u[qh]?)?add(8|16)?|usada?8|(q|sh?|u[qh]?)?(as|sa)x|and|adrl?|sbc|rs[bc]|asr|b[lx]?|blx|bxj|cbn?z|tb[bh]|bic|bfc|bfi|[su]bfx|bkpt|cdp2?|clz|clrex|cmp|cmn|cpsi[ed]|cps|setend|dbg|dmb|dsb|eor|isb|it[te]{0,3}|lsl|lsr|ror|rrx|ldm(([id][ab])|f[ds])?|ldr((s|ex)?[bhd])?|movt?|mvn|mra|mar|mul|[us]mull|smul[bwt][bt]|smu[as]d|smmul|smmla|mla|umlaal|smlal?([wbt][bt]|d)|mls|smlsl?[ds]|smc|svc|sev|mia([bt]{2}|ph)?|mrr?c2?|mcrr2?|mrs|msr|orr|orn|pkh(tb|bt)|rbit|rev(16|sh)?|sel|[su]sat(16)?|nop|pop|push|rfe([id][ab])?|stm([id][ab])?|str(ex)?[bhd]?|(qd?)?sub|(sh?|q|u[qh]?)?sub(8|16)|[su]xt(a?h|a?b(16)?)|srs([id][ab])?|swpb?|swi|smi|tst|teq|wfe|wfi|yield)(eq|ne|cs|cc|mi|pl|vs|vc|hi|ls|ge|lt|gt|le|al|hs|lo)?[sptrx]?\",e:\"\\\\s\"},s.C(\"[;@]\",\"$\",{relevance:0}),s.CBCM,s.QSM,{cN:\"string\",b:\"'\",e:\"[^\\\\\\\\]'\",relevance:0},{cN:\"title\",b:\"\\\\|\",e:\"\\\\|\",i:\"\\\\n\",relevance:0},{cN:\"number\",v:[{b:\"[#$=]?0x[0-9a-f]+\"},{b:\"[#$=]?0b[01]+\"},{b:\"[#$=]\\\\d+\"},{b:\"\\\\b\\\\d+\"}],relevance:0},{cN:\"symbol\",v:[{b:\"^[a-z_\\\\.\\\\$][a-z0-9_\\\\.\\\\$]+\"},{b:\"^\\\\s*[a-z_\\\\.\\\\$][a-z0-9_\\\\.\\\\$]+:\"},{b:\"[=#]\\\\w+\"}],relevance:0}]}});hljs.registerLanguage(\"ruby\",function(e){var c=\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\",b={keyword:\"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor\",literal:\"true false nil\"},r={cN:\"doctag\",b:\"@[A-Za-z]+\"},a={b:\"#<\",e:\">\"},n=[e.C(\"#\",\"$\",{c:[r]}),e.C(\"^\\\\=begin\",\"^\\\\=end\",{c:[r],relevance:10}),e.C(\"^__END__\",\"\\\\n$\")],s={cN:\"subst\",b:\"#\\\\{\",e:\"}\",k:b},t={cN:\"string\",c:[e.BE,s],v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/`/,e:/`/},{b:\"%[qQwWx]?\\\\(\",e:\"\\\\)\"},{b:\"%[qQwWx]?\\\\[\",e:\"\\\\]\"},{b:\"%[qQwWx]?{\",e:\"}\"},{b:\"%[qQwWx]?<\",e:\">\"},{b:\"%[qQwWx]?/\",e:\"/\"},{b:\"%[qQwWx]?%\",e:\"%\"},{b:\"%[qQwWx]?-\",e:\"-\"},{b:\"%[qQwWx]?\\\\|\",e:\"\\\\|\"},{b:/\\B\\?(\\\\\\d{1,3}|\\\\x[A-Fa-f0-9]{1,2}|\\\\u[A-Fa-f0-9]{4}|\\\\?\\S)\\b/},{b:/<<[-~]?'?(\\w+)(?:.|\\n)*?\\n\\s*\\1\\b/,rB:!0,c:[{b:/<<[-~]?'?/},{b:/\\w+/,endSameAsBegin:!0,c:[e.BE,s]}]}]},i={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",endsParent:!0,k:b},l=[t,a,{cN:\"class\",bK:\"class module\",e:\"$|;\",i:/=/,c:[e.inherit(e.TM,{b:\"[A-Za-z_]\\\\w*(::\\\\w+)*(\\\\?|\\\\!)?\"}),{b:\"<\\\\s*\",c:[{b:\"(\"+e.IR+\"::)?\"+e.IR}]}].concat(n)},{cN:\"function\",bK:\"def\",e:\"$|;\",c:[e.inherit(e.TM,{b:c}),i].concat(n)},{b:e.IR+\"::\"},{cN:\"symbol\",b:e.UIR+\"(\\\\!|\\\\?)?:\",relevance:0},{cN:\"symbol\",b:\":(?!\\\\s)\",c:[t,{b:c}],relevance:0},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",relevance:0},{b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{cN:\"params\",b:/\\|/,e:/\\|/,k:b},{b:\"(\"+e.RSR+\"|unless)\\\\s*\",k:\"unless\",c:[a,{cN:\"regexp\",c:[e.BE,s],i:/\\n/,v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r{\",e:\"}[a-z]*\"},{b:\"%r\\\\(\",e:\"\\\\)[a-z]*\"},{b:\"%r!\",e:\"![a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}].concat(n),relevance:0}].concat(n);s.c=l;var d=[{b:/^\\s*=>/,starts:{e:\"$\",c:i.c=l}},{cN:\"meta\",b:\"^([>?]>|[\\\\w#]+\\\\(\\\\w+\\\\):\\\\d+:\\\\d+>|(\\\\w+-)?\\\\d+\\\\.\\\\d+\\\\.\\\\d(p\\\\d+)?[^>]+>)\",starts:{e:\"$\",c:l}}];return{aliases:[\"rb\",\"gemspec\",\"podspec\",\"thor\",\"irb\"],k:b,i:/\\/\\*/,c:n.concat(d).concat(l)}});hljs.registerLanguage(\"lua\",function(e){var t=\"\\\\[=*\\\\[\",a=\"\\\\]=*\\\\]\",n={b:t,e:a,c:[\"self\"]},l=[e.C(\"--(?!\"+t+\")\",\"$\"),e.C(\"--\"+t,a,{c:[n],relevance:10})];return{l:e.UIR,k:{literal:\"true false nil\",keyword:\"and break do else elseif end for goto if in local not or repeat return then until while\",built_in:\"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstringmodule next pairs pcall print rawequal rawget rawset require select setfenvsetmetatable tonumber tostring type unpack xpcall arg selfcoroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove\"},c:l.concat([{cN:\"function\",bK:\"function\",e:\"\\\\)\",c:[e.inherit(e.TM,{b:\"([_a-zA-Z]\\\\w*\\\\.)*([_a-zA-Z]\\\\w*:)?[_a-zA-Z]\\\\w*\"}),{cN:\"params\",b:\"\\\\(\",eW:!0,c:l}].concat(l)},e.CNM,e.ASM,e.QSM,{cN:\"string\",b:t,e:a,c:[n],relevance:5}])}});hljs.registerLanguage(\"matlab\",function(e){var a=\"('|\\\\.')+\",s={relevance:0,c:[{b:a}]};return{k:{keyword:\"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while\",built_in:\"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson max min nanmax nanmin mean nanmean type table readtable writetable sortrows sort figure plot plot3 scatter scatter3 cellfun legend intersect ismember procrustes hold num2cell \"},i:'(//|\"|#|/\\\\*|\\\\s+/\\\\w+)',c:[{cN:\"function\",bK:\"function\",e:\"$\",c:[e.UTM,{cN:\"params\",v:[{b:\"\\\\(\",e:\"\\\\)\"},{b:\"\\\\[\",e:\"\\\\]\"}]}]},{cN:\"built_in\",b:/true|false/,relevance:0,starts:s},{b:\"[a-zA-Z][a-zA-Z_0-9]*\"+a,relevance:0},{cN:\"number\",b:e.CNR,relevance:0,starts:s},{cN:\"string\",b:\"'\",e:\"'\",c:[e.BE,{b:\"''\"}]},{b:/\\]|}|\\)/,relevance:0,starts:s},{cN:\"string\",b:'\"',e:'\"',c:[e.BE,{b:'\"\"'}],starts:s},e.C(\"^\\\\s*\\\\%\\\\{\\\\s*$\",\"^\\\\s*\\\\%\\\\}\\\\s*$\"),e.C(\"\\\\%\",\"$\")]}});hljs.registerLanguage(\"apache\",function(e){var r={cN:\"number\",b:\"[\\\\$%]\\\\d+\"};return{aliases:[\"apacheconf\"],cI:!0,c:[e.HCM,{cN:\"section\",b:\"</?\",e:\">\"},{cN:\"attribute\",b:/\\w+/,relevance:0,k:{nomarkup:\"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername\"},starts:{e:/$/,relevance:0,k:{literal:\"on off all\"},c:[{cN:\"meta\",b:\"\\\\s\\\\[\",e:\"\\\\]$\"},{cN:\"variable\",b:\"[\\\\$%]\\\\{\",e:\"\\\\}\",c:[\"self\",r]},r,e.QSM]}}],i:/\\S/}});hljs.registerLanguage(\"yaml\",function(e){var b=\"true false yes no null\",a={cN:\"string\",relevance:0,v:[{b:/'/,e:/'/},{b:/\"/,e:/\"/},{b:/\\S+/}],c:[e.BE,{cN:\"template-variable\",v:[{b:\"{{\",e:\"}}\"},{b:\"%{\",e:\"}\"}]}]};return{cI:!0,aliases:[\"yml\",\"YAML\",\"yaml\"],c:[{cN:\"attr\",v:[{b:\"\\\\w[\\\\w :\\\\/.-]*:(?=[ \\t]|$)\"},{b:'\"\\\\w[\\\\w :\\\\/.-]*\":(?=[ \\t]|$)'},{b:\"'\\\\w[\\\\w :\\\\/.-]*':(?=[ \\t]|$)\"}]},{cN:\"meta\",b:\"^---s*$\",relevance:10},{cN:\"string\",b:\"[\\\\|>]([0-9]?[+-])?[ ]*\\\\n( *)[\\\\S ]+\\\\n(\\\\2[\\\\S ]+\\\\n?)*\"},{b:\"<%[%=-]?\",e:\"[%-]?%>\",sL:\"ruby\",eB:!0,eE:!0,relevance:0},{cN:\"type\",b:\"!\"+e.UIR},{cN:\"type\",b:\"!!\"+e.UIR},{cN:\"meta\",b:\"&\"+e.UIR+\"$\"},{cN:\"meta\",b:\"\\\\*\"+e.UIR+\"$\"},{cN:\"bullet\",b:\"\\\\-(?=[ ]|$)\",relevance:0},e.HCM,{bK:b,k:{literal:b}},{cN:\"number\",b:e.CNR+\"\\\\b\"},a]}});hljs.registerLanguage(\"plaintext\",function(e){return{disableAutodetect:!0}});hljs.registerLanguage(\"erlang-repl\",function(e){return{k:{built_in:\"spawn spawn_link self\",keyword:\"after and andalso|10 band begin bnot bor bsl bsr bxor case catch cond div end fun if let not of or orelse|10 query receive rem try when xor\"},c:[{cN:\"meta\",b:\"^[0-9]+> \",relevance:10},e.C(\"%\",\"$\"),{cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",relevance:0},e.ASM,e.QSM,{b:\"\\\\?(::)?([A-Z]\\\\w*(::)?)+\"},{b:\"->\"},{b:\"ok\"},{b:\"!\"},{b:\"(\\\\b[a-z'][a-zA-Z0-9_']*:[a-z'][a-zA-Z0-9_']*)|(\\\\b[a-z'][a-zA-Z0-9_']*)\",relevance:0},{b:\"[A-Z][a-zA-Z0-9_']*\",relevance:0}]}});hljs.registerLanguage(\"cmake\",function(e){return{aliases:[\"cmake.in\"],cI:!0,k:{keyword:\"break cmake_host_system_information cmake_minimum_required cmake_parse_arguments cmake_policy configure_file continue elseif else endforeach endfunction endif endmacro endwhile execute_process file find_file find_library find_package find_path find_program foreach function get_cmake_property get_directory_property get_filename_component get_property if include include_guard list macro mark_as_advanced math message option return separate_arguments set_directory_properties set_property set site_name string unset variable_watch while add_compile_definitions add_compile_options add_custom_command add_custom_target add_definitions add_dependencies add_executable add_library add_link_options add_subdirectory add_test aux_source_directory build_command create_test_sourcelist define_property enable_language enable_testing export fltk_wrap_ui get_source_file_property get_target_property get_test_property include_directories include_external_msproject include_regular_expression install link_directories link_libraries load_cache project qt_wrap_cpp qt_wrap_ui remove_definitions set_source_files_properties set_target_properties set_tests_properties source_group target_compile_definitions target_compile_features target_compile_options target_include_directories target_link_directories target_link_libraries target_link_options target_sources try_compile try_run ctest_build ctest_configure ctest_coverage ctest_empty_binary_directory ctest_memcheck ctest_read_custom_files ctest_run_script ctest_sleep ctest_start ctest_submit ctest_test ctest_update ctest_upload build_name exec_program export_library_dependencies install_files install_programs install_targets load_command make_directory output_required_files remove subdir_depends subdirs use_mangled_mesa utility_source variable_requires write_file qt5_use_modules qt5_use_package qt5_wrap_cpp on off true false and or not command policy target test exists is_newer_than is_directory is_symlink is_absolute matches less greater equal less_equal greater_equal strless strgreater strequal strless_equal strgreater_equal version_less version_greater version_equal version_less_equal version_greater_equal in_list defined\"},c:[{cN:\"variable\",b:\"\\\\${\",e:\"}\"},e.HCM,e.QSM,e.NM]}});hljs.registerLanguage(\"kotlin\",function(e){var t={keyword:\"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual trait volatile transient native default\",built_in:\"Byte Short Char Int Long Boolean Float Double Void Unit Nothing\",literal:\"true false null\"},a={cN:\"symbol\",b:e.UIR+\"@\"},n={cN:\"subst\",b:\"\\\\${\",e:\"}\",c:[e.CNM]},c={cN:\"variable\",b:\"\\\\$\"+e.UIR},r={cN:\"string\",v:[{b:'\"\"\"',e:'\"\"\"(?=[^\"])',c:[c,n]},{b:\"'\",e:\"'\",i:/\\n/,c:[e.BE]},{b:'\"',e:'\"',i:/\\n/,c:[e.BE,c,n]}]};n.c.push(r);var i={cN:\"meta\",b:\"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\\\s*:(?:\\\\s*\"+e.UIR+\")?\"},l={cN:\"meta\",b:\"@\"+e.UIR,c:[{b:/\\(/,e:/\\)/,c:[e.inherit(r,{cN:\"meta-string\"})]}]},s={cN:\"number\",b:\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",relevance:0},b=e.C(\"/\\\\*\",\"\\\\*/\",{c:[e.CBCM]}),o={v:[{cN:\"type\",b:e.UIR},{b:/\\(/,e:/\\)/,c:[]}]},d=o;return d.v[1].c=[o],o.v[1].c=[d],{aliases:[\"kt\"],k:t,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,b,{cN:\"keyword\",b:/\\b(break|continue|return|this)\\b/,starts:{c:[{cN:\"symbol\",b:/@\\w+/}]}},a,i,l,{cN:\"function\",bK:\"fun\",e:\"[(]|$\",rB:!0,eE:!0,k:t,i:/fun\\s+(<.*>)?[^\\s\\(]+(\\s+[^\\s\\(]+)\\s*=/,relevance:5,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,relevance:0,c:[e.UTM]},{cN:\"type\",b:/</,e:/>/,k:\"reified\",relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,endsParent:!0,k:t,relevance:0,c:[{b:/:/,e:/[=,\\/]/,eW:!0,c:[o,e.CLCM,b],relevance:0},e.CLCM,b,i,l,r,e.CNM]},b]},{cN:\"class\",bK:\"class interface trait\",e:/[:\\{(]|$/,eE:!0,i:\"extends implements\",c:[{bK:\"public protected internal private constructor\"},e.UTM,{cN:\"type\",b:/</,e:/>/,eB:!0,eE:!0,relevance:0},{cN:\"type\",b:/[,:]\\s*/,e:/[<\\(,]|$/,eB:!0,rE:!0},i,l]},r,{cN:\"meta\",b:\"^#!/usr/bin/env\",e:\"$\",i:\"\\n\"},s]}});hljs.registerLanguage(\"javascript\",function(e){var r=\"<>\",a=\"</>\",t={b:/<[A-Za-z0-9\\\\._:-]+/,e:/\\/[A-Za-z0-9\\\\._:-]+>|\\/>/},c=\"[A-Za-z$_][0-9A-Za-z$_]*\",n={keyword:\"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise\"},s={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)n?\"},{b:\"\\\\b(0[oO][0-7]+)n?\"},{b:e.CNR+\"n?\"}],relevance:0},o={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:n,c:[]},i={b:\"html`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"xml\"}},b={b:\"css`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"css\"}},l={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,o]};o.c=[e.ASM,e.QSM,i,b,l,s,e.RM];var u=o.c.concat([e.CBCM,e.CLCM]);return{aliases:[\"js\",\"jsx\",\"mjs\",\"cjs\"],k:n,c:[{cN:\"meta\",relevance:10,b:/^\\s*['\"]use (strict|asm)['\"]/},{cN:\"meta\",b:/^#!/,e:/$/},e.ASM,e.QSM,i,b,l,e.CLCM,e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{cN:\"doctag\",b:\"@[A-Za-z]+\",c:[{cN:\"type\",b:\"\\\\{\",e:\"\\\\}\",relevance:0},{cN:\"variable\",b:c+\"(?=\\\\s*(-)|$)\",endsParent:!0,relevance:0},{b:/(?=[^\\n])\\s/,relevance:0}]}]}),e.CBCM,s,{b:/[{,\\n]\\s*/,relevance:0,c:[{b:c+\"\\\\s*:\",rB:!0,relevance:0,c:[{cN:\"attr\",b:c,relevance:0}]}]},{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+c+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:c},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:n,c:u}]}]},{cN:\"\",b:/\\s/,e:/\\s*/,skip:!0},{v:[{b:r,e:a},{b:t.b,e:t.e}],sL:\"xml\",c:[{b:t.b,e:t.e,skip:!0,c:[\"self\"]}]}],relevance:0},{cN:\"function\",bK:\"function\",e:/\\{/,eE:!0,c:[e.inherit(e.TM,{b:c}),{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,c:u}],i:/\\[|%/},{b:/\\$[(.]/},e.METHOD_GUARD,{cN:\"class\",bK:\"class\",e:/[{;=]/,eE:!0,i:/[:\"\\[\\]]/,c:[{bK:\"extends\"},e.UTM]},{bK:\"constructor get set\",e:/\\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage(\"scss\",function(e){var t=\"@[a-z-]+\",r={cN:\"variable\",b:\"(\\\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\\\b\"},i={cN:\"number\",b:\"#[0-9A-Fa-f]+\"};e.CSSNM,e.QSM,e.ASM,e.CBCM;return{cI:!0,i:\"[=/|']\",c:[e.CLCM,e.CBCM,{cN:\"selector-id\",b:\"\\\\#[A-Za-z0-9_-]+\",relevance:0},{cN:\"selector-class\",b:\"\\\\.[A-Za-z0-9_-]+\",relevance:0},{cN:\"selector-attr\",b:\"\\\\[\",e:\"\\\\]\",i:\"$\"},{cN:\"selector-tag\",b:\"\\\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\\\b\",relevance:0},{cN:\"selector-pseudo\",b:\":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)\"},{cN:\"selector-pseudo\",b:\"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)\"},r,{cN:\"attribute\",b:\"\\\\b(src|z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\\\b\",i:\"[^\\\\s]\"},{b:\"\\\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\\\b\"},{b:\":\",e:\";\",c:[r,i,e.CSSNM,e.QSM,e.ASM,{cN:\"meta\",b:\"!important\"}]},{b:\"@(page|font-face)\",l:t,k:\"@page @font-face\"},{b:\"@\",e:\"[{;]\",rB:!0,k:\"and or not only\",c:[{b:t,cN:\"keyword\"},r,e.QSM,e.ASM,i,e.CSSNM]}]}});hljs.registerLanguage(\"perl\",function(e){var t=\"getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when\",r={cN:\"subst\",b:\"[$@]\\\\{\",e:\"\\\\}\",k:t},s={b:\"->{\",e:\"}\"},n={v:[{b:/\\$\\d/},{b:/[\\$%@](\\^\\w\\b|#\\w+(::\\w+)*|{\\w+}|\\w+(::\\w*)*)/},{b:/[\\$%@][^\\s\\w{]/,relevance:0}]},c=[e.BE,r,n],a=[n,e.HCM,e.C(\"^\\\\=\\\\w\",\"\\\\=cut\",{eW:!0}),s,{cN:\"string\",c:c,v:[{b:\"q[qwxr]?\\\\s*\\\\(\",e:\"\\\\)\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\[\",e:\"\\\\]\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\{\",e:\"\\\\}\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\|\",e:\"\\\\|\",relevance:5},{b:\"q[qwxr]?\\\\s*\\\\<\",e:\"\\\\>\",relevance:5},{b:\"qw\\\\s+q\",e:\"q\",relevance:5},{b:\"'\",e:\"'\",c:[e.BE]},{b:'\"',e:'\"'},{b:\"`\",e:\"`\",c:[e.BE]},{b:\"{\\\\w+}\",c:[],relevance:0},{b:\"-?\\\\w+\\\\s*\\\\=\\\\>\",c:[],relevance:0}]},{cN:\"number\",b:\"(\\\\b0[0-7_]+)|(\\\\b0x[0-9a-fA-F_]+)|(\\\\b[1-9][0-9_]*(\\\\.[0-9_]+)?)|[0_]\\\\b\",relevance:0},{b:\"(\\\\/\\\\/|\"+e.RSR+\"|\\\\b(split|return|print|reverse|grep)\\\\b)\\\\s*\",k:\"split return print reverse grep\",relevance:0,c:[e.HCM,{cN:\"regexp\",b:\"(s|tr|y)/(\\\\\\\\.|[^/])*/(\\\\\\\\.|[^/])*/[a-z]*\",relevance:10},{cN:\"regexp\",b:\"(m|qr)?/\",e:\"/[a-z]*\",c:[e.BE],relevance:0}]},{cN:\"function\",bK:\"sub\",e:\"(\\\\s*\\\\(.*?\\\\))?[;{]\",eE:!0,relevance:5,c:[e.TM]},{b:\"-\\\\w\\\\b\",relevance:0},{b:\"^__DATA__$\",e:\"^__END__$\",sL:\"mojolicious\",c:[{b:\"^@@.*\",e:\"$\",cN:\"comment\"}]}];return r.c=a,{aliases:[\"pl\",\"pm\"],l:/[\\w\\.]+/,k:t,c:s.c=a}});hljs.registerLanguage(\"go\",function(e){var n={keyword:\"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune\",literal:\"true false iota nil\",built_in:\"append cap close complex copy imag len make new panic print println real recover delete\"};return{aliases:[\"golang\"],k:n,i:\"</\",c:[e.CLCM,e.CBCM,{cN:\"string\",v:[e.QSM,e.ASM,{b:\"`\",e:\"`\"}]},{cN:\"number\",v:[{b:e.CNR+\"[i]\",relevance:1},e.CNM]},{b:/:=/},{cN:\"function\",bK:\"func\",e:\"\\\\s*(\\\\{|$)\",eE:!0,c:[e.TM,{cN:\"params\",b:/\\(/,e:/\\)/,k:n,i:/[\"']/}]}]}});hljs.registerLanguage(\"x86asm\",function(s){return{cI:!0,l:\"[.%]?\"+s.IR,k:{keyword:\"lock rep repe repz repne repnz xaquire xrelease bnd nobnd aaa aad aam aas adc add and arpl bb0_reset bb1_reset bound bsf bsr bswap bt btc btr bts call cbw cdq cdqe clc cld cli clts cmc cmp cmpsb cmpsd cmpsq cmpsw cmpxchg cmpxchg486 cmpxchg8b cmpxchg16b cpuid cpu_read cpu_write cqo cwd cwde daa das dec div dmint emms enter equ f2xm1 fabs fadd faddp fbld fbstp fchs fclex fcmovb fcmovbe fcmove fcmovnb fcmovnbe fcmovne fcmovnu fcmovu fcom fcomi fcomip fcomp fcompp fcos fdecstp fdisi fdiv fdivp fdivr fdivrp femms feni ffree ffreep fiadd ficom ficomp fidiv fidivr fild fimul fincstp finit fist fistp fisttp fisub fisubr fld fld1 fldcw fldenv fldl2e fldl2t fldlg2 fldln2 fldpi fldz fmul fmulp fnclex fndisi fneni fninit fnop fnsave fnstcw fnstenv fnstsw fpatan fprem fprem1 fptan frndint frstor fsave fscale fsetpm fsin fsincos fsqrt fst fstcw fstenv fstp fstsw fsub fsubp fsubr fsubrp ftst fucom fucomi fucomip fucomp fucompp fxam fxch fxtract fyl2x fyl2xp1 hlt ibts icebp idiv imul in inc incbin insb insd insw int int01 int1 int03 int3 into invd invpcid invlpg invlpga iret iretd iretq iretw jcxz jecxz jrcxz jmp jmpe lahf lar lds lea leave les lfence lfs lgdt lgs lidt lldt lmsw loadall loadall286 lodsb lodsd lodsq lodsw loop loope loopne loopnz loopz lsl lss ltr mfence monitor mov movd movq movsb movsd movsq movsw movsx movsxd movzx mul mwait neg nop not or out outsb outsd outsw packssdw packsswb packuswb paddb paddd paddsb paddsiw paddsw paddusb paddusw paddw pand pandn pause paveb pavgusb pcmpeqb pcmpeqd pcmpeqw pcmpgtb pcmpgtd pcmpgtw pdistib pf2id pfacc pfadd pfcmpeq pfcmpge pfcmpgt pfmax pfmin pfmul pfrcp pfrcpit1 pfrcpit2 pfrsqit1 pfrsqrt pfsub pfsubr pi2fd pmachriw pmaddwd pmagw pmulhriw pmulhrwa pmulhrwc pmulhw pmullw pmvgezb pmvlzb pmvnzb pmvzb pop popa popad popaw popf popfd popfq popfw por prefetch prefetchw pslld psllq psllw psrad psraw psrld psrlq psrlw psubb psubd psubsb psubsiw psubsw psubusb psubusw psubw punpckhbw punpckhdq punpckhwd punpcklbw punpckldq punpcklwd push pusha pushad pushaw pushf pushfd pushfq pushfw pxor rcl rcr rdshr rdmsr rdpmc rdtsc rdtscp ret retf retn rol ror rdm rsdc rsldt rsm rsts sahf sal salc sar sbb scasb scasd scasq scasw sfence sgdt shl shld shr shrd sidt sldt skinit smi smint smintold smsw stc std sti stosb stosd stosq stosw str sub svdc svldt svts swapgs syscall sysenter sysexit sysret test ud0 ud1 ud2b ud2 ud2a umov verr verw fwait wbinvd wrshr wrmsr xadd xbts xchg xlatb xlat xor cmove cmovz cmovne cmovnz cmova cmovnbe cmovae cmovnb cmovb cmovnae cmovbe cmovna cmovg cmovnle cmovge cmovnl cmovl cmovnge cmovle cmovng cmovc cmovnc cmovo cmovno cmovs cmovns cmovp cmovpe cmovnp cmovpo je jz jne jnz ja jnbe jae jnb jb jnae jbe jna jg jnle jge jnl jl jnge jle jng jc jnc jo jno js jns jpo jnp jpe jp sete setz setne setnz seta setnbe setae setnb setnc setb setnae setcset setbe setna setg setnle setge setnl setl setnge setle setng sets setns seto setno setpe setp setpo setnp addps addss andnps andps cmpeqps cmpeqss cmpleps cmpless cmpltps cmpltss cmpneqps cmpneqss cmpnleps cmpnless cmpnltps cmpnltss cmpordps cmpordss cmpunordps cmpunordss cmpps cmpss comiss cvtpi2ps cvtps2pi cvtsi2ss cvtss2si cvttps2pi cvttss2si divps divss ldmxcsr maxps maxss minps minss movaps movhps movlhps movlps movhlps movmskps movntps movss movups mulps mulss orps rcpps rcpss rsqrtps rsqrtss shufps sqrtps sqrtss stmxcsr subps subss ucomiss unpckhps unpcklps xorps fxrstor fxrstor64 fxsave fxsave64 xgetbv xsetbv xsave xsave64 xsaveopt xsaveopt64 xrstor xrstor64 prefetchnta prefetcht0 prefetcht1 prefetcht2 maskmovq movntq pavgb pavgw pextrw pinsrw pmaxsw pmaxub pminsw pminub pmovmskb pmulhuw psadbw pshufw pf2iw pfnacc pfpnacc pi2fw pswapd maskmovdqu clflush movntdq movnti movntpd movdqa movdqu movdq2q movq2dq paddq pmuludq pshufd pshufhw pshuflw pslldq psrldq psubq punpckhqdq punpcklqdq addpd addsd andnpd andpd cmpeqpd cmpeqsd cmplepd cmplesd cmpltpd cmpltsd cmpneqpd cmpneqsd cmpnlepd cmpnlesd cmpnltpd cmpnltsd cmpordpd cmpordsd cmpunordpd cmpunordsd cmppd comisd cvtdq2pd cvtdq2ps cvtpd2dq cvtpd2pi cvtpd2ps cvtpi2pd cvtps2dq cvtps2pd cvtsd2si cvtsd2ss cvtsi2sd cvtss2sd cvttpd2pi cvttpd2dq cvttps2dq cvttsd2si divpd divsd maxpd maxsd minpd minsd movapd movhpd movlpd movmskpd movupd mulpd mulsd orpd shufpd sqrtpd sqrtsd subpd subsd ucomisd unpckhpd unpcklpd xorpd addsubpd addsubps haddpd haddps hsubpd hsubps lddqu movddup movshdup movsldup clgi stgi vmcall vmclear vmfunc vmlaunch vmload vmmcall vmptrld vmptrst vmread vmresume vmrun vmsave vmwrite vmxoff vmxon invept invvpid pabsb pabsw pabsd palignr phaddw phaddd phaddsw phsubw phsubd phsubsw pmaddubsw pmulhrsw pshufb psignb psignw psignd extrq insertq movntsd movntss lzcnt blendpd blendps blendvpd blendvps dppd dpps extractps insertps movntdqa mpsadbw packusdw pblendvb pblendw pcmpeqq pextrb pextrd pextrq phminposuw pinsrb pinsrd pinsrq pmaxsb pmaxsd pmaxud pmaxuw pminsb pminsd pminud pminuw pmovsxbw pmovsxbd pmovsxbq pmovsxwd pmovsxwq pmovsxdq pmovzxbw pmovzxbd pmovzxbq pmovzxwd pmovzxwq pmovzxdq pmuldq pmulld ptest roundpd roundps roundsd roundss crc32 pcmpestri pcmpestrm pcmpistri pcmpistrm pcmpgtq popcnt getsec pfrcpv pfrsqrtv movbe aesenc aesenclast aesdec aesdeclast aesimc aeskeygenassist vaesenc vaesenclast vaesdec vaesdeclast vaesimc vaeskeygenassist vaddpd vaddps vaddsd vaddss vaddsubpd vaddsubps vandpd vandps vandnpd vandnps vblendpd vblendps vblendvpd vblendvps vbroadcastss vbroadcastsd vbroadcastf128 vcmpeq_ospd vcmpeqpd vcmplt_ospd vcmpltpd vcmple_ospd vcmplepd vcmpunord_qpd vcmpunordpd vcmpneq_uqpd vcmpneqpd vcmpnlt_uspd vcmpnltpd vcmpnle_uspd vcmpnlepd vcmpord_qpd vcmpordpd vcmpeq_uqpd vcmpnge_uspd vcmpngepd vcmpngt_uspd vcmpngtpd vcmpfalse_oqpd vcmpfalsepd vcmpneq_oqpd vcmpge_ospd vcmpgepd vcmpgt_ospd vcmpgtpd vcmptrue_uqpd vcmptruepd vcmplt_oqpd vcmple_oqpd vcmpunord_spd vcmpneq_uspd vcmpnlt_uqpd vcmpnle_uqpd vcmpord_spd vcmpeq_uspd vcmpnge_uqpd vcmpngt_uqpd vcmpfalse_ospd vcmpneq_ospd vcmpge_oqpd vcmpgt_oqpd vcmptrue_uspd vcmppd vcmpeq_osps vcmpeqps vcmplt_osps vcmpltps vcmple_osps vcmpleps vcmpunord_qps vcmpunordps vcmpneq_uqps vcmpneqps vcmpnlt_usps vcmpnltps vcmpnle_usps vcmpnleps vcmpord_qps vcmpordps vcmpeq_uqps vcmpnge_usps vcmpngeps vcmpngt_usps vcmpngtps vcmpfalse_oqps vcmpfalseps vcmpneq_oqps vcmpge_osps vcmpgeps vcmpgt_osps vcmpgtps vcmptrue_uqps vcmptrueps vcmplt_oqps vcmple_oqps vcmpunord_sps vcmpneq_usps vcmpnlt_uqps vcmpnle_uqps vcmpord_sps vcmpeq_usps vcmpnge_uqps vcmpngt_uqps vcmpfalse_osps vcmpneq_osps vcmpge_oqps vcmpgt_oqps vcmptrue_usps vcmpps vcmpeq_ossd vcmpeqsd vcmplt_ossd vcmpltsd vcmple_ossd vcmplesd vcmpunord_qsd vcmpunordsd vcmpneq_uqsd vcmpneqsd vcmpnlt_ussd vcmpnltsd vcmpnle_ussd vcmpnlesd vcmpord_qsd vcmpordsd vcmpeq_uqsd vcmpnge_ussd vcmpngesd vcmpngt_ussd vcmpngtsd vcmpfalse_oqsd vcmpfalsesd vcmpneq_oqsd vcmpge_ossd vcmpgesd vcmpgt_ossd vcmpgtsd vcmptrue_uqsd vcmptruesd vcmplt_oqsd vcmple_oqsd vcmpunord_ssd vcmpneq_ussd vcmpnlt_uqsd vcmpnle_uqsd vcmpord_ssd vcmpeq_ussd vcmpnge_uqsd vcmpngt_uqsd vcmpfalse_ossd vcmpneq_ossd vcmpge_oqsd vcmpgt_oqsd vcmptrue_ussd vcmpsd vcmpeq_osss vcmpeqss vcmplt_osss vcmpltss vcmple_osss vcmpless vcmpunord_qss vcmpunordss vcmpneq_uqss vcmpneqss vcmpnlt_usss vcmpnltss vcmpnle_usss vcmpnless vcmpord_qss vcmpordss vcmpeq_uqss vcmpnge_usss vcmpngess vcmpngt_usss vcmpngtss vcmpfalse_oqss vcmpfalsess vcmpneq_oqss vcmpge_osss vcmpgess vcmpgt_osss vcmpgtss vcmptrue_uqss vcmptruess vcmplt_oqss vcmple_oqss vcmpunord_sss vcmpneq_usss vcmpnlt_uqss vcmpnle_uqss vcmpord_sss vcmpeq_usss vcmpnge_uqss vcmpngt_uqss vcmpfalse_osss vcmpneq_osss vcmpge_oqss vcmpgt_oqss vcmptrue_usss vcmpss vcomisd vcomiss vcvtdq2pd vcvtdq2ps vcvtpd2dq vcvtpd2ps vcvtps2dq vcvtps2pd vcvtsd2si vcvtsd2ss vcvtsi2sd vcvtsi2ss vcvtss2sd vcvtss2si vcvttpd2dq vcvttps2dq vcvttsd2si vcvttss2si vdivpd vdivps vdivsd vdivss vdppd vdpps vextractf128 vextractps vhaddpd vhaddps vhsubpd vhsubps vinsertf128 vinsertps vlddqu vldqqu vldmxcsr vmaskmovdqu vmaskmovps vmaskmovpd vmaxpd vmaxps vmaxsd vmaxss vminpd vminps vminsd vminss vmovapd vmovaps vmovd vmovq vmovddup vmovdqa vmovqqa vmovdqu vmovqqu vmovhlps vmovhpd vmovhps vmovlhps vmovlpd vmovlps vmovmskpd vmovmskps vmovntdq vmovntqq vmovntdqa vmovntpd vmovntps vmovsd vmovshdup vmovsldup vmovss vmovupd vmovups vmpsadbw vmulpd vmulps vmulsd vmulss vorpd vorps vpabsb vpabsw vpabsd vpacksswb vpackssdw vpackuswb vpackusdw vpaddb vpaddw vpaddd vpaddq vpaddsb vpaddsw vpaddusb vpaddusw vpalignr vpand vpandn vpavgb vpavgw vpblendvb vpblendw vpcmpestri vpcmpestrm vpcmpistri vpcmpistrm vpcmpeqb vpcmpeqw vpcmpeqd vpcmpeqq vpcmpgtb vpcmpgtw vpcmpgtd vpcmpgtq vpermilpd vpermilps vperm2f128 vpextrb vpextrw vpextrd vpextrq vphaddw vphaddd vphaddsw vphminposuw vphsubw vphsubd vphsubsw vpinsrb vpinsrw vpinsrd vpinsrq vpmaddwd vpmaddubsw vpmaxsb vpmaxsw vpmaxsd vpmaxub vpmaxuw vpmaxud vpminsb vpminsw vpminsd vpminub vpminuw vpminud vpmovmskb vpmovsxbw vpmovsxbd vpmovsxbq vpmovsxwd vpmovsxwq vpmovsxdq vpmovzxbw vpmovzxbd vpmovzxbq vpmovzxwd vpmovzxwq vpmovzxdq vpmulhuw vpmulhrsw vpmulhw vpmullw vpmulld vpmuludq vpmuldq vpor vpsadbw vpshufb vpshufd vpshufhw vpshuflw vpsignb vpsignw vpsignd vpslldq vpsrldq vpsllw vpslld vpsllq vpsraw vpsrad vpsrlw vpsrld vpsrlq vptest vpsubb vpsubw vpsubd vpsubq vpsubsb vpsubsw vpsubusb vpsubusw vpunpckhbw vpunpckhwd vpunpckhdq vpunpckhqdq vpunpcklbw vpunpcklwd vpunpckldq vpunpcklqdq vpxor vrcpps vrcpss vrsqrtps vrsqrtss vroundpd vroundps vroundsd vroundss vshufpd vshufps vsqrtpd vsqrtps vsqrtsd vsqrtss vstmxcsr vsubpd vsubps vsubsd vsubss vtestps vtestpd vucomisd vucomiss vunpckhpd vunpckhps vunpcklpd vunpcklps vxorpd vxorps vzeroall vzeroupper pclmullqlqdq pclmulhqlqdq pclmullqhqdq pclmulhqhqdq pclmulqdq vpclmullqlqdq vpclmulhqlqdq vpclmullqhqdq vpclmulhqhqdq vpclmulqdq vfmadd132ps vfmadd132pd vfmadd312ps vfmadd312pd vfmadd213ps vfmadd213pd vfmadd123ps vfmadd123pd vfmadd231ps vfmadd231pd vfmadd321ps vfmadd321pd vfmaddsub132ps vfmaddsub132pd vfmaddsub312ps vfmaddsub312pd vfmaddsub213ps vfmaddsub213pd vfmaddsub123ps vfmaddsub123pd vfmaddsub231ps vfmaddsub231pd vfmaddsub321ps vfmaddsub321pd vfmsub132ps vfmsub132pd vfmsub312ps vfmsub312pd vfmsub213ps vfmsub213pd vfmsub123ps vfmsub123pd vfmsub231ps vfmsub231pd vfmsub321ps vfmsub321pd vfmsubadd132ps vfmsubadd132pd vfmsubadd312ps vfmsubadd312pd vfmsubadd213ps vfmsubadd213pd vfmsubadd123ps vfmsubadd123pd vfmsubadd231ps vfmsubadd231pd vfmsubadd321ps vfmsubadd321pd vfnmadd132ps vfnmadd132pd vfnmadd312ps vfnmadd312pd vfnmadd213ps vfnmadd213pd vfnmadd123ps vfnmadd123pd vfnmadd231ps vfnmadd231pd vfnmadd321ps vfnmadd321pd vfnmsub132ps vfnmsub132pd vfnmsub312ps vfnmsub312pd vfnmsub213ps vfnmsub213pd vfnmsub123ps vfnmsub123pd vfnmsub231ps vfnmsub231pd vfnmsub321ps vfnmsub321pd vfmadd132ss vfmadd132sd vfmadd312ss vfmadd312sd vfmadd213ss vfmadd213sd vfmadd123ss vfmadd123sd vfmadd231ss vfmadd231sd vfmadd321ss vfmadd321sd vfmsub132ss vfmsub132sd vfmsub312ss vfmsub312sd vfmsub213ss vfmsub213sd vfmsub123ss vfmsub123sd vfmsub231ss vfmsub231sd vfmsub321ss vfmsub321sd vfnmadd132ss vfnmadd132sd vfnmadd312ss vfnmadd312sd vfnmadd213ss vfnmadd213sd vfnmadd123ss vfnmadd123sd vfnmadd231ss vfnmadd231sd vfnmadd321ss vfnmadd321sd vfnmsub132ss vfnmsub132sd vfnmsub312ss vfnmsub312sd vfnmsub213ss vfnmsub213sd vfnmsub123ss vfnmsub123sd vfnmsub231ss vfnmsub231sd vfnmsub321ss vfnmsub321sd rdfsbase rdgsbase rdrand wrfsbase wrgsbase vcvtph2ps vcvtps2ph adcx adox rdseed clac stac xstore xcryptecb xcryptcbc xcryptctr xcryptcfb xcryptofb montmul xsha1 xsha256 llwpcb slwpcb lwpval lwpins vfmaddpd vfmaddps vfmaddsd vfmaddss vfmaddsubpd vfmaddsubps vfmsubaddpd vfmsubaddps vfmsubpd vfmsubps vfmsubsd vfmsubss vfnmaddpd vfnmaddps vfnmaddsd vfnmaddss vfnmsubpd vfnmsubps vfnmsubsd vfnmsubss vfrczpd vfrczps vfrczsd vfrczss vpcmov vpcomb vpcomd vpcomq vpcomub vpcomud vpcomuq vpcomuw vpcomw vphaddbd vphaddbq vphaddbw vphadddq vphaddubd vphaddubq vphaddubw vphaddudq vphadduwd vphadduwq vphaddwd vphaddwq vphsubbw vphsubdq vphsubwd vpmacsdd vpmacsdqh vpmacsdql vpmacssdd vpmacssdqh vpmacssdql vpmacsswd vpmacssww vpmacswd vpmacsww vpmadcsswd vpmadcswd vpperm vprotb vprotd vprotq vprotw vpshab vpshad vpshaq vpshaw vpshlb vpshld vpshlq vpshlw vbroadcasti128 vpblendd vpbroadcastb vpbroadcastw vpbroadcastd vpbroadcastq vpermd vpermpd vpermps vpermq vperm2i128 vextracti128 vinserti128 vpmaskmovd vpmaskmovq vpsllvd vpsllvq vpsravd vpsrlvd vpsrlvq vgatherdpd vgatherqpd vgatherdps vgatherqps vpgatherdd vpgatherqd vpgatherdq vpgatherqq xabort xbegin xend xtest andn bextr blci blcic blsi blsic blcfill blsfill blcmsk blsmsk blsr blcs bzhi mulx pdep pext rorx sarx shlx shrx tzcnt tzmsk t1mskc valignd valignq vblendmpd vblendmps vbroadcastf32x4 vbroadcastf64x4 vbroadcasti32x4 vbroadcasti64x4 vcompresspd vcompressps vcvtpd2udq vcvtps2udq vcvtsd2usi vcvtss2usi vcvttpd2udq vcvttps2udq vcvttsd2usi vcvttss2usi vcvtudq2pd vcvtudq2ps vcvtusi2sd vcvtusi2ss vexpandpd vexpandps vextractf32x4 vextractf64x4 vextracti32x4 vextracti64x4 vfixupimmpd vfixupimmps vfixupimmsd vfixupimmss vgetexppd vgetexpps vgetexpsd vgetexpss vgetmantpd vgetmantps vgetmantsd vgetmantss vinsertf32x4 vinsertf64x4 vinserti32x4 vinserti64x4 vmovdqa32 vmovdqa64 vmovdqu32 vmovdqu64 vpabsq vpandd vpandnd vpandnq vpandq vpblendmd vpblendmq vpcmpltd vpcmpled vpcmpneqd vpcmpnltd vpcmpnled vpcmpd vpcmpltq vpcmpleq vpcmpneqq vpcmpnltq vpcmpnleq vpcmpq vpcmpequd vpcmpltud vpcmpleud vpcmpnequd vpcmpnltud vpcmpnleud vpcmpud vpcmpequq vpcmpltuq vpcmpleuq vpcmpnequq vpcmpnltuq vpcmpnleuq vpcmpuq vpcompressd vpcompressq vpermi2d vpermi2pd vpermi2ps vpermi2q vpermt2d vpermt2pd vpermt2ps vpermt2q vpexpandd vpexpandq vpmaxsq vpmaxuq vpminsq vpminuq vpmovdb vpmovdw vpmovqb vpmovqd vpmovqw vpmovsdb vpmovsdw vpmovsqb vpmovsqd vpmovsqw vpmovusdb vpmovusdw vpmovusqb vpmovusqd vpmovusqw vpord vporq vprold vprolq vprolvd vprolvq vprord vprorq vprorvd vprorvq vpscatterdd vpscatterdq vpscatterqd vpscatterqq vpsraq vpsravq vpternlogd vpternlogq vptestmd vptestmq vptestnmd vptestnmq vpxord vpxorq vrcp14pd vrcp14ps vrcp14sd vrcp14ss vrndscalepd vrndscaleps vrndscalesd vrndscaless vrsqrt14pd vrsqrt14ps vrsqrt14sd vrsqrt14ss vscalefpd vscalefps vscalefsd vscalefss vscatterdpd vscatterdps vscatterqpd vscatterqps vshuff32x4 vshuff64x2 vshufi32x4 vshufi64x2 kandnw kandw kmovw knotw kortestw korw kshiftlw kshiftrw kunpckbw kxnorw kxorw vpbroadcastmb2q vpbroadcastmw2d vpconflictd vpconflictq vplzcntd vplzcntq vexp2pd vexp2ps vrcp28pd vrcp28ps vrcp28sd vrcp28ss vrsqrt28pd vrsqrt28ps vrsqrt28sd vrsqrt28ss vgatherpf0dpd vgatherpf0dps vgatherpf0qpd vgatherpf0qps vgatherpf1dpd vgatherpf1dps vgatherpf1qpd vgatherpf1qps vscatterpf0dpd vscatterpf0dps vscatterpf0qpd vscatterpf0qps vscatterpf1dpd vscatterpf1dps vscatterpf1qpd vscatterpf1qps prefetchwt1 bndmk bndcl bndcu bndcn bndmov bndldx bndstx sha1rnds4 sha1nexte sha1msg1 sha1msg2 sha256rnds2 sha256msg1 sha256msg2 hint_nop0 hint_nop1 hint_nop2 hint_nop3 hint_nop4 hint_nop5 hint_nop6 hint_nop7 hint_nop8 hint_nop9 hint_nop10 hint_nop11 hint_nop12 hint_nop13 hint_nop14 hint_nop15 hint_nop16 hint_nop17 hint_nop18 hint_nop19 hint_nop20 hint_nop21 hint_nop22 hint_nop23 hint_nop24 hint_nop25 hint_nop26 hint_nop27 hint_nop28 hint_nop29 hint_nop30 hint_nop31 hint_nop32 hint_nop33 hint_nop34 hint_nop35 hint_nop36 hint_nop37 hint_nop38 hint_nop39 hint_nop40 hint_nop41 hint_nop42 hint_nop43 hint_nop44 hint_nop45 hint_nop46 hint_nop47 hint_nop48 hint_nop49 hint_nop50 hint_nop51 hint_nop52 hint_nop53 hint_nop54 hint_nop55 hint_nop56 hint_nop57 hint_nop58 hint_nop59 hint_nop60 hint_nop61 hint_nop62 hint_nop63\",built_in:\"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr\",meta:\"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__\"},c:[s.C(\";\",\"$\",{relevance:0}),{cN:\"number\",v:[{b:\"\\\\b(?:([0-9][0-9_]*)?\\\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\\\b\",relevance:0},{b:\"\\\\$[0-9][0-9A-Fa-f]*\",relevance:0},{b:\"\\\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\\\b\"},{b:\"\\\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\\\b\"}]},s.QSM,{cN:\"string\",v:[{b:\"'\",e:\"[^\\\\\\\\]'\"},{b:\"`\",e:\"[^\\\\\\\\]`\"}],relevance:0},{cN:\"symbol\",v:[{b:\"^\\\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\\\s+label)\"},{b:\"^\\\\s*%%[A-Za-z0-9_$#@~.?]*:\"}],relevance:0},{cN:\"subst\",b:\"%[0-9]+\",relevance:0},{cN:\"subst\",b:\"%!S+\",relevance:0},{cN:\"meta\",b:/^\\s*\\.[\\w_-]+/}]}});hljs.registerLanguage(\"cpp\",function(e){function t(e){return\"(?:\"+e+\")?\"}var r=\"decltype\\\\(auto\\\\)\",a=\"[a-zA-Z_]\\\\w*::\",i=\"(\"+r+\"|\"+t(a)+\"[a-zA-Z_]\\\\w*\"+t(\"<.*?>\")+\")\",c={cN:\"keyword\",b:\"\\\\b[a-z\\\\d_]*_t\\\\b\"},s={cN:\"string\",v:[{b:'(u8?|U|L)?\"',e:'\"',i:\"\\\\n\",c:[e.BE]},{b:\"(u8?|U|L)?'(\\\\\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\\\S)|.)\",e:\"'\",i:\".\"},{b:/(?:u8?|U|L)?R\"([^()\\\\ ]{0,16})\\((?:.|\\n)*?\\)\\1\"/}]},n={cN:\"number\",v:[{b:\"\\\\b(0b[01']+)\"},{b:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)(u|U|l|L|ul|UL|f|F|b|B)\"},{b:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"}],relevance:0},o={cN:\"meta\",b:/#\\s*[a-z]+\\b/,e:/$/,k:{\"meta-keyword\":\"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include\"},c:[{b:/\\\\\\n/,relevance:0},e.inherit(s,{cN:\"meta-string\"}),{cN:\"meta-string\",b:/<.*?>/,e:/$/,i:\"\\\\n\"},e.CLCM,e.CBCM]},l={cN:\"title\",b:t(a)+e.IR,relevance:0},u=t(a)+e.IR+\"\\\\s*\\\\(\",p={keyword:\"int float while private char char8_t char16_t char32_t catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid wchar_tshort reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignas alignof constexpr consteval constinit decltype concept co_await co_return co_yield requires noexcept static_assert thread_local restrict final override atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and and_eq bitand bitor compl not not_eq or or_eq xor xor_eq\",built_in:\"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr _Bool complex _Complex imaginary _Imaginary\",literal:\"true false nullptr NULL\"},m=[c,e.CLCM,e.CBCM,n,s],d={v:[{b:/=/,e:/;/},{b:/\\(/,e:/\\)/},{bK:\"new throw return else\",e:/;/}],k:p,c:m.concat([{b:/\\(/,e:/\\)/,k:p,c:m.concat([\"self\"]),relevance:0}]),relevance:0},b={cN:\"function\",b:\"(\"+i+\"[\\\\*&\\\\s]+)+\"+u,rB:!0,e:/[{;=]/,eE:!0,k:p,i:/[^\\w\\s\\*&:<>]/,c:[{b:r,k:p,relevance:0},{b:u,rB:!0,c:[l],relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,k:p,relevance:0,c:[e.CLCM,e.CBCM,s,n,c,{b:/\\(/,e:/\\)/,k:p,relevance:0,c:[\"self\",e.CLCM,e.CBCM,s,n,c]}]},c,e.CLCM,e.CBCM,o]};return{aliases:[\"c\",\"cc\",\"h\",\"c++\",\"h++\",\"hpp\",\"hh\",\"hxx\",\"cxx\"],k:p,i:\"</\",c:[].concat(d,b,m,[o,{b:\"\\\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\\\s*<\",e:\">\",k:p,c:[\"self\",c]},{b:e.IR+\"::\",k:p},{cN:\"class\",bK:\"class struct\",e:/[{;:]/,c:[{b:/</,e:/>/,c:[\"self\"]},e.TM]}]),exports:{preprocessor:o,strings:s,k:p}}});hljs.registerLanguage(\"arduino\",function(e){var t=\"boolean byte word String\",r=\"setup loopKeyboardController MouseController SoftwareSerial EthernetServer EthernetClient LiquidCrystal RobotControl GSMVoiceCall EthernetUDP EsploraTFT HttpClient RobotMotor WiFiClient GSMScanner FileSystem Scheduler GSMServer YunClient YunServer IPAddress GSMClient GSMModem Keyboard Ethernet Console GSMBand Esplora Stepper Process WiFiUDP GSM_SMS Mailbox USBHost Firmata PImage Client Server GSMPIN FileIO Bridge Serial EEPROM Stream Mouse Audio Servo File Task GPRS WiFi Wire TFT GSM SPI SD runShellCommandAsynchronously analogWriteResolution retrieveCallingNumber printFirmwareVersion analogReadResolution sendDigitalPortPair noListenOnLocalhost readJoystickButton setFirmwareVersion readJoystickSwitch scrollDisplayRight getVoiceCallStatus scrollDisplayLeft writeMicroseconds delayMicroseconds beginTransmission getSignalStrength runAsynchronously getAsynchronously listenOnLocalhost getCurrentCarrier readAccelerometer messageAvailable sendDigitalPorts lineFollowConfig countryNameWrite runShellCommand readStringUntil rewindDirectory readTemperature setClockDivider readLightSensor endTransmission analogReference detachInterrupt countryNameRead attachInterrupt encryptionType readBytesUntil robotNameWrite readMicrophone robotNameRead cityNameWrite userNameWrite readJoystickY readJoystickX mouseReleased openNextFile scanNetworks noInterrupts digitalWrite beginSpeaker mousePressed isActionDone mouseDragged displayLogos noAutoscroll addParameter remoteNumber getModifiers keyboardRead userNameRead waitContinue processInput parseCommand printVersion readNetworks writeMessage blinkVersion cityNameRead readMessage setDataMode parsePacket isListening setBitOrder beginPacket isDirectory motorsWrite drawCompass digitalRead clearScreen serialEvent rightToLeft setTextSize leftToRight requestFrom keyReleased compassRead analogWrite interrupts WiFiServer disconnect playMelody parseFloat autoscroll getPINUsed setPINUsed setTimeout sendAnalog readSlider analogRead beginWrite createChar motorsStop keyPressed tempoWrite readButton subnetMask debugPrint macAddress writeGreen randomSeed attachGPRS readString sendString remotePort releaseAll mouseMoved background getXChange getYChange answerCall getResult voiceCall endPacket constrain getSocket writeJSON getButton available connected findUntil readBytes exitValue readGreen writeBlue startLoop IPAddress isPressed sendSysex pauseMode gatewayIP setCursor getOemKey tuneWrite noDisplay loadImage switchPIN onRequest onReceive changePIN playFile noBuffer parseInt overflow checkPIN knobRead beginTFT bitClear updateIR bitWrite position writeRGB highByte writeRed setSpeed readBlue noStroke remoteIP transfer shutdown hangCall beginSMS endWrite attached maintain noCursor checkReg checkPUK shiftOut isValid shiftIn pulseIn connect println localIP pinMode getIMEI display noBlink process getBand running beginSD drawBMP lowByte setBand release bitRead prepare pointTo readRed setMode noFill remove listen stroke detach attach noTone exists buffer height bitSet circle config cursor random IRread setDNS endSMS getKey micros millis begin print write ready flush width isPIN blink clear press mkdir rmdir close point yield image BSSID click delay read text move peek beep rect line open seek fill size turn stop home find step tone sqrt RSSI SSID end bit tan cos sin pow map abs max min get run put\",i=\"DIGITAL_MESSAGE FIRMATA_STRING ANALOG_MESSAGE REPORT_DIGITAL REPORT_ANALOG INPUT_PULLUP SET_PIN_MODE INTERNAL2V56 SYSTEM_RESET LED_BUILTIN INTERNAL1V1 SYSEX_START INTERNAL EXTERNAL DEFAULT OUTPUT INPUT HIGH LOW\",o=e.requireLanguage(\"cpp\").rawDefinition(),a=o.k;return a.keyword+=\" \"+t,a.literal+=\" \"+i,a.built_in+=\" \"+r,o});hljs.registerLanguage(\"nginx\",function(e){var r={cN:\"variable\",v:[{b:/\\$\\d+/},{b:/\\$\\{/,e:/}/},{b:\"[\\\\$\\\\@]\"+e.UIR}]},b={eW:!0,l:\"[a-z/_]+\",k:{literal:\"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll\"},relevance:0,i:\"=>\",c:[e.HCM,{cN:\"string\",c:[e.BE,r],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/}]},{b:\"([a-z]+):/\",e:\"\\\\s\",eW:!0,eE:!0,c:[r]},{cN:\"regexp\",c:[e.BE,r],v:[{b:\"\\\\s\\\\^\",e:\"\\\\s|{|;\",rE:!0},{b:\"~\\\\*?\\\\s+\",e:\"\\\\s|{|;\",rE:!0},{b:\"\\\\*(\\\\.[a-z\\\\-]+)+\"},{b:\"([a-z\\\\-]+\\\\.)+\\\\*\"}]},{cN:\"number\",b:\"\\\\b\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}\\\\.\\\\d{1,3}(:\\\\d{1,5})?\\\\b\"},{cN:\"number\",b:\"\\\\b\\\\d+[kKmMgGdshdwy]*\\\\b\",relevance:0},r]};return{aliases:[\"nginxconf\"],c:[e.HCM,{b:e.UIR+\"\\\\s+{\",rB:!0,e:\"{\",c:[{cN:\"section\",b:e.UIR}],relevance:0},{b:e.UIR+\"\\\\s\",e:\";|{\",rB:!0,c:[{cN:\"attribute\",b:e.UIR,starts:b}],relevance:0}],i:\"[^\\\\s\\\\}]\"}});hljs.registerLanguage(\"xml\",function(e){var c={cN:\"symbol\",b:\"&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;\"},s={b:\"\\\\s\",c:[{cN:\"meta-keyword\",b:\"#?[a-z_][a-z1-9_-]+\",i:\"\\\\n\"}]},a=e.inherit(s,{b:\"\\\\(\",e:\"\\\\)\"}),t=e.inherit(e.ASM,{cN:\"meta-string\"}),l=e.inherit(e.QSM,{cN:\"meta-string\"}),r={eW:!0,i:/</,relevance:0,c:[{cN:\"attr\",b:\"[A-Za-z0-9\\\\._:-]+\",relevance:0},{b:/=\\s*/,relevance:0,c:[{cN:\"string\",endsParent:!0,v:[{b:/\"/,e:/\"/,c:[c]},{b:/'/,e:/'/,c:[c]},{b:/[^\\s\"'=<>`]+/}]}]}]};return{aliases:[\"html\",\"xhtml\",\"rss\",\"atom\",\"xjb\",\"xsd\",\"xsl\",\"plist\",\"wsf\",\"svg\"],cI:!0,c:[{cN:\"meta\",b:\"<![a-z]\",e:\">\",relevance:10,c:[s,l,t,a,{b:\"\\\\[\",e:\"\\\\]\",c:[{cN:\"meta\",b:\"<![a-z]\",e:\">\",c:[s,a,l,t]}]}]},e.C(\"\\x3c!--\",\"--\\x3e\",{relevance:10}),{b:\"<\\\\!\\\\[CDATA\\\\[\",e:\"\\\\]\\\\]>\",relevance:10},c,{cN:\"meta\",b:/<\\?xml/,e:/\\?>/,relevance:10},{b:/<\\?(php)?/,e:/\\?>/,sL:\"php\",c:[{b:\"/\\\\*\",e:\"\\\\*/\",skip:!0},{b:'b\"',e:'\"',skip:!0},{b:\"b'\",e:\"'\",skip:!0},e.inherit(e.ASM,{i:null,cN:null,c:null,skip:!0}),e.inherit(e.QSM,{i:null,cN:null,c:null,skip:!0})]},{cN:\"tag\",b:\"<style(?=\\\\s|>)\",e:\">\",k:{name:\"style\"},c:[r],starts:{e:\"</style>\",rE:!0,sL:[\"css\",\"xml\"]}},{cN:\"tag\",b:\"<script(?=\\\\s|>)\",e:\">\",k:{name:\"script\"},c:[r],starts:{e:\"<\\/script>\",rE:!0,sL:[\"actionscript\",\"javascript\",\"handlebars\",\"xml\"]}},{cN:\"tag\",b:\"</?\",e:\"/?>\",c:[{cN:\"name\",b:/[^\\/><\\s]+/,relevance:0},r]}]}});hljs.registerLanguage(\"markdown\",function(e){return{aliases:[\"md\",\"mkdown\",\"mkd\"],c:[{cN:\"section\",v:[{b:\"^#{1,6}\",e:\"$\"},{b:\"^.+?\\\\n[=-]{2,}$\"}]},{b:\"<\",e:\">\",sL:\"xml\",relevance:0},{cN:\"bullet\",b:\"^\\\\s*([*+-]|(\\\\d+\\\\.))\\\\s+\"},{cN:\"strong\",b:\"[*_]{2}.+?[*_]{2}\"},{cN:\"emphasis\",v:[{b:\"\\\\*.+?\\\\*\"},{b:\"_.+?_\",relevance:0}]},{cN:\"quote\",b:\"^>\\\\s+\",e:\"$\"},{cN:\"code\",v:[{b:\"^```\\\\w*\\\\s*$\",e:\"^```[ ]*$\"},{b:\"`.+?`\"},{b:\"^( {4}|\\\\t)\",e:\"$\",relevance:0}]},{b:\"^[-\\\\*]{3,}\",e:\"$\"},{b:\"\\\\[.+?\\\\][\\\\(\\\\[].*?[\\\\)\\\\]]\",rB:!0,c:[{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,rE:!0,relevance:0},{cN:\"link\",b:\"\\\\]\\\\(\",e:\"\\\\)\",eB:!0,eE:!0},{cN:\"symbol\",b:\"\\\\]\\\\[\",e:\"\\\\]\",eB:!0,eE:!0}],relevance:10},{b:/^\\[[^\\n]+\\]:/,rB:!0,c:[{cN:\"symbol\",b:/\\[/,e:/\\]/,eB:!0,eE:!0},{cN:\"link\",b:/:\\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage(\"properties\",function(e){var r=\"[ \\\\t\\\\f]*\",t=\"(\"+r+\"[:=]\"+r+\"|[ \\\\t\\\\f]+)\",n=\"([^\\\\\\\\\\\\W:= \\\\t\\\\f\\\\n]|\\\\\\\\.)+\",a=\"([^\\\\\\\\:= \\\\t\\\\f\\\\n]|\\\\\\\\.)+\",c={e:t,relevance:0,starts:{cN:\"string\",e:/$/,relevance:0,c:[{b:\"\\\\\\\\\\\\n\"}]}};return{cI:!0,i:/\\S/,c:[e.C(\"^\\\\s*[!#]\",\"$\"),{b:n+t,rB:!0,c:[{cN:\"attr\",b:n,endsParent:!0,relevance:0}],starts:c},{b:a+t,rB:!0,relevance:0,c:[{cN:\"meta\",b:a,endsParent:!0,relevance:0}],starts:c},{cN:\"attr\",relevance:0,b:a+r+\"$\"}]}});hljs.registerLanguage(\"bash\",function(e){var t={cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},a={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,t,{cN:\"variable\",b:/\\$\\(/,e:/\\)/,c:[e.BE]}]};return{aliases:[\"sh\",\"zsh\"],l:/\\b-?[a-z\\._]+\\b/,k:{keyword:\"if then else elif fi for while in do done case esac function\",literal:\"true false\",built_in:\"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp\",_:\"-ne -eq -lt -gt -f -d -e -s -l -a\"},c:[{cN:\"meta\",b:/^#![^\\n]+sh\\s*$/,relevance:10},{cN:\"function\",b:/\\w[\\w\\d_]*\\s*\\(\\s*\\)\\s*\\{/,rB:!0,c:[e.inherit(e.TM,{b:/\\w[\\w\\d_]*/})],relevance:0},e.HCM,a,{cN:\"\",b:/\\\\\"/},{cN:\"string\",b:/'/,e:/'/},t]}});hljs.registerLanguage(\"dockerfile\",function(e){return{aliases:[\"docker\"],cI:!0,k:\"from maintainer expose env arg user onbuild stopsignal\",c:[e.HCM,e.ASM,e.QSM,e.NM,{bK:\"run cmd entrypoint volume add copy workdir label healthcheck shell\",starts:{e:/[^\\\\]$/,sL:\"bash\"}}],i:\"</\"}});hljs.registerLanguage(\"python\",function(e){var r={keyword:\"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10\",built_in:\"Ellipsis NotImplemented\",literal:\"False None True\"},b={cN:\"meta\",b:/^(>>>|\\.\\.\\.) /},c={cN:\"subst\",b:/\\{/,e:/\\}/,k:r,i:/#/},a={b:/\\{\\{/,relevance:0},l={cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[e.BE,b],relevance:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,c:[e.BE,b],relevance:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[e.BE,b,a,c]},{b:/(fr|rf|f)\"\"\"/,e:/\"\"\"/,c:[e.BE,b,a,c]},{b:/(u|r|ur)'/,e:/'/,relevance:10},{b:/(u|r|ur)\"/,e:/\"/,relevance:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},{b:/(fr|rf|f)'/,e:/'/,c:[e.BE,a,c]},{b:/(fr|rf|f)\"/,e:/\"/,c:[e.BE,a,c]},e.ASM,e.QSM]},n={cN:\"number\",relevance:0,v:[{b:e.BNR+\"[lLjJ]?\"},{b:\"\\\\b(0o[0-7]+)[lLjJ]?\"},{b:e.CNR+\"[lLjJ]?\"}]},i={cN:\"params\",b:/\\(/,e:/\\)/,c:[\"self\",b,n,l,e.HCM]};return c.c=[l,n,b],{aliases:[\"py\",\"gyp\",\"ipython\"],k:r,i:/(<\\/|->|\\?)|=>/,c:[b,n,{bK:\"if\",relevance:0},l,e.HCM,{v:[{cN:\"function\",bK:\"def\"},{cN:\"class\",bK:\"class\"}],e:/:/,i:/[${=;\\n,]/,c:[e.UTM,i,{b:/->/,eW:!0,k:\"None\"}]},{cN:\"meta\",b:/^[\\t ]*@/,e:/$/},{b:/\\b(print|exec)\\(/}]}});hljs.registerLanguage(\"ini\",function(e){var b={cN:\"number\",relevance:0,v:[{b:/([\\+\\-]+)?[\\d]+_[\\d_]+/},{b:e.NR}]},a=e.C();a.v=[{b:/;/,e:/$/},{b:/#/,e:/$/}];var c={cN:\"variable\",v:[{b:/\\$[\\w\\d\"][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},r={cN:\"literal\",b:/\\bon|off|true|false|yes|no\\b/},n={cN:\"string\",c:[e.BE],v:[{b:\"'''\",e:\"'''\",relevance:10},{b:'\"\"\"',e:'\"\"\"',relevance:10},{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]};return{aliases:[\"toml\"],cI:!0,i:/\\S/,c:[a,{cN:\"section\",b:/\\[+/,e:/\\]+/},{b:/^[a-z0-9\\[\\]_\\.-]+(?=\\s*=\\s*)/,cN:\"attr\",starts:{e:/$/,c:[a,{b:/\\[/,e:/\\]/,c:[a,r,c,n,b,\"self\"],relevance:0},r,c,n,b]}}]}});hljs.registerLanguage(\"diff\",function(e){return{aliases:[\"patch\"],c:[{cN:\"meta\",relevance:10,v:[{b:/^@@ +\\-\\d+,\\d+ +\\+\\d+,\\d+ +@@$/},{b:/^\\*\\*\\* +\\d+,\\d+ +\\*\\*\\*\\*$/},{b:/^\\-\\-\\- +\\d+,\\d+ +\\-\\-\\-\\-$/}]},{cN:\"comment\",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\\-{3}/,e:/$/},{b:/^\\*{3} /,e:/$/},{b:/^\\+{3}/,e:/$/},{b:/^\\*{15}$/}]},{cN:\"addition\",b:\"^\\\\+\",e:\"$\"},{cN:\"deletion\",b:\"^\\\\-\",e:\"$\"},{cN:\"addition\",b:\"^\\\\!\",e:\"$\"}]}});hljs.registerLanguage(\"http\",function(e){var t=\"HTTP/[0-9\\\\.]+\";return{aliases:[\"https\"],i:\"\\\\S\",c:[{b:\"^\"+t,e:\"$\",c:[{cN:\"number\",b:\"\\\\b\\\\d{3}\\\\b\"}]},{b:\"^[A-Z]+ (.*?) \"+t+\"$\",rB:!0,e:\"$\",c:[{cN:\"string\",b:\" \",e:\" \",eB:!0,eE:!0},{b:t},{cN:\"keyword\",b:\"[A-Z]+\"}]},{cN:\"attribute\",b:\"^\\\\w\",e:\": \",eE:!0,i:\"\\\\n|\\\\s|=\",starts:{e:\"$\",relevance:0}},{b:\"\\\\n\\\\n\",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage(\"sql\",function(e){var t=e.C(\"--\",\"$\");return{cI:!0,i:/[<>{}*]/,c:[{bK:\"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment values with\",e:/;/,eW:!0,l:/[\\w\\.]+/,k:{keyword:\"as abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias all allocate allow alter always analyze ancillary and anti any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound bucket buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain explode export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force foreign form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour hours http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lateral lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minutes minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notnull notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second seconds section securefile security seed segment select self semi sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tablesample tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unnest unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace window with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek\",literal:\"true false null unknown\",built_in:\"array bigint binary bit blob bool boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text time timestamp tinyint varchar varchar2 varying void\"},c:[{cN:\"string\",b:\"'\",e:\"'\",c:[{b:\"''\"}]},{cN:\"string\",b:'\"',e:'\"',c:[{b:'\"\"'}]},{cN:\"string\",b:\"`\",e:\"`\"},e.CNM,e.CBCM,t,e.HCM]},e.CBCM,t,e.HCM]}});hljs.registerLanguage(\"vala\",function(e){return{k:{keyword:\"char uchar unichar int uint long ulong short ushort int8 int16 int32 int64 uint8 uint16 uint32 uint64 float double bool struct enum string void weak unowned owned async signal static abstract interface override virtual delegate if while do for foreach else switch case break default return try catch public private protected internal using new this get set const stdout stdin stderr var\",built_in:\"DBus GLib CCode Gee Object Gtk Posix\",literal:\"false true null\"},c:[{cN:\"class\",bK:\"class interface namespace\",e:\"{\",eE:!0,i:\"[^,:\\\\n\\\\s\\\\.]\",c:[e.UTM]},e.CLCM,e.CBCM,{cN:\"string\",b:'\"\"\"',e:'\"\"\"',relevance:5},e.ASM,e.QSM,e.CNM,{cN:\"meta\",b:\"^#\",e:\"$\",relevance:2}]}});hljs.registerLanguage(\"asciidoc\",function(e){return{aliases:[\"adoc\"],c:[e.C(\"^/{4,}\\\\n\",\"\\\\n/{4,}$\",{relevance:10}),e.C(\"^//\",\"$\",{relevance:0}),{cN:\"title\",b:\"^\\\\.\\\\w.*$\"},{b:\"^[=\\\\*]{4,}\\\\n\",e:\"\\\\n^[=\\\\*]{4,}$\",relevance:10},{cN:\"section\",relevance:10,v:[{b:\"^(={1,5}) .+?( \\\\1)?$\"},{b:\"^[^\\\\[\\\\]\\\\n]+?\\\\n[=\\\\-~\\\\^\\\\+]{2,}$\"}]},{cN:\"meta\",b:\"^:.+?:\",e:\"\\\\s\",eE:!0,relevance:10},{cN:\"meta\",b:\"^\\\\[.+?\\\\]$\",relevance:0},{cN:\"quote\",b:\"^_{4,}\\\\n\",e:\"\\\\n_{4,}$\",relevance:10},{cN:\"code\",b:\"^[\\\\-\\\\.]{4,}\\\\n\",e:\"\\\\n[\\\\-\\\\.]{4,}$\",relevance:10},{b:\"^\\\\+{4,}\\\\n\",e:\"\\\\n\\\\+{4,}$\",c:[{b:\"<\",e:\">\",sL:\"xml\",relevance:0}],relevance:10},{cN:\"bullet\",b:\"^(\\\\*+|\\\\-+|\\\\.+|[^\\\\n]+?::)\\\\s+\"},{cN:\"symbol\",b:\"^(NOTE|TIP|IMPORTANT|WARNING|CAUTION):\\\\s+\",relevance:10},{cN:\"strong\",b:\"\\\\B\\\\*(?![\\\\*\\\\s])\",e:\"(\\\\n{2}|\\\\*)\",c:[{b:\"\\\\\\\\*\\\\w\",relevance:0}]},{cN:\"emphasis\",b:\"\\\\B'(?!['\\\\s])\",e:\"(\\\\n{2}|')\",c:[{b:\"\\\\\\\\'\\\\w\",relevance:0}],relevance:0},{cN:\"emphasis\",b:\"_(?![_\\\\s])\",e:\"(\\\\n{2}|_)\",relevance:0},{cN:\"string\",v:[{b:\"``.+?''\"},{b:\"`.+?'\"}]},{cN:\"code\",b:\"(`.+?`|\\\\+.+?\\\\+)\",relevance:0},{cN:\"code\",b:\"^[ \\\\t]\",e:\"$\",relevance:0},{b:\"^'{3,}[ \\\\t]*$\",relevance:10},{b:\"(link:)?(http|https|ftp|file|irc|image:?):\\\\S+\\\\[.*?\\\\]\",rB:!0,c:[{b:\"(link|image:?):\",relevance:0},{cN:\"link\",b:\"\\\\w\",e:\"[^\\\\[]+\",relevance:0},{cN:\"string\",b:\"\\\\[\",e:\"\\\\]\",eB:!0,eE:!0,relevance:0}],relevance:10}]}});hljs.registerLanguage(\"json\",function(e){var i={literal:\"true false null\"},n=[e.CLCM,e.CBCM],c=[e.QSM,e.CNM],r={e:\",\",eW:!0,eE:!0,c:c,k:i},t={b:\"{\",e:\"}\",c:[{cN:\"attr\",b:/\"/,e:/\"/,c:[e.BE],i:\"\\\\n\"},e.inherit(r,{b:/:/})].concat(n),i:\"\\\\S\"},a={b:\"\\\\[\",e:\"\\\\]\",c:[e.inherit(r)],i:\"\\\\S\"};return c.push(t,a),n.forEach(function(e){c.push(e)}),{c:c,k:i,i:\"\\\\S\"}});hljs.registerLanguage(\"rust\",function(e){var t=\"([ui](8|16|32|64|128|size)|f(32|64))?\",r=\"drop i8 i16 i32 i64 i128 isize u8 u16 u32 u64 u128 usize f32 f64 str char bool Box Option Result String Vec Copy Send Sized Sync Drop Fn FnMut FnOnce ToOwned Clone Debug PartialEq PartialOrd Eq Ord AsRef AsMut Into From Default Iterator Extend IntoIterator DoubleEndedIterator ExactSizeIterator SliceConcatExt ToString assert! assert_eq! bitflags! bytes! cfg! col! concat! concat_idents! debug_assert! debug_assert_eq! env! panic! file! format! format_args! include_bin! include_str! line! local_data_key! module_path! option_env! print! println! select! stringify! try! unimplemented! unreachable! vec! write! writeln! macro_rules! assert_ne! debug_assert_ne!\";return{aliases:[\"rs\"],k:{keyword:\"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield\",literal:\"true false Some None Ok Err\",built_in:r},l:e.IR+\"!?\",i:\"</\",c:[e.CLCM,e.C(\"/\\\\*\",\"\\\\*/\",{c:[\"self\"]}),e.inherit(e.QSM,{b:/b?\"/,i:null}),{cN:\"string\",v:[{b:/r(#*)\"(.|\\n)*?\"\\1(?!#)/},{b:/b?'\\\\?(x\\w{2}|u\\w{4}|U\\w{8}|.)'/}]},{cN:\"symbol\",b:/'[a-zA-Z_][a-zA-Z0-9_]*/},{cN:\"number\",v:[{b:\"\\\\b0b([01_]+)\"+t},{b:\"\\\\b0o([0-7_]+)\"+t},{b:\"\\\\b0x([A-Fa-f0-9_]+)\"+t},{b:\"\\\\b(\\\\d[\\\\d_]*(\\\\.[0-9_]+)?([eE][+-]?[0-9_]+)?)\"+t}],relevance:0},{cN:\"function\",bK:\"fn\",e:\"(\\\\(|<)\",eE:!0,c:[e.UTM]},{cN:\"meta\",b:\"#\\\\!?\\\\[\",e:\"\\\\]\",c:[{cN:\"meta-string\",b:/\"/,e:/\"/}]},{cN:\"class\",bK:\"type\",e:\";\",c:[e.inherit(e.UTM,{endsParent:!0})],i:\"\\\\S\"},{cN:\"class\",bK:\"trait enum struct union\",e:\"{\",c:[e.inherit(e.UTM,{endsParent:!0})],i:\"[\\\\w\\\\d]\"},{b:e.IR+\"::\",k:{built_in:r}},{b:\"->\"}]}});hljs.registerLanguage(\"awk\",function(e){return{k:{keyword:\"BEGIN END if else while do for in break continue delete next nextfile function func exit|10\"},c:[{cN:\"variable\",v:[{b:/\\$[\\w\\d#@][\\w\\d_]*/},{b:/\\$\\{(.*?)}/}]},{cN:\"string\",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,relevance:10},{b:/(u|b)?r?\"\"\"/,e:/\"\"\"/,relevance:10},{b:/(u|r|ur)'/,e:/'/,relevance:10},{b:/(u|r|ur)\"/,e:/\"/,relevance:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)\"/,e:/\"/},e.ASM,e.QSM]},e.RM,e.HCM,e.NM]}});hljs.registerLanguage(\"java\",function(e){var a=\"false synchronized int abstract float private char boolean var static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do\",t={cN:\"number\",b:\"\\\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+)(\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))?|\\\\.([\\\\d]+[\\\\d_]+[\\\\d]+|[\\\\d]+))([eE][-+]?\\\\d+)?)[lLfF]?\",relevance:0};return{aliases:[\"jsp\"],k:a,i:/<\\/|#/,c:[e.C(\"/\\\\*\\\\*\",\"\\\\*/\",{relevance:0,c:[{b:/\\w+@/,relevance:0},{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:\"class\",bK:\"class interface\",e:/[{;=]/,eE:!0,k:\"class interface\",i:/[:\"\\[\\]]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"new throw return else\",relevance:0},{cN:\"function\",b:\"([À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(<[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*(\\\\s*,\\\\s*[À-ʸa-zA-Z_$][À-ʸa-zA-Z_$0-9]*)*>)?\\\\s+)+\"+e.UIR+\"\\\\s*\\\\(\",rB:!0,e:/[{;=]/,eE:!0,k:a,c:[{b:e.UIR+\"\\\\s*\\\\(\",rB:!0,relevance:0,c:[e.UTM]},{cN:\"params\",b:/\\(/,e:/\\)/,k:a,relevance:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},t,{cN:\"meta\",b:\"@[A-Za-z]+\"}]}});hljs.registerLanguage(\"cs\",function(e){var a={keyword:\"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let nameof on orderby partial remove select set value var when where yield\",literal:\"null false true\"},i={cN:\"number\",v:[{b:\"\\\\b(0b[01']+)\"},{b:\"(-?)\\\\b([\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)(u|U|l|L|ul|UL|f|F|b|B)\"},{b:\"(-?)(\\\\b0[xX][a-fA-F0-9']+|(\\\\b[\\\\d']+(\\\\.[\\\\d']*)?|\\\\.[\\\\d']+)([eE][-+]?[\\\\d']+)?)\"}],relevance:0},c={cN:\"string\",b:'@\"',e:'\"',c:[{b:'\"\"'}]},r=e.inherit(c,{i:/\\n/}),n={cN:\"subst\",b:\"{\",e:\"}\",k:a},t=e.inherit(n,{i:/\\n/}),s={cN:\"string\",b:/\\$\"/,e:'\"',i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},e.BE,t]},l={cN:\"string\",b:/\\$@\"/,e:'\"',c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},n]},b=e.inherit(l,{i:/\\n/,c:[{b:\"{{\"},{b:\"}}\"},{b:'\"\"'},t]});n.c=[l,s,c,e.ASM,e.QSM,i,e.CBCM],t.c=[b,s,r,e.ASM,e.QSM,i,e.inherit(e.CBCM,{i:/\\n/})];var o={v:[l,s,c,e.ASM,e.QSM]},d=e.IR+\"(<\"+e.IR+\"(\\\\s*,\\\\s*\"+e.IR+\")*>)?(\\\\[\\\\])?\";return{aliases:[\"csharp\",\"c#\"],k:a,i:/::/,c:[e.C(\"///\",\"$\",{rB:!0,c:[{cN:\"doctag\",v:[{b:\"///\",relevance:0},{b:\"\\x3c!--|--\\x3e\"},{b:\"</?\",e:\">\"}]}]}),e.CLCM,e.CBCM,{cN:\"meta\",b:\"#\",e:\"$\",k:{\"meta-keyword\":\"if else elif endif define undef warning error line region endregion pragma checksum\"}},o,i,{bK:\"class interface\",e:/[{;=]/,i:/[^\\s:,]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:\"namespace\",e:/[{;=]/,i:/[^\\s:]/,c:[e.inherit(e.TM,{b:\"[a-zA-Z](\\\\.?\\\\w)*\"}),e.CLCM,e.CBCM]},{cN:\"meta\",b:\"^\\\\s*\\\\[\",eB:!0,e:\"\\\\]\",eE:!0,c:[{cN:\"meta-string\",b:/\"/,e:/\"/}]},{bK:\"new return throw await else\",relevance:0},{cN:\"function\",b:\"(\"+d+\"\\\\s+)+\"+e.IR+\"\\\\s*\\\\(\",rB:!0,e:/\\s*[{;=]/,eE:!0,k:a,c:[{b:e.IR+\"\\\\s*\\\\(\",rB:!0,c:[e.TM],relevance:0},{cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:a,relevance:0,c:[o,i,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage(\"mathematica\",function(e){return{aliases:[\"mma\",\"wl\"],l:\"(\\\\$|\\\\b)\"+e.IR+\"\\\\b\",k:\"AASTriangle AbelianGroup Abort AbortKernels AbortProtect AbortScheduledTask Above Abs AbsArg AbsArgPlot Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AcceptanceThreshold AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Activate Active ActiveClassification ActiveClassificationObject ActiveItem ActivePrediction ActivePredictionObject ActiveStyle AcyclicGraphQ AddOnHelpPath AddSides AddTo AddToSearchIndex AddUsers AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AdministrativeDivisionData AffineHalfSpace AffineSpace AffineStateSpaceModel AffineTransform After AggregatedEntityClass AggregationLayer AircraftData AirportData AirPressureData AirTemperatureData AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowAdultContent AllowedCloudExtraParameters AllowedCloudParameterExtensions AllowedDimensions AllowedFrequencyRange AllowedHeads AllowGroupClose AllowIncomplete AllowInlineCells AllowKernelInitialization AllowLooseGrammar AllowReverseGroupClose AllowScriptLevelChange AllTrue Alphabet AlphabeticOrder AlphabeticSort AlphaChannel AlternateImage AlternatingFactorial AlternatingGroup AlternativeHypothesis Alternatives AltitudeMethod AmbientLight AmbiguityFunction AmbiguityList Analytic AnatomyData AnatomyForm AnatomyPlot3D AnatomySkinStyle AnatomyStyling AnchoredSearch And AndersonDarlingTest AngerJ AngleBisector AngleBracket AnglePath AnglePath3D AngleVector AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning AnimationRunTime AnimationTimeIndex Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotate Annotation AnnotationDelete AnnotationNames AnnotationRules AnnotationValue Annuity AnnuityDue Annulus AnomalyDetection AnomalyDetectorFunction Anonymous Antialiasing AntihermitianMatrixQ Antisymmetric AntisymmetricMatrixQ Antonyms AnyOrder AnySubset AnyTrue Apart ApartSquareFree APIFunction Appearance AppearanceElements AppearanceRules AppellF1 Append AppendCheck AppendLayer AppendTo ApplicationIdentificationKey Apply ApplySides ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcCurvature ARCHProcess ArcLength ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Area Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess Around AroundReplace ARProcess Array ArrayComponents ArrayDepth ArrayFilter ArrayFlatten ArrayMesh ArrayPad ArrayPlot ArrayQ ArrayResample ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads ASATriangle Ask AskAppend AskConfirm AskDisplay AskedQ AskedValue AskFunction AskState AskTemplateDisplay AspectRatio AspectRatioFixed Assert AssociateTo Association AssociationFormat AssociationMap AssociationQ AssociationThread AssumeDeterministic Assuming Assumptions AstronomicalData AsymptoticDSolveValue AsymptoticEqual AsymptoticEquivalent AsymptoticGreater AsymptoticGreaterEqual AsymptoticIntegrate AsymptoticLess AsymptoticLessEqual AsymptoticOutputTracker AsymptoticRSolveValue AsymptoticSolve AsymptoticSum Asynchronous AsynchronousTaskObject AsynchronousTasks Atom AtomCoordinates AtomCount AtomDiagramCoordinates AtomList AtomQ AttentionLayer Attributes Audio AudioAmplify AudioAnnotate AudioAnnotationLookup AudioBlockMap AudioCapture AudioChannelAssignment AudioChannelCombine AudioChannelMix AudioChannels AudioChannelSeparate AudioData AudioDelay AudioDelete AudioDevice AudioDistance AudioFade AudioFrequencyShift AudioGenerator AudioIdentify AudioInputDevice AudioInsert AudioIntervals AudioJoin AudioLabel AudioLength AudioLocalMeasurements AudioLooping AudioLoudness AudioMeasurements AudioNormalize AudioOutputDevice AudioOverlay AudioPad AudioPan AudioPartition AudioPause AudioPitchShift AudioPlay AudioPlot AudioQ AudioRecord AudioReplace AudioResample AudioReverb AudioSampleRate AudioSpectralMap AudioSpectralTransformation AudioSplit AudioStop AudioStream AudioStreams AudioTimeStretch AudioTrim AudioType AugmentedPolyhedron AugmentedSymmetricPolynomial Authenticate Authentication AuthenticationDialog AutoAction Autocomplete AutocompletionFunction AutoCopy AutocorrelationTest AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutoQuoteCharacters AutoRefreshed AutoRemove AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords AutoSubmitting Axes AxesEdge AxesLabel AxesOrigin AxesStyle AxiomaticTheory AxisBabyMonsterGroupB Back Background BackgroundAppearance BackgroundTasksSettings Backslash Backsubstitution Backward Ball Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarcodeImage BarcodeRecognize BaringhausHenzeTest BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseDecode BaseEncode BaseForm Baseline BaselinePosition BaseStyle BasicRecurrentLayer BatchNormalizationLayer BatchSize BatesDistribution BattleLemarieWavelet BayesianMaximization BayesianMaximizationObject BayesianMinimization BayesianMinimizationObject Because BeckmannDistribution Beep Before Begin BeginDialogPacket BeginFrontEndInteractionPacket BeginPackage BellB BellY Below BenfordDistribution BeniniDistribution BenktanderGibratDistribution BenktanderWeibullDistribution BernoulliB BernoulliDistribution BernoulliGraphDistribution BernoulliProcess BernsteinBasis BesselFilterModel BesselI BesselJ BesselJZero BesselK BesselY BesselYZero Beta BetaBinomialDistribution BetaDistribution BetaNegativeBinomialDistribution BetaPrimeDistribution BetaRegularized Between BetweennessCentrality BeveledPolyhedron BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryDeserialize BinaryDistance BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinarySerialize BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BiquadraticFilterModel BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor BiweightLocation BiweightMidvariance Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockchainAddressData BlockchainBase BlockchainBlockData BlockchainContractValue BlockchainData BlockchainGet BlockchainKeyEncode BlockchainPut BlockchainTokenData BlockchainTransaction BlockchainTransactionData BlockchainTransactionSign BlockchainTransactionSubmit BlockMap BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bond BondCount BondList BondQ Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms BooleanQ BooleanRegion Booleans BooleanStrings BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryDiscretizeGraphics BoundaryDiscretizeRegion BoundaryMesh BoundaryMeshRegion BoundaryMeshRegionQ BoundaryStyle BoundedRegionQ BoundingRegion Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxObject BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break BridgeData BrightnessEqualize BroadcastStationData Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurve3DBoxOptions BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BSplineSurface3DBoxOptions BubbleChart BubbleChart3D BubbleScale BubbleSizes BuildingData BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteArray ByteArrayFormat ByteArrayQ ByteArrayToString ByteCount ByteOrderingC CachedValue CacheGraphics CachePersistence CalendarConvert CalendarData CalendarType Callout CalloutMarker CalloutStyle CallPacket CanberraDistance Cancel CancelButton CandlestickChart CanonicalGraph CanonicalizePolygon CanonicalizePolyhedron CanonicalName CanonicalWarpingCorrespondence CanonicalWarpingDistance CantorMesh CantorStaircase Cap CapForm CapitalDifferentialD Capitalize CapsuleShape CaptureRunning CardinalBSplineBasis CarlemanLinearize CarmichaelLambda CaseOrdering Cases CaseSensitive Cashflow Casoratian Catalan CatalanNumber Catch Catenate CatenateLayer CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling CelestialSystem Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEvaluationLanguage CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellLabelStyle CellLabelTemplate CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterArray CenterDot CentralFeature CentralMoment CentralMomentGeneratingFunction Cepstrogram CepstrogramArray CepstrumArray CForm ChampernowneNumber ChangeOptions ChannelBase ChannelBrokerAction ChannelDatabin ChannelHistoryLength ChannelListen ChannelListener ChannelListeners ChannelListenerWait ChannelObject ChannelPreSendFunction ChannelReceiverFunction ChannelSend ChannelSubscribers ChanVeseBinarize Character CharacterCounts CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterName CharacterRange Characters ChartBaseStyle ChartElementData ChartElementDataFunction ChartElementFunction ChartElements ChartLabels ChartLayout ChartLegends ChartStyle Chebyshev1FilterModel Chebyshev2FilterModel ChebyshevDistance ChebyshevT ChebyshevU Check CheckAbort CheckAll Checkbox CheckboxBar CheckboxBox CheckboxBoxOptions ChemicalData ChessboardDistance ChiDistribution ChineseRemainder ChiSquareDistribution ChoiceButtons ChoiceDialog CholeskyDecomposition Chop ChromaticityPlot ChromaticityPlot3D ChromaticPolynomial Circle CircleBox CircleDot CircleMinus CirclePlus CirclePoints CircleThrough CircleTimes CirculantGraph CircularOrthogonalMatrixDistribution CircularQuaternionMatrixDistribution CircularRealMatrixDistribution CircularSymplecticMatrixDistribution CircularUnitaryMatrixDistribution Circumsphere CityData ClassifierFunction ClassifierInformation ClassifierMeasurements ClassifierMeasurementsObject Classify ClassPriors Clear ClearAll ClearAttributes ClearCookies ClearPermissions ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipPlanesStyle ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent CloudAccountData CloudBase CloudConnect CloudDeploy CloudDirectory CloudDisconnect CloudEvaluate CloudExport CloudExpression CloudExpressions CloudFunction CloudGet CloudImport CloudLoggingData CloudObject CloudObjectInformation CloudObjectInformationData CloudObjectNameFormat CloudObjects CloudObjectURLType CloudPublish CloudPut CloudRenderingMethod CloudSave CloudShare CloudSubmit CloudSymbol CloudUnshare ClusterClassify ClusterDissimilarityFunction ClusteringComponents ClusteringTree CMYKColor Coarse CodeAssistOptions Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorBalance ColorCombine ColorConvert ColorCoverage ColorData ColorDataFunction ColorDetect ColorDistance ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQ ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorsNear ColorSpace ColorToneMapping Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CombinedEntityClass CombinerFunction CometData CommonDefaultFormatTypes Commonest CommonestFilter CommonName CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompanyData CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledCodeFunction CompiledFunction CompilerOptions Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComplexListPlot ComplexPlot ComplexPlot3D ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries CompositeQ Composition CompoundElement CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData ComputeUncertainty Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath ConformAudio ConformImages Congruent ConicHullRegion ConicHullRegion3DBox ConicHullRegionBox ConicOptimization Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphComponents ConnectedGraphQ ConnectedMeshComponents ConnectedMoleculeComponents ConnectedMoleculeQ ConnectionSettings ConnectLibraryCallbackFunction ConnectSystemModelComponents ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray ConstantArrayLayer ConstantImage ConstantPlusLayer ConstantRegionQ Constants ConstantTimesLayer ConstellationData ConstrainedMax ConstrainedMin Construct Containing ContainsAll ContainsAny ContainsExactly ContainsNone ContainsOnly ContentFieldOptions ContentLocationFunction ContentObject ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTask ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean ContrastiveLossLayer Control ControlActive ControlAlignment ControlGroupContentsBox ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket ConvexHullMesh ConvexPolygonQ ConvexPolyhedronQ ConvolutionLayer Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CookieFunction Cookies CoordinateBoundingBox CoordinateBoundingBoxArray CoordinateBounds CoordinateBoundsArray CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDatabin CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CountDistinct CountDistinctBy CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Counts CountsBy Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateCellID CreateChannel CreateCloudExpression CreateDatabin CreateDataSystemModel CreateDialog CreateDirectory CreateDocument CreateFile CreateIntermediateDirectories CreateManagedLibraryExpression CreateNotebook CreatePalette CreatePalettePacket CreatePermissionsGroup CreateScheduledTask CreateSearchIndex CreateSystemModel CreateTemporary CreateUUID CreateWindow CriterionFunction CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossEntropyLossLayer CrossingCount CrossingDetect CrossingPolygon CrossMatrix Csc Csch CTCLossLayer Cube CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrencyConvert CurrentDate CurrentImage CurrentlySpeakingPacket CurrentNotebookImage CurrentScreenImage CurrentValue Curry CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecompositionD DagumDistribution DamData DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DatabaseConnect DatabaseDisconnect DatabaseReference Databin DatabinAdd DatabinRemove Databins DatabinUpload DataCompression DataDistribution DataRange DataReversed Dataset Date DateBounds Dated DateDelimiters DateDifference DatedUnit DateFormat DateFunction DateHistogram DateList DateListLogPlot DateListPlot DateListStepPlot DateObject DateObjectQ DateOverlapsQ DatePattern DatePlus DateRange DateReduction DateString DateTicksFormat DateValue DateWithinQ DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayHemisphere DaylightQ DayMatchQ DayName DayNightTerminator DayPlus DayRange DayRound DeBruijnGraph DeBruijnSequence Debug DebugTag Decapitalize Decimal DecimalForm DeclareKnownSymbols DeclarePackage Decompose DeconvolutionLayer Decrement Decrypt DecryptFile DedekindEta DeepSpaceProbeData Default DefaultAxesStyle DefaultBaseStyle DefaultBoxStyle DefaultButton DefaultColor DefaultControlPlacement DefaultDuplicateCellStyle DefaultDuration DefaultElement DefaultFaceGridsStyle DefaultFieldHintStyle DefaultFont DefaultFontProperties DefaultFormatType DefaultFormatTypeForStyle DefaultFrameStyle DefaultFrameTicksStyle DefaultGridLinesStyle DefaultInlineFormatType DefaultInputFormatType DefaultLabelStyle DefaultMenuStyle DefaultNaturalLanguage DefaultNewCellStyle DefaultNewInlineCellStyle DefaultNotebook DefaultOptions DefaultOutputFormatType DefaultPrintPrecision DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValue DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod DefineResourceFunction Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic DEigensystem DEigenvalues Deinitialization Del DelaunayMesh Delayed Deletable Delete DeleteAnomalies DeleteBorderComponents DeleteCases DeleteChannel DeleteCloudExpression DeleteContents DeleteDirectory DeleteDuplicates DeleteDuplicatesBy DeleteFile DeleteMissing DeleteObject DeletePermissionsKey DeleteSearchIndex DeleteSmallComponents DeleteStopwords DeleteWithContents DeletionWarning DelimitedArray DelimitedSequence Delimiter DelimiterFlashTime DelimiterMatching Delimiters DeliveryFunction Dendrogram Denominator DensityGraphics DensityHistogram DensityPlot DensityPlot3D DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DerivedKey DescriptorStateSpace DesignMatrix DestroyAfterEvaluation Det DeviceClose DeviceConfigure DeviceExecute DeviceExecuteAsynchronous DeviceObject DeviceOpen DeviceOpenQ DeviceRead DeviceReadBuffer DeviceReadLatest DeviceReadList DeviceReadTimeSeries Devices DeviceStreams DeviceWrite DeviceWriteBuffer DGaussianWavelet DiacriticalPositioning Diagonal DiagonalizableMatrixQ DiagonalMatrix DiagonalMatrixQ Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DictionaryWordQ DifferenceDelta DifferenceOrder DifferenceQuotient DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitalSignature DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralAngle DihedralGroup Dilation DimensionalCombinations DimensionalMeshComponents DimensionReduce DimensionReducerFunction DimensionReduction Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletBeta DirichletCharacter DirichletCondition DirichletConvolve DirichletDistribution DirichletEta DirichletL DirichletLambda DirichletTransform DirichletWindow DisableConsolePrintPacket DisableFormatting DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLimit DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscreteMaxLimit DiscreteMinLimit DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform DiscretizeGraphics DiscretizeRegion Discriminant DisjointQ Disjunction Disk DiskBox DiskMatrix DiskSegment Dispatch DispatchQ DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceMatrix DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers DivideSides Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentGenerator DocumentGeneratorInformation DocumentGeneratorInformationData DocumentGenerators DocumentNotebook DocumentWeightingRules Dodecahedron DomainRegistrationInformation DominantColors DOSTextFormat Dot DotDashed DotEqual DotLayer DotPlusLayer Dotted DoubleBracketingBar DoubleContourIntegral DoubleDownArrow DoubleLeftArrow DoubleLeftRightArrow DoubleLeftTee DoubleLongLeftArrow DoubleLongLeftRightArrow DoubleLongRightArrow DoubleRightArrow DoubleRightTee DoubleUpArrow DoubleUpDownArrow DoubleVerticalBar DoublyInfinite Down DownArrow DownArrowBar DownArrowUpArrow DownLeftRightVector DownLeftTeeVector DownLeftVector DownLeftVectorBar DownRightTeeVector DownRightVector DownRightVectorBar Downsample DownTee DownTeeArrow DownValues DragAndDrop DrawEdges DrawFrontFaces DrawHighlighted Drop DropoutLayer DSolve DSolveValue Dt DualLinearProgramming DualPolyhedron DualSystemsModel DumpGet DumpSave DuplicateFreeQ Duration Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicGeoGraphics DynamicImage DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptionsE EarthImpactData EarthquakeData EccentricityCentrality Echo EchoFunction EclipseType EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeContract EdgeCost EdgeCount EdgeCoverQ EdgeCycleMatrix EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight EdgeWeightedGraphQ Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData ElementwiseLayer ElidedForms Eliminate EliminationOrder Ellipsoid EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmbedCode EmbeddedHTML EmbeddedService EmbeddingLayer EmbeddingObject EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EmptyRegion EnableConsolePrintPacket Enabled Encode Encrypt EncryptedObject EncryptFile End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfBuffer EndOfFile EndOfLine EndOfString EndPackage EngineEnvironment EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entity EntityClass EntityClassList EntityCopies EntityFunction EntityGroup EntityInstance EntityList EntityPrefetch EntityProperties EntityProperty EntityPropertyClass EntityRegister EntityStore EntityStores EntityTypeName EntityUnregister EntityValue Entropy EntropyFilter Environment Epilog EpilogFunction Equal EqualColumns EqualRows EqualTilde EqualTo EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EscapeRadius EstimatedBackground EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerAngles EulerCharacteristic EulerE EulerGamma EulerianGraphQ EulerMatrix EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluateScheduledTask EvaluationBox EvaluationCell EvaluationCompletionAction EvaluationData EvaluationElements EvaluationEnvironment EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels EventSeries ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludedLines ExcludedPhysicalQuantities ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog ExoplanetData Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi ExpirationDate Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportByteArray ExportForm ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpressionUUID ExpToTrig ExtendedEntityClass ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalBundle ExternalCall ExternalDataCharacterEncoding ExternalEvaluate ExternalFunction ExternalFunctionName ExternalObject ExternalOptions ExternalSessionObject ExternalSessions ExternalTypeSignature ExternalValue Extract ExtractArchive ExtractLayer ExtremeValueDistributionFaceForm FaceGrids FaceGridsStyle FacialFeatures Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail Failure FailureAction FailureDistribution FailureQ False FareySequence FARIMAProcess FeatureDistance FeatureExtract FeatureExtraction FeatureExtractor FeatureExtractorFunction FeatureNames FeatureNearest FeatureSpacePlot FeatureSpacePlot3D FeatureTypes FEDisableConsolePrintPacket FeedbackLinearize FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket FetalGrowthData Fibonacci Fibonorial FieldCompletionFunction FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileConvert FileDate FileExistsQ FileExtension FileFormat FileHandler FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameForms FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileSize FileSystemMap FileSystemScan FileTemplate FileTemplateApply FileType FilledCurve FilledCurveBox FilledCurveBoxOptions Filling FillingStyle FillingTransform FilteredEntityClass FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindAnomalies FindArgMax FindArgMin FindChannels FindClique FindClusters FindCookies FindCurvePath FindCycle FindDevices FindDistribution FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEdgeIndependentPaths FindEquationalProof FindEulerianCycle FindExternalEvaluators FindFaces FindFile FindFit FindFormula FindFundamentalCycles FindGeneratingFunction FindGeoLocation FindGeometricConjectures FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindHamiltonianPath FindHiddenMarkovStates FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMatchingColor FindMaximum FindMaximumFlow FindMaxValue FindMeshDefects FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindMoleculeSubstructure FindPath FindPeaks FindPermutation FindPostmanTour FindProcessParameters FindRepeat FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindSpanningTree FindSystemModelEquilibrium FindTextualAnswer FindThreshold FindTransientRepeat FindVertexCover FindVertexCut FindVertexIndependentPaths Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstCase FirstPassageTimeDistribution FirstPosition FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FitRegularization FittedModel FixedOrder FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlattenLayer FlatTopWindow FlipView Floor FlowPolynomial FlushPrintOutputPacket Fold FoldList FoldPair FoldPairList FollowRedirects Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FormControl FormFunction FormLayoutFunction FormObject FormPage FormTheme FormulaData FormulaLookup FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalGaussianNoiseProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameRate FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrenetSerretSystem FrequencySamplingFilterKernel FresnelC FresnelF FresnelG FresnelS Friday FrobeniusNumber FrobeniusSolve FromAbsoluteTime FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS FromEntity FromJulianDate FromLetterNumber FromPolarCoordinates FromRomanNumeral FromSphericalCoordinates FromUnixTime Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullInformationOutputRegulator FullOptions FullRegion FullSimplify Function FunctionCompile FunctionCompileExport FunctionCompileExportByteArray FunctionCompileExportLibrary FunctionCompileExportString FunctionDomain FunctionExpand FunctionInterpolation FunctionPeriod FunctionRange FunctionSpace FussellVeselyImportanceGaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins GalaxyData GalleryView Gamma GammaDistribution GammaRegularized GapPenalty GARCHProcess GatedRecurrentLayer Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianOrthogonalMatrixDistribution GaussianSymplecticMatrixDistribution GaussianUnitaryMatrixDistribution GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateAsymmetricKeyPair GenerateConditions GeneratedCell GeneratedDocumentBinding GenerateDerivedKey GenerateDigitalSignature GenerateDocument GeneratedParameters GeneratedQuantityMagnitudes GenerateHTTPResponse GenerateSecuredAuthenticationKey GenerateSymmetricKey GeneratingFunction GeneratorDescription GeneratorHistoryLength GeneratorOutputType Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeoAntipode GeoArea GeoArraySize GeoBackground GeoBoundingBox GeoBounds GeoBoundsRegion GeoBubbleChart GeoCenter GeoCircle GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDisk GeoDisplacement GeoDistance GeoDistanceList GeoElevationData GeoEntities GeoGraphics GeogravityModelData GeoGridDirectionDifference GeoGridLines GeoGridLinesStyle GeoGridPosition GeoGridRange GeoGridRangePadding GeoGridUnitArea GeoGridUnitDistance GeoGridVector GeoGroup GeoHemisphere GeoHemisphereBoundary GeoHistogram GeoIdentify GeoImage GeoLabels GeoLength GeoListPlot GeoLocation GeologicalPeriodData GeomagneticModelData GeoMarker GeometricAssertion GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricScene GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoModel GeoNearest GeoPath GeoPosition GeoPositionENU GeoPositionXYZ GeoProjection GeoProjectionData GeoRange GeoRangePadding GeoRegionValuePlot GeoResolution GeoScaleBar GeoServer GeoSmoothHistogram GeoStreamPlot GeoStyling GeoStylingImageFunction GeoVariant GeoVector GeoVectorENU GeoVectorPlot GeoVectorXYZ GeoVisibleRegion GeoVisibleRegionBoundary GeoWithinQ GeoZoomLevel GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenAngle GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter GrammarApply GrammarRules GrammarToken Graph Graph3D GraphAssortativity GraphAutomorphismGroup GraphCenter GraphComplement GraphData GraphDensity GraphDiameter GraphDifference GraphDisjointUnion GraphDistance GraphDistanceMatrix GraphElementData GraphEmbedding GraphHighlight GraphHighlightStyle GraphHub Graphics Graphics3D Graphics3DBox Graphics3DBoxOptions GraphicsArray GraphicsBaseline GraphicsBox GraphicsBoxOptions GraphicsColor GraphicsColumn GraphicsComplex GraphicsComplex3DBox GraphicsComplex3DBoxOptions GraphicsComplexBox GraphicsComplexBoxOptions GraphicsContents GraphicsData GraphicsGrid GraphicsGridBox GraphicsGroup GraphicsGroup3DBox GraphicsGroup3DBoxOptions GraphicsGroupBox GraphicsGroupBoxOptions GraphicsGrouping GraphicsHighlightColor GraphicsRow GraphicsSpacing GraphicsStyle GraphIntersection GraphLayout GraphLinkEfficiency GraphPeriphery GraphPlot GraphPlot3D GraphPower GraphPropertyDistribution GraphQ GraphRadius GraphReciprocity GraphRoot GraphStyle GraphUnion Gray GrayLevel Greater GreaterEqual GreaterEqualLess GreaterEqualThan GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterThan GreaterTilde Green GreenFunction Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupBy GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators Groupings GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain GroupTogetherGrouping GroupTogetherNestedGrouping GrowCutComponents Gudermannian GuidedFilter GumbelDistributionHaarWavelet HadamardMatrix HalfLine HalfNormalDistribution HalfPlane HalfSpace HamiltonianGraphQ HammingDistance HammingWindow HandlerFunctions HandlerFunctionsKeys HankelH1 HankelH2 HankelMatrix HankelTransform HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash Haversine HazardFunction Head HeadCompose HeaderLines Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings Here HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenMarkovProcess HiddenSurface Highlighted HighlightGraph HighlightImage HighlightMesh HighpassFilter HigmanSimsGroupHS HilbertCurve HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HistoricalPeriodData HitMissTransform HITSCentrality HjorthDistribution HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HostLookup HotellingTSquareDistribution HoytDistribution HTMLSave HTTPErrorResponse HTTPRedirect HTTPRequest HTTPRequestData HTTPResponse Hue HumanGrowthData HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyperplane Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestDataI IconData Iconize IconizedObject IconRules Icosahedron Identity IdentityMatrix If IgnoreCase IgnoreDiacritics IgnorePunctuation IgnoreSpellCheck IgnoringInactive Im Image Image3D Image3DProjection Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageApplyIndexed ImageAspectRatio ImageAssemble ImageAugmentationLayer ImageBoundingBoxes ImageCache ImageCacheValid ImageCapture ImageCaptureFunction ImageCases ImageChannels ImageClip ImageCollage ImageColorSpace ImageCompose ImageContainsQ ImageContents ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDisplacements ImageDistance ImageEffect ImageExposureCombine ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageFocusCombine ImageForestingComponents ImageFormattingWidth ImageForwardTransformation ImageGraphics ImageHistogram ImageIdentify ImageInstanceQ ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarker ImageMarkers ImageMeasurements ImageMesh ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImagePosition ImagePreviewFunction ImagePyramid ImagePyramidApply ImageQ ImageRangeCache ImageRecolor ImageReflect ImageRegion ImageResize ImageResolution ImageRestyle ImageRotate ImageRotated ImageSaliencyFilter ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions ImagingDevice ImplicitRegion Implies Import ImportAutoReplacements ImportByteArray ImportOptions ImportString ImprovementImportance In Inactivate Inactive IncidenceGraph IncidenceList IncidenceMatrix IncludeAromaticBonds IncludeConstantBasis IncludeDefinitions IncludeDirectories IncludeFileExtension IncludeGeneratorTasks IncludeHydrogens IncludeInflections IncludeMetaInformation IncludePods IncludeQuantities IncludeRelatedTables IncludeSingularTerm IncludeWindowTimes Increment IndefiniteMatrixQ Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentPhysicalQuantity IndependentUnit IndependentUnitDimension IndependentVertexSetQ Indeterminate IndeterminateThreshold IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers InfiniteLine InfinitePlane Infinity Infix InflationAdjust InflationMethod Information InformationData InformationDataGrid Inherited InheritScope InhomogeneousPoissonProcess InitialEvaluationHistory Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InitializationObjects InitializationValue Initialize InitialSeeding InlineCounterAssignments InlineCounterIncrements InlineRules Inner InnerPolygon InnerPolyhedron Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionFunction InsertionPointObject InsertLinebreaks InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Insphere Install InstallService InstanceNormalizationLayer InString Integer IntegerDigits IntegerExponent IntegerLength IntegerName IntegerPart IntegerPartitions IntegerQ IntegerReverse Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction Interpreter InterpretTemplate InterquartileRange Interrupt InterruptSettings IntersectingQ Intersection Interval IntervalIntersection IntervalMarkers IntervalMarkersStyle IntervalMemberQ IntervalSlider IntervalUnion Into Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHankelTransform InverseHaversine InverseImagePyramid InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InverseMellinTransform InversePermutation InverseRadon InverseRadonTransform InverseSeries InverseShortTimeFourier InverseSpectrogram InverseSurvivalFunction InverseTransformedRegion InverseWaveletTransform InverseWeierstrassP InverseWishartMatrixDistribution InverseZTransform Invisible InvisibleApplication InvisibleTimes IPAddress IrreduciblePolynomialQ IslandData IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemAspectRatio ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcessJaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join JoinAcross Joined JoinedCurve JoinedCurveBox JoinedCurveBoxOptions JoinForm JordanDecomposition JordanModelDecomposition JulianDate JuliaSetBoettcher JuliaSetIterationCount JuliaSetPlot JuliaSetPointsK KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KEdgeConnectedComponents KEdgeConnectedGraphQ KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelFunction KernelMixtureDistribution Kernels Ket Key KeyCollisionFunction KeyComplement KeyDrop KeyDropFrom KeyExistsQ KeyFreeQ KeyIntersection KeyMap KeyMemberQ KeypointStrength Keys KeySelect KeySort KeySortBy KeyTake KeyUnion KeyValueMap KeyValuePattern Khinchin KillProcess KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnapsackSolve KnightTourGraph KnotData KnownUnitQ KochCurve KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter KVertexConnectedComponents KVertexConnectedGraphQLABColor Label Labeled LabeledSlider LabelingFunction LabelingSize LabelStyle LabelVisibility LaguerreL LakeData LambdaComponents LambertW LaminaData LanczosWindow LandauDistribution Language LanguageCategory LanguageData LanguageIdentify LanguageOptions LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCHColor LCM LeaderSize LeafCount LeapYearQ LearnDistribution LearnedDistribution LearningRate LearningRateMultipliers LeastSquares LeastSquaresFilterKernel Left LeftArrow LeftArrowBar LeftArrowRightArrow LeftDownTeeVector LeftDownVector LeftDownVectorBar LeftRightArrow LeftRightVector LeftTee LeftTeeArrow LeftTeeVector LeftTriangle LeftTriangleBar LeftTriangleEqual LeftUpDownVector LeftUpTeeVector LeftUpVector LeftUpVectorBar LeftVector LeftVectorBar LegendAppearance Legended LegendFunction LegendLabel LegendLayout LegendMargins LegendMarkers LegendMarkerSize LegendreP LegendreQ LegendreType Length LengthWhile LerchPhi Less LessEqual LessEqualGreater LessEqualThan LessFullEqual LessGreater LessLess LessSlantEqual LessThan LessTilde LetterCharacter LetterCounts LetterNumber LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryDataType LibraryFunction LibraryFunctionError LibraryFunctionInformation LibraryFunctionLoad LibraryFunctionUnload LibraryLoad LibraryUnload LicenseID LiftingFilterData LiftingWaveletTransform LightBlue LightBrown LightCyan Lighter LightGray LightGreen Lighting LightingAngle LightMagenta LightOrange LightPink LightPurple LightRed LightSources LightYellow Likelihood Limit LimitsPositioning LimitsPositioningTokens LindleyDistribution Line Line3DBox Line3DBoxOptions LinearFilter LinearFractionalOptimization LinearFractionalTransform LinearGradientImage LinearizingTransformationData LinearLayer LinearModelFit LinearOffsetFunction LinearOptimization LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBoxOptions LineBreak LinebreakAdjustments LineBreakChart LinebreakSemicolonWeighting LineBreakWithin LineColor LineGraph LineIndent LineIndentMaxFraction LineIntegralConvolutionPlot LineIntegralConvolutionScale LineLegend LineOpacity LineSpacing LineWrapParts LinkActivate LinkClose LinkConnect LinkConnectedQ LinkCreate LinkError LinkFlush LinkFunction LinkHost LinkInterrupt LinkLaunch LinkMode LinkObject LinkOpen LinkOptions LinkPatterns LinkProtocol LinkRankCentrality LinkRead LinkReadHeld LinkReadyQ Links LinkService LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot ListDensityPlot3D Listen ListFormat ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListSliceContourPlot3D ListSliceDensityPlot3D ListSliceVectorPlot3D ListStepPlot ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalAdaptiveBinarize LocalCache LocalClusteringCoefficient LocalizeDefinitions LocalizeVariables LocalObject LocalObjects LocalResponseNormalizationLayer LocalSubmit LocalSymbol LocalTime LocalTimeZone LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogisticSigmoid LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongestOrderedSequence LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow LongShortTermMemoryLayer Lookup Loopback LoopFreeGraphQ LossFunction LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowerTriangularMatrixQ LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LunarEclipse LUVColor LyapunovSolve LyonsGroupLyMachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MailAddressValidation MailExecute MailFolder MailItem MailReceiverFunction MailResponseFunction MailSearch MailServerConnect MailServerConnection MailSettings MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules ManagedLibraryExpressionID ManagedLibraryExpressionQ MandelbrotSetBoettcher MandelbrotSetDistance MandelbrotSetIterationCount MandelbrotSetMemberQ MandelbrotSetPlot MangoldtLambda ManhattanDistance Manipulate Manipulator MannedSpaceMissionData MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarchenkoPasturDistribution MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicalFunctionData MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixNormalDistribution MatrixPlot MatrixPower MatrixPropertyDistribution MatrixQ MatrixRank MatrixTDistribution Max MaxBend MaxCellMeasure MaxColorDistance MaxDetect MaxDuration MaxExtraBandwidths MaxExtraConditions MaxFeatureDisplacement MaxFeatures MaxFilter MaximalBy Maximize MaxItems MaxIterations MaxLimit MaxMemoryUsed MaxMixtureKernels MaxOverlapFraction MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxTrainingRounds MaxValue MaxwellDistribution MaxWordGap McLaughlinGroupMcL Mean MeanAbsoluteLossLayer MeanAround MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter MeanSquaredLossLayer Median MedianDeviation MedianFilter MedicalTestData Medium MeijerG MeijerGReduce MeixnerDistribution MellinConvolve MellinTransform MemberQ MemoryAvailable MemoryConstrained MemoryConstraint MemoryInUse MengerMesh Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuList MenuPacket MenuSortingValue MenuStyle MenuView Merge MergeDifferences MergingFunction MersennePrimeExponent MersennePrimeExponentQ Mesh MeshCellCentroid MeshCellCount MeshCellHighlight MeshCellIndex MeshCellLabel MeshCellMarker MeshCellMeasure MeshCellQuality MeshCells MeshCellShapeFunction MeshCellStyle MeshCoordinates MeshFunctions MeshPrimitives MeshQualityGoal MeshRange MeshRefinementFunction MeshRegion MeshRegionQ MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageObject MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation MeteorShowerData Method MethodOptions MexicanHatWavelet MeyerWavelet Midpoint Min MinColorDistance MinDetect MineralData MinFilter MinimalBy MinimalPolynomial MinimalStateSpaceModel Minimize MinimumTimeIncrement MinIntervalSize MinkowskiQuestionMark MinLimit MinMax MinorPlanetData Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingBehavior MissingDataMethod MissingDataRules MissingQ MissingString MissingStyle MissingValuePattern MittagLefflerE MixedFractionParts MixedGraphQ MixedMagnitude MixedRadix MixedRadixQuantity MixedUnit MixtureDistribution Mod Modal Mode Modular ModularInverse ModularLambda Module Modulus MoebiusMu Molecule MoleculeContainsQ MoleculeEquivalentQ MoleculeGraph MoleculeModify MoleculePattern MoleculePlot MoleculePlot3D MoleculeProperty MoleculeQ MoleculeValue Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction MomentOfInertia Monday Monitor MonomialList MonomialOrder MonsterGroupM MoonPhase MoonPosition MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform MortalityData Most MountainData MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovieData MovingAverage MovingMap MovingMedian MoyalDistribution Multicolumn MultiedgeStyle MultigraphQ MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity MultiplySides Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistributionN NakagamiDistribution NameQ Names NamespaceBox NamespaceBoxOptions Nand NArgMax NArgMin NBernoulliB NBodySimulation NBodySimulationData NCache NDEigensystem NDEigenvalues NDSolve NDSolveValue Nearest NearestFunction NearestNeighborGraph NearestTo NebulaData NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeDefiniteMatrixQ NegativeIntegers NegativeMultinomialDistribution NegativeRationals NegativeReals NegativeSemidefiniteMatrixQ NeighborhoodData NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestGraph NestList NestWhile NestWhileList NetAppend NetBidirectionalOperator NetChain NetDecoder NetDelete NetDrop NetEncoder NetEvaluationMode NetExtract NetFlatten NetFoldOperator NetGraph NetInformation NetInitialize NetInsert NetInsertSharedArrays NetJoin NetMapOperator NetMapThreadOperator NetMeasurements NetModel NetNestOperator NetPairEmbeddingOperator NetPort NetPortGradient NetPrepend NetRename NetReplace NetReplacePart NetSharedArray NetStateObject NetTake NetTrain NetTrainResultsObject NetworkPacketCapture NetworkPacketRecording NetworkPacketRecordingDuring NetworkPacketTrace NeumannValue NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextCell NextDate NextPrime NextScheduledTaskTime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NightHemisphere NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants NondimensionalizationTransform None NoneTrue NonlinearModelFit NonlinearStateSpaceModel NonlocalMeansFilter NonNegative NonNegativeIntegers NonNegativeRationals NonNegativeReals NonPositive NonPositiveIntegers NonPositiveRationals NonPositiveReals Nor NorlundB Norm Normal NormalDistribution NormalGrouping NormalizationLayer Normalize Normalized NormalizedSquaredEuclideanDistance NormalMatrixQ NormalsFunction NormFunction Not NotCongruent NotCupCap NotDoubleVerticalBar Notebook NotebookApply NotebookAutoSave NotebookClose NotebookConvertSettings NotebookCreate NotebookCreateReturnObject NotebookDefault NotebookDelete NotebookDirectory NotebookDynamicExpression NotebookEvaluate NotebookEventActions NotebookFileName NotebookFind NotebookFindReturnObject NotebookGet NotebookGetLayoutInformationPacket NotebookGetMisspellingsPacket NotebookImport NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookTemplate NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde Nothing NotHumpDownHump NotHumpEqual NotificationFunction NotLeftTriangle NotLeftTriangleBar NotLeftTriangleEqual NotLess NotLessEqual NotLessFullEqual NotLessGreater NotLessLess NotLessSlantEqual NotLessTilde NotNestedGreaterGreater NotNestedLessLess NotPrecedes NotPrecedesEqual NotPrecedesSlantEqual NotPrecedesTilde NotReverseElement NotRightTriangle NotRightTriangleBar NotRightTriangleEqual NotSquareSubset NotSquareSubsetEqual NotSquareSuperset NotSquareSupersetEqual NotSubset NotSubsetEqual NotSucceeds NotSucceedsEqual NotSucceedsSlantEqual NotSucceedsTilde NotSuperset NotSupersetEqual NotTilde NotTildeEqual NotTildeFullEqual NotTildeTilde NotVerticalBar Now NoWhitespace NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms NuclearExplosionData NuclearReactorData Null NullRecords NullSpace NullWords Number NumberCompose NumberDecompose NumberExpand NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberLinePlot NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumeratorDenominator NumericalOrder NumericalSort NumericArray NumericArrayQ NumericArrayType NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlotO ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OceanData Octahedron OddQ Off Offset OLEData On ONanGroupON Once OneIdentity Opacity OpacityFunction OpacityFunctionScaling Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionalElement OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering OrderingBy OrderingLayer Orderless OrderlessPatternSequence OrnsteinUhlenbeckProcess Orthogonalize OrthogonalMatrixQ Out Outer OuterPolygon OuterPolyhedron OutputAutoOverwrite OutputControllabilityMatrix OutputControllableModelQ OutputForm OutputFormData OutputGrouping OutputMathEditExpression OutputNamePacket OutputResponse OutputSizeLimit OutputStream Over OverBar OverDot Overflow OverHat Overlaps Overlay OverlayBox OverlayBoxOptions Overscript OverscriptBox OverscriptBoxOptions OverTilde OverVector OverwriteTarget OwenT OwnValuesPackage PackingMethod PaddedForm Padding PaddingLayer PaddingSize PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageTheme PageWidth Pagination PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath PalindromeQ Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo Parallelepiped ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds Parallelogram ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParametricRegion ParentBox ParentCell ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParentNotebook ParetoDistribution ParetoPickandsDistribution ParkData Part PartBehavior PartialCorrelationFunction PartialD ParticleAcceleratorData ParticleData Partition PartitionGranularity PartitionsP PartitionsQ PartLayer PartOfSpeech PartProtection ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteAutoQuoteCharacters PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PeakDetect PeanoCurve PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PercentForm PerfectNumber PerfectNumberQ PerformanceGoal Perimeter PeriodicBoundaryCondition PeriodicInterpolation Periodogram PeriodogramArray Permanent Permissions PermissionsGroup PermissionsGroupMemberQ PermissionsGroups PermissionsKey PermissionsKeys PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PerpendicularBisector PersistenceLocation PersistenceTime PersistentObject PersistentObjects PersistentValue PersonData PERTDistribution PetersenGraph PhaseMargins PhaseRange PhysicalSystemData Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest PingTime Pink PitchRecognize Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarAngle PlanarGraph PlanarGraphQ PlanckRadiationLaw PlaneCurveData PlanetaryMoonData PlanetData PlantData Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLabels PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangeClipPlanesStyle PlotRangePadding PlotRegion PlotStyle PlotTheme Pluralize Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox Point3DBoxOptions PointBox PointBoxOptions PointFigureChart PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonalNumber PolygonAngle PolygonBox PolygonBoxOptions PolygonCoordinates PolygonDecomposition PolygonHoleScale PolygonIntersections PolygonScale Polyhedron PolyhedronAngle PolyhedronCoordinates PolyhedronData PolyhedronDecomposition PolyhedronGenus PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PoolingLayer PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position PositionIndex Positive PositiveDefiniteMatrixQ PositiveIntegers PositiveRationals PositiveReals PositiveSemidefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerRange PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement Predict PredictionRoot PredictorFunction PredictorInformation PredictorMeasurements PredictorMeasurementsObject PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependLayer PrependTo PreprocessingRules PreserveColor PreserveImageOptions Previous PreviousCell PreviousDate PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitivePolynomialQ PrimitiveRoot PrimitiveRootList PrincipalComponents PrincipalValue Print PrintableASCIIQ PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment Printout3D Printout3DPreviewer PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateKey PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessConnection ProcessDirectory ProcessEnvironment Processes ProcessEstimator ProcessInformation ProcessObject ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessStatus ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm ProofObject Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse PsychrometricPropertyData PublicKey PublisherID PulsarData PunctuationCharacter Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptionsQBinomial QFactorial QGamma QHypergeometricPFQ QnDispersion QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ QuadraticOptimization Quantile QuantilePlot Quantity QuantityArray QuantityDistribution QuantityForm QuantityMagnitude QuantityQ QuantityUnit QuantityVariable QuantityVariableCanonicalUnit QuantityVariableDimensions QuantityVariableIdentifier QuantityVariablePhysicalQuantity Quartics QuartileDeviation Quartiles QuartileSkewness Query QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainderRadialGradientImage RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RadonTransform RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Ramp Random RandomChoice RandomColor RandomComplex RandomEntity RandomFunction RandomGeoPosition RandomGraph RandomImage RandomInstance RandomInteger RandomPermutation RandomPoint RandomPolygon RandomPolyhedron RandomPrime RandomReal RandomSample RandomSeed RandomSeeding RandomVariate RandomWalkProcess RandomWord Range RangeFilter RangeSpecification RankedMax RankedMin RarerProbability Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadByteArray ReadLine ReadList ReadProtected ReadString Real RealAbs RealBlockDiagonalForm RealDigits RealExponent Reals RealSign Reap RecognitionPrior RecognitionThreshold Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RectangularRepeatingElement RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate Region RegionBinarize RegionBoundary RegionBounds RegionCentroid RegionDifference RegionDimension RegionDisjoint RegionDistance RegionDistanceFunction RegionEmbeddingDimension RegionEqual RegionFunction RegionImage RegionIntersection RegionMeasure RegionMember RegionMemberFunction RegionMoment RegionNearest RegionNearestFunction RegionPlot RegionPlot3D RegionProduct RegionQ RegionResize RegionSize RegionSymmetricDifference RegionUnion RegionWithin RegisterExternalEvaluator RegularExpression Regularization RegularlySampledQ RegularPolygon ReIm ReImLabels ReImPlot ReImStyle Reinstall RelationalDatabase RelationGraph Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot RemoteAuthorizationCaching RemoteConnect RemoteConnectionObject RemoteFile RemoteRun RemoteRunProcess Remove RemoveAlphaChannel RemoveAsynchronousTask RemoveAudioStream RemoveBackground RemoveChannelListener RemoveChannelSubscribers Removed RemoveDiacritics RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RemoveUsers RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart RepairMesh Repeated RepeatedNull RepeatedString RepeatedTiming RepeatingElement Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated ReplicateLayer RequiredPhysicalQuantities Resampling ResamplingAlgorithmData ResamplingMethod Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask ReshapeLayer Residue ResizeLayer Resolve ResourceAcquire ResourceData ResourceFunction ResourceObject ResourceRegister ResourceRemove ResourceSearch ResourceSubmissionObject ResourceSubmit ResourceSystemBase ResourceUpdate ResponseForm Rest RestartInterval Restricted Resultant ResumePacket Return ReturnEntersInput ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnReceiptFunction ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseSort ReverseSortBy ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ RiemannXi Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightComposition RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity RollPitchYawAngles RollPitchYawMatrix RomanNumeral Root RootApproximant RootIntervals RootLocusPlot RootMeanSquare RootOfUnityQ RootReduce Roots RootSum Rotate RotateLabel RotateLeft RotateRight RotationAction RotationBox RotationBoxOptions RotationMatrix RotationTransform Round RoundImplies RoundingRadius Row RowAlignments RowBackgrounds RowBox RowHeights RowLines RowMinHeight RowReduce RowsEqual RowSpacings RSolve RSolveValue RudinShapiro RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulePlot RulerUnits Run RunProcess RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilaritySameQ SameTest SampledEntityClass SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SASTriangle SatelliteData SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveConnection SaveDefinitions SavitzkyGolayMatrix SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTask ScheduledTaskActiveQ ScheduledTaskInformation ScheduledTaskInformationData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScientificNotationThreshold ScorerGi ScorerGiPrime ScorerHi ScorerHiPrime ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptForm ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition SearchAdjustment SearchIndexObject SearchIndices SearchQueryString SearchResultObject Sec Sech SechDistribution SecondOrderConeOptimization SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SecuredAuthenticationKey SecuredAuthenticationKeys SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook SelectFirst Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemanticImport SemanticImportString SemanticInterpretation SemialgebraicComponentInstances SemidefiniteOptimization SendMail SendMessage Sequence SequenceAlignment SequenceAttentionLayer SequenceCases SequenceCount SequenceFold SequenceFoldList SequenceForm SequenceHold SequenceLastLayer SequenceMostLayer SequencePosition SequencePredict SequencePredictorFunction SequenceReplace SequenceRestLayer SequenceReverseLayer SequenceSplit Series SeriesCoefficient SeriesData ServiceConnect ServiceDisconnect ServiceExecute ServiceObject ServiceRequest ServiceResponse ServiceSubmit SessionSubmit SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetCloudDirectory SetCookies SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPermissions SetPrecision SetProperty SetSecuredAuthenticationKey SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemModel SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetUsers SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share SharingList Sharpen ShearingMatrix ShearingTransform ShellRegion ShenCastanMatrix ShiftedGompertzDistribution ShiftRegisterSequence Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortTimeFourier ShortTimeFourierData ShortUpArrow Show ShowAutoConvert ShowAutoSpellCheck ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowCodeAssist ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiderealTime SiegelTheta SiegelTukeyTest SierpinskiCurve SierpinskiMesh Sign Signature SignedRankTest SignedRegionDistance SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ SimplePolygonQ SimplePolyhedronQ Simplex Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution SkinStyle Skip SliceContourPlot3D SliceDensityPlot3D SliceDistribution SliceVectorPlot3D Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDecomposition SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SnDispersion Snippet SnubPolyhedron SocialMediaData Socket SocketConnect SocketListen SocketListener SocketObject SocketOpen SocketReadMessage SocketReadyQ Sockets SocketWaitAll SocketWaitNext SoftmaxLayer SokalSneathDissimilarity SolarEclipse SolarSystemFeatureData SolidAngle SolidData SolidRegionQ Solve SolveAlways SolveDelayed Sort SortBy SortedBy SortedEntityClass Sound SoundAndGraphics SoundNote SoundVolume SourceLink Sow Space SpaceCurveData SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution SpatialMedian SpatialTransformationLayer Speak SpeakTextPacket SpearmanRankTest SpearmanRho SpeciesData SpecificityGoal SpectralLineData Spectrogram SpectrogramArray Specularity SpeechRecognize SpeechSynthesize SpellingCorrection SpellingCorrectionList SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SpherePoints SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SphericalShell SpheroidalEigenvalue SpheroidalJoiningFactor SpheroidalPS SpheroidalPSPrime SpheroidalQS SpheroidalQSPrime SpheroidalRadialFactor SpheroidalS1 SpheroidalS1Prime SpheroidalS2 SpheroidalS2Prime Splice SplicedDistribution SplineClosed SplineDegree SplineKnots SplineWeights Split SplitBy SpokenString Sqrt SqrtBox SqrtBoxOptions Square SquaredEuclideanDistance SquareFreeQ SquareIntersection SquareMatrixQ SquareRepeatingElement SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave SSSTriangle StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackedDateListPlot StackedListPlot StackInhibit StadiumShape StandardAtmosphereData StandardDeviation StandardDeviationFilter StandardForm Standardize Standardized StandardOceanData StandbyDistribution Star StarClusterData StarData StarGraph StartAsynchronousTask StartExternalSession StartingStepSize StartOfLine StartOfString StartProcess StartScheduledTask StartupSound StartWebSession StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StateTransformationLinearize StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StereochemistryElements StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StoppingPowerData StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamMarkers StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringContainsQ StringCount StringDelete StringDrop StringEndsQ StringExpression StringExtract StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPadLeft StringPadRight StringPart StringPartition StringPosition StringQ StringRepeat StringReplace StringReplaceList StringReplacePart StringReverse StringRiffle StringRotateLeft StringRotateRight StringSkeleton StringSplit StringStartsQ StringTake StringTemplate StringToByteArray StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleData StyleDefinitions StyleForm StyleHints StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subdivide Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subsequences Subset SubsetEqual SubsetMap SubsetQ Subsets SubStar SubstitutionSystem Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubtractSides SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde Success SuchThat Sum SumConvergence SummationLayer Sunday SunPosition Sunrise Sunset SuperDagger SuperMinus SupernovaData SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceArea SurfaceColor SurfaceData SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricKey SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Synonyms Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SynthesizeMissingValues SystemDialogInput SystemException SystemGet SystemHelpPath SystemInformation SystemInformationData SystemInstall SystemModel SystemModeler SystemModelExamples SystemModelLinearize SystemModelParametricSimulate SystemModelPlot SystemModelProgressReporting SystemModelReliability SystemModels SystemModelSimulate SystemModelSimulateSensitivity SystemModelSimulationData SystemOpen SystemOptions SystemProcessData SystemProcesses SystemsConnectionsModel SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelLinearity SystemsModelMerge SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemsModelVectorRelativeOrders SystemStub SystemTestTab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TableViewBoxBackground TableViewBoxOptions TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeDrop TakeLargest TakeLargestBy TakeList TakeSmallest TakeSmallestBy TakeWhile Tally Tan Tanh TargetDevice TargetFunctions TargetSystem TargetUnits TaskAbort TaskExecute TaskObject TaskRemove TaskResume Tasks TaskSuspend TaskWait TautologyQ TelegraphProcess TemplateApply TemplateArgBox TemplateBox TemplateBoxOptions TemplateEvaluate TemplateExpression TemplateIf TemplateObject TemplateSequence TemplateSlot TemplateSlotSequence TemplateUnevaluated TemplateVerbatim TemplateWith TemporalData TemporalRegularity Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge TestID TestReport TestReportObject TestResultObject Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCases TextCell TextClipboardType TextContents TextData TextElement TextForm TextGrid TextJustification TextLine TextPacket TextParagraph TextPosition TextRecognize TextSearch TextSearchReport TextSentences TextString TextStructure TextStyle TextTranslation Texture TextureCoordinateFunction TextureCoordinateScaling TextWords Therefore ThermodynamicData ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreadingLayer ThreeJSymbol Threshold Through Throw ThueMorse Thumbnail Thursday Ticks TicksStyle TideData Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint TimeDirection TimeFormat TimeGoal TimelinePlot TimeObject TimeObjectQ Times TimesBy TimeSeries TimeSeriesAggregate TimeSeriesForecast TimeSeriesInsert TimeSeriesInvertibility TimeSeriesMap TimeSeriesMapThread TimeSeriesModel TimeSeriesModelFit TimeSeriesResample TimeSeriesRescale TimeSeriesShift TimeSeriesThread TimeSeriesWindow TimeUsed TimeValue TimeWarpingCorrespondence TimeWarpingDistance TimeZone TimeZoneConvert TimeZoneOffset Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate Today ToDiscreteTimeModel ToEntity ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase Tomorrow ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform ToPolarCoordinates TopologicalSort ToRadicals ToRules ToSphericalCoordinates ToString Total TotalHeight TotalLayer TotalVariationFilter TotalWidth TouchPosition TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TrackingFunction TracyWidomDistribution TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TrainingProgressCheckpointing TrainingProgressFunction TrainingProgressMeasurements TrainingProgressReporting TrainingStoppingCriterion TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationClass TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField TransformedProcess TransformedRegion TransitionDirection TransitionDuration TransitionEffect TransitiveClosureGraph TransitiveReductionGraph Translate TranslationOptions TranslationTransform Transliterate Transparent TransparentColor Transpose TransposeLayer TrapSelection TravelDirections TravelDirectionsData TravelDistance TravelDistanceList TravelMethod TravelTime TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle Triangle TriangleCenter TriangleConstruct TriangleMeasurement TriangleWave TriangularDistribution TriangulateMesh Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean TrimmedVariance TropicalStormData True TrueQ TruncatedDistribution TruncatedPolyhedron TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBoxOptions TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow TunnelData Tuples TuranGraph TuringMachine TuttePolynomial TwoWayRule Typed TypeSpecifierUnateQ Uncompress UnconstrainedParameters Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UnderseaFeatureData UndirectedEdge UndirectedGraph UndirectedGraphQ UndoOptions UndoTrackedVariables Unequal UnequalTo Unevaluated UniformDistribution UniformGraphDistribution UniformPolyhedron UniformSumDistribution Uninstall Union UnionPlus Unique UnitaryMatrixQ UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitSystem UnitTriangle UnitVector UnitVectorLayer UnityDimensions UniverseModelData UniversityData UnixTime Unprotect UnregisterExternalEvaluator UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpdateSearchIndex UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize UpperTriangularMatrixQ Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpTo UpValues URL URLBuild URLDecode URLDispatcher URLDownload URLDownloadSubmit URLEncode URLExecute URLExpand URLFetch URLFetchAsynchronous URLParse URLQueryDecode URLQueryEncode URLRead URLResponseTime URLSave URLSaveAsynchronous URLShorten URLSubmit UseGraphicsRange UserDefinedWavelet Using UsingFrontEnd UtilityFunctionV2Get ValenceErrorHandling ValidationLength ValidationSet Value ValueBox ValueBoxOptions ValueDimensions ValueForm ValuePreprocessingFunction ValueQ Values ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorAround VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorGreater VectorGreaterEqual VectorLess VectorLessEqual VectorMarkers VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerificationTest VerifyConvergence VerifyDerivedKey VerifyDigitalSignature VerifyInterpretation VerifySecurityCertificates VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexContract VertexCoordinateRules VertexCoordinates VertexCorrelationSimilarity VertexCosineSimilarity VertexCount VertexCoverQ VertexDataCoordinates VertexDegree VertexDelete VertexDiceSimilarity VertexEccentricity VertexInComponent VertexInDegree VertexIndex VertexJaccardSimilarity VertexLabeling VertexLabels VertexLabelStyle VertexList VertexNormals VertexOutComponent VertexOutDegree VertexQ VertexRenderingFunction VertexReplace VertexShape VertexShapeFunction VertexSize VertexStyle VertexTextureCoordinates VertexWeight VertexWeightedGraphQ Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewProjection ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoiceStyleData VoigtDistribution VolcanoData Volume VonMisesDistribution VoronoiMeshWaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WarpingCorrespondence WarpingDistance WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeatherForecastData WebAudioSearch WebElementObject WeberE WebExecute WebImage WebImageSearch WebSearch WebSessionObject WebSessions WebWindowObject Wedge Wednesday WeibullDistribution WeierstrassE1 WeierstrassE2 WeierstrassE3 WeierstrassEta1 WeierstrassEta2 WeierstrassEta3 WeierstrassHalfPeriods WeierstrassHalfPeriodW1 WeierstrassHalfPeriodW2 WeierstrassHalfPeriodW3 WeierstrassInvariantG2 WeierstrassInvariantG3 WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White WhiteNoiseProcess WhitePoint Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WikipediaData WikipediaSearch WilksW WilksWTest WindDirectionData WindingCount WindingPolygon WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowPersistentStyles WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth WindSpeedData WindVectorData WinsorizedMean WinsorizedVariance WishartMatrixDistribution With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult WolframLanguageData Word WordBoundary WordCharacter WordCloud WordCount WordCounts WordData WordDefinition WordFrequency WordFrequencyData WordList WordOrientation WordSearch WordSelectionFunction WordSeparators WordSpacings WordStem WordTranslation WorkingPrecision WrapAround Write WriteLine WriteString WronskianXMLElement XMLObject XMLTemplate Xnor Xor XYZColorYellow Yesterday YuleDissimilarityZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZIPCodeData ZipfDistribution ZoomCenter ZoomFactor ZTest ZTransform$Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AllowExternalChannelFunctions $AssertFunction $Assumptions $AsynchronousTask $AudioInputDevices $AudioOutputDevices $BaseDirectory $BatchInput $BatchOutput $BlockchainBase $BoxForms $ByteOrdering $CacheBaseDirectory $Canceled $ChannelBase $CharacterEncoding $CharacterEncodings $CloudBase $CloudConnected $CloudCreditsAvailable $CloudEvaluation $CloudExpressionBase $CloudObjectNameFormat $CloudObjectURLType $CloudRootDirectory $CloudSymbolBase $CloudUserID $CloudUserUUID $CloudVersion $CloudVersionNumber $CloudWolframEngineVersionNumber $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $Cookies $CookieStore $CreationDate $CurrentLink $CurrentTask $CurrentWebSession $DateStringFormat $DefaultAudioInputDevice $DefaultAudioOutputDevice $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultLocalBase $DefaultMailbox $DefaultNetworkInterface $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $EmbedCodeEnvironments $EmbeddableServices $EntityStores $Epilog $EvaluationCloudBase $EvaluationCloudObject $EvaluationEnvironment $ExportFormats $Failed $FinancialDataSource $FontFamilies $FormatType $FrontEnd $FrontEndSession $GeoEntityTypes $GeoLocation $GeoLocationCity $GeoLocationCountry $GeoLocationPrecision $GeoLocationSource $HistoryLength $HomeDirectory $HTMLExportRules $HTTPCookies $HTTPRequest $IgnoreEOF $ImageFormattingWidth $ImagingDevice $ImagingDevices $ImportFormats $IncomingMailSettings $InitialDirectory $Initialization $InitializationContexts $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $InterpreterTypes $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $LocalBase $LocalSymbolBase $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $MobilePhone $ModuleNumber $NetworkConnected $NetworkInterfaces $NetworkLicense $NewMessage $NewSymbol $Notebooks $NoValue $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $Permissions $PermissionsGroupBase $PersistenceBase $PersistencePath $PipeSupported $PlotTheme $Post $Pre $PreferencesDirectory $PreInitialization $PrePrint $PreRead $PrintForms $PrintLiteral $Printout3DPreviewer $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $PublisherID $RandomState $RecursionLimit $RegisteredDeviceClasses $RegisteredUserName $ReleaseNumber $RequesterAddress $RequesterWolframID $RequesterWolframUUID $ResourceSystemBase $RootDirectory $ScheduledTask $ScriptCommandLine $ScriptInputString $SecuredAuthenticationKeyTokens $ServiceCreditsAvailable $Services $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SourceLink $SSHAuthentication $SummaryBoxDataSizeLimit $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemMemory $SystemShell $SystemTimeZone $SystemWordLength $TemplatePath $TemporaryDirectory $TemporaryPrefix $TestFileName $TextStyle $TimedOut $TimeUnit $TimeZone $TimeZoneEntity $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $UnitSystem $Urgent $UserAddOnsDirectory $UserAgentLanguages $UserAgentMachine $UserAgentName $UserAgentOperatingSystem $UserAgentString $UserAgentVersion $UserBaseDirectory $UserDocumentsDirectory $Username $UserName $UserURLBase $Version $VersionNumber $VoiceStyles $WolframID $WolframUUID\",c:[e.C(\"\\\\(\\\\*\",\"\\\\*\\\\)\",{c:[\"self\"]}),e.QSM,e.CNM]}});hljs.registerLanguage(\"vim\",function(e){return{l:/[!#@\\w]+/,k:{keyword:\"N|0 P|0 X|0 a|0 ab abc abo al am an|0 ar arga argd arge argdo argg argl argu as au aug aun b|0 bN ba bad bd be bel bf bl bm bn bo bp br brea breaka breakd breakl bro bufdo buffers bun bw c|0 cN cNf ca cabc caddb cad caddf cal cat cb cc ccl cd ce cex cf cfir cgetb cgete cg changes chd che checkt cl cla clo cm cmapc cme cn cnew cnf cno cnorea cnoreme co col colo com comc comp con conf cope cp cpf cq cr cs cst cu cuna cunme cw delm deb debugg delc delf dif diffg diffo diffp diffpu diffs diffthis dig di dl dell dj dli do doautoa dp dr ds dsp e|0 ea ec echoe echoh echom echon el elsei em en endfo endf endt endw ene ex exe exi exu f|0 files filet fin fina fini fir fix fo foldc foldd folddoc foldo for fu go gr grepa gu gv ha helpf helpg helpt hi hid his ia iabc if ij il im imapc ime ino inorea inoreme int is isp iu iuna iunme j|0 ju k|0 keepa kee keepj lN lNf l|0 lad laddb laddf la lan lat lb lc lch lcl lcs le lefta let lex lf lfir lgetb lgete lg lgr lgrepa lh ll lla lli lmak lm lmapc lne lnew lnf ln loadk lo loc lockv lol lope lp lpf lr ls lt lu lua luad luaf lv lvimgrepa lw m|0 ma mak map mapc marks mat me menut mes mk mks mksp mkv mkvie mod mz mzf nbc nb nbs new nm nmapc nme nn nnoreme noa no noh norea noreme norm nu nun nunme ol o|0 om omapc ome on ono onoreme opt ou ounme ow p|0 profd prof pro promptr pc ped pe perld po popu pp pre prev ps pt ptN ptf ptj ptl ptn ptp ptr pts pu pw py3 python3 py3d py3f py pyd pyf quita qa rec red redi redr redraws reg res ret retu rew ri rightb rub rubyd rubyf rund ru rv sN san sa sal sav sb sbN sba sbf sbl sbm sbn sbp sbr scrip scripte scs se setf setg setl sf sfir sh sim sig sil sl sla sm smap smapc sme sn sni sno snor snoreme sor so spelld spe spelli spellr spellu spellw sp spr sre st sta startg startr star stopi stj sts sun sunm sunme sus sv sw sy synti sync tN tabN tabc tabdo tabe tabf tabfir tabl tabm tabnew tabn tabo tabp tabr tabs tab ta tags tc tcld tclf te tf th tj tl tm tn to tp tr try ts tu u|0 undoj undol una unh unl unlo unm unme uns up ve verb vert vim vimgrepa vi viu vie vm vmapc vme vne vn vnoreme vs vu vunme windo w|0 wN wa wh wi winc winp wn wp wq wqa ws wu wv x|0 xa xmapc xm xme xn xnoreme xu xunme y|0 z|0 ~ Next Print append abbreviate abclear aboveleft all amenu anoremenu args argadd argdelete argedit argglobal arglocal argument ascii autocmd augroup aunmenu buffer bNext ball badd bdelete behave belowright bfirst blast bmodified bnext botright bprevious brewind break breakadd breakdel breaklist browse bunload bwipeout change cNext cNfile cabbrev cabclear caddbuffer caddexpr caddfile call catch cbuffer cclose center cexpr cfile cfirst cgetbuffer cgetexpr cgetfile chdir checkpath checktime clist clast close cmap cmapclear cmenu cnext cnewer cnfile cnoremap cnoreabbrev cnoremenu copy colder colorscheme command comclear compiler continue confirm copen cprevious cpfile cquit crewind cscope cstag cunmap cunabbrev cunmenu cwindow delete delmarks debug debuggreedy delcommand delfunction diffupdate diffget diffoff diffpatch diffput diffsplit digraphs display deletel djump dlist doautocmd doautoall deletep drop dsearch dsplit edit earlier echo echoerr echohl echomsg else elseif emenu endif endfor endfunction endtry endwhile enew execute exit exusage file filetype find finally finish first fixdel fold foldclose folddoopen folddoclosed foldopen function global goto grep grepadd gui gvim hardcopy help helpfind helpgrep helptags highlight hide history insert iabbrev iabclear ijump ilist imap imapclear imenu inoremap inoreabbrev inoremenu intro isearch isplit iunmap iunabbrev iunmenu join jumps keepalt keepmarks keepjumps lNext lNfile list laddexpr laddbuffer laddfile last language later lbuffer lcd lchdir lclose lcscope left leftabove lexpr lfile lfirst lgetbuffer lgetexpr lgetfile lgrep lgrepadd lhelpgrep llast llist lmake lmap lmapclear lnext lnewer lnfile lnoremap loadkeymap loadview lockmarks lockvar lolder lopen lprevious lpfile lrewind ltag lunmap luado luafile lvimgrep lvimgrepadd lwindow move mark make mapclear match menu menutranslate messages mkexrc mksession mkspell mkvimrc mkview mode mzscheme mzfile nbclose nbkey nbsart next nmap nmapclear nmenu nnoremap nnoremenu noautocmd noremap nohlsearch noreabbrev noremenu normal number nunmap nunmenu oldfiles open omap omapclear omenu only onoremap onoremenu options ounmap ounmenu ownsyntax print profdel profile promptfind promptrepl pclose pedit perl perldo pop popup ppop preserve previous psearch ptag ptNext ptfirst ptjump ptlast ptnext ptprevious ptrewind ptselect put pwd py3do py3file python pydo pyfile quit quitall qall read recover redo redir redraw redrawstatus registers resize retab return rewind right rightbelow ruby rubydo rubyfile rundo runtime rviminfo substitute sNext sandbox sargument sall saveas sbuffer sbNext sball sbfirst sblast sbmodified sbnext sbprevious sbrewind scriptnames scriptencoding scscope set setfiletype setglobal setlocal sfind sfirst shell simalt sign silent sleep slast smagic smapclear smenu snext sniff snomagic snoremap snoremenu sort source spelldump spellgood spellinfo spellrepall spellundo spellwrong split sprevious srewind stop stag startgreplace startreplace startinsert stopinsert stjump stselect sunhide sunmap sunmenu suspend sview swapname syntax syntime syncbind tNext tabNext tabclose tabedit tabfind tabfirst tablast tabmove tabnext tabonly tabprevious tabrewind tag tcl tcldo tclfile tearoff tfirst throw tjump tlast tmenu tnext topleft tprevious trewind tselect tunmenu undo undojoin undolist unabbreviate unhide unlet unlockvar unmap unmenu unsilent update vglobal version verbose vertical vimgrep vimgrepadd visual viusage view vmap vmapclear vmenu vnew vnoremap vnoremenu vsplit vunmap vunmenu write wNext wall while winsize wincmd winpos wnext wprevious wqall wsverb wundo wviminfo xit xall xmapclear xmap xmenu xnoremap xnoremenu xunmap xunmenu yank\",built_in:\"synIDtrans atan2 range matcharg did_filetype asin feedkeys xor argv complete_check add getwinposx getqflist getwinposy screencol clearmatches empty extend getcmdpos mzeval garbagecollect setreg ceil sqrt diff_hlID inputsecret get getfperm getpid filewritable shiftwidth max sinh isdirectory synID system inputrestore winline atan visualmode inputlist tabpagewinnr round getregtype mapcheck hasmapto histdel argidx findfile sha256 exists toupper getcmdline taglist string getmatches bufnr strftime winwidth bufexists strtrans tabpagebuflist setcmdpos remote_read printf setloclist getpos getline bufwinnr float2nr len getcmdtype diff_filler luaeval resolve libcallnr foldclosedend reverse filter has_key bufname str2float strlen setline getcharmod setbufvar index searchpos shellescape undofile foldclosed setqflist buflisted strchars str2nr virtcol floor remove undotree remote_expr winheight gettabwinvar reltime cursor tabpagenr finddir localtime acos getloclist search tanh matchend rename gettabvar strdisplaywidth type abs py3eval setwinvar tolower wildmenumode log10 spellsuggest bufloaded synconcealed nextnonblank server2client complete settabwinvar executable input wincol setmatches getftype hlID inputsave searchpair or screenrow line settabvar histadd deepcopy strpart remote_peek and eval getftime submatch screenchar winsaveview matchadd mkdir screenattr getfontname libcall reltimestr getfsize winnr invert pow getbufline byte2line soundfold repeat fnameescape tagfiles sin strwidth spellbadword trunc maparg log lispindent hostname setpos globpath remote_foreground getchar synIDattr fnamemodify cscope_connection stridx winbufnr indent min complete_add nr2char searchpairpos inputdialog values matchlist items hlexists strridx browsedir expand fmod pathshorten line2byte argc count getwinvar glob foldtextresult getreg foreground cosh matchdelete has char2nr simplify histget searchdecl iconv winrestcmd pumvisible writefile foldlevel haslocaldir keys cos matchstr foldtext histnr tan tempname getcwd byteidx getbufvar islocked escape eventhandler remote_send serverlist winrestview synstack pyeval prevnonblank readfile cindent filereadable changenr exp\"},i:/;/,c:[e.NM,{cN:\"string\",b:\"'\",e:\"'\",i:\"\\\\n\"},{cN:\"string\",b:/\"(\\\\\"|\\n\\\\|[^\"\\n])*\"/},e.C('\"',\"$\"),{cN:\"variable\",b:/[bwtglsav]:[\\w\\d_]*/},{cN:\"function\",bK:\"function function!\",e:\"$\",relevance:0,c:[e.TM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]},{cN:\"symbol\",b:/<[\\w-]+>/}]}});hljs.registerLanguage(\"makefile\",function(e){var i={cN:\"variable\",v:[{b:\"\\\\$\\\\(\"+e.UIR+\"\\\\)\",c:[e.BE]},{b:/\\$[@%<?\\^\\+\\*]/}]},r={cN:\"string\",b:/\"/,e:/\"/,c:[e.BE,i]},a={cN:\"variable\",b:/\\$\\([\\w-]+\\s/,e:/\\)/,k:{built_in:\"subst patsubst strip findstring filter filter-out sort word wordlist firstword lastword dir notdir suffix basename addsuffix addprefix join wildcard realpath abspath error warning shell origin flavor foreach if or and call eval file value\"},c:[i]},n={b:\"^\"+e.UIR+\"\\\\s*(?=[:+?]?=)\"},t={cN:\"section\",b:/^[^\\s]+:/,e:/$/,c:[i]};return{aliases:[\"mk\",\"mak\"],k:\"define endef undefine ifdef ifndef ifeq ifneq else endif include -include sinclude override export unexport private vpath\",l:/[\\w-]+/,c:[e.HCM,i,r,a,n,{cN:\"meta\",b:/^\\.PHONY:/,e:/$/,k:{\"meta-keyword\":\".PHONY\"},l:/[\\.\\w]+/},t]}});hljs.registerLanguage(\"objectivec\",function(e){var t=/[a-zA-Z@][a-zA-Z0-9_]*/,i=\"@interface @class @protocol @implementation\";return{aliases:[\"mm\",\"objc\",\"obj-c\"],k:{keyword:\"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN\",literal:\"false true FALSE TRUE nil YES NO NULL\",built_in:\"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once\"},l:t,i:\"</\",c:[{cN:\"built_in\",b:\"\\\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\\\w+\"},e.CLCM,e.CBCM,e.CNM,e.QSM,e.ASM,{cN:\"string\",v:[{b:'@\"',e:'\"',i:\"\\\\n\",c:[e.BE]}]},{cN:\"meta\",b:/#\\s*[a-z]+\\b/,e:/$/,k:{\"meta-keyword\":\"if else elif endif define undef warning error line pragma ifdef ifndef include\"},c:[{b:/\\\\\\n/,relevance:0},e.inherit(e.QSM,{cN:\"meta-string\"}),{cN:\"meta-string\",b:/<.*?>/,e:/$/,i:\"\\\\n\"},e.CLCM,e.CBCM]},{cN:\"class\",b:\"(\"+i.split(\" \").join(\"|\")+\")\\\\b\",e:\"({|$)\",eE:!0,k:i,l:t,c:[e.UTM]},{b:\"\\\\.\"+e.UIR,relevance:0}]}});hljs.registerLanguage(\"shell\",function(s){return{aliases:[\"console\"],c:[{cN:\"meta\",b:\"^\\\\s{0,3}[/\\\\w\\\\d\\\\[\\\\]()@-]*[>%$#]\",starts:{e:\"$\",sL:\"bash\"}}]}});hljs.registerLanguage(\"erlang\",function(e){var r=\"[a-z'][a-zA-Z0-9_']*\",c=\"(\"+r+\":\"+r+\"|\"+r+\")\",n={keyword:\"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor\",literal:\"false true\"},a=e.C(\"%\",\"$\"),b={cN:\"number\",b:\"\\\\b(\\\\d+#[a-fA-F0-9]+|\\\\d+(\\\\.\\\\d+)?([eE][-+]?\\\\d+)?)\",relevance:0},i={b:\"fun\\\\s+\"+r+\"/\\\\d+\"},l={b:c+\"\\\\(\",e:\"\\\\)\",rB:!0,relevance:0,c:[{b:c,relevance:0},{b:\"\\\\(\",e:\"\\\\)\",eW:!0,rE:!0,relevance:0}]},d={b:\"{\",e:\"}\",relevance:0},o={b:\"\\\\b_([A-Z][A-Za-z0-9_]*)?\",relevance:0},t={b:\"[A-Z][a-zA-Z0-9_]*\",relevance:0},v={b:\"#\"+e.UIR,relevance:0,rB:!0,c:[{b:\"#\"+e.UIR,relevance:0},{b:\"{\",e:\"}\",relevance:0}]},f={bK:\"fun receive if try case\",e:\"end\",k:n};f.c=[a,i,e.inherit(e.ASM,{cN:\"\"}),f,l,e.QSM,b,d,o,t,v];var s=[a,i,f,l,e.QSM,b,d,o,t,v];l.c[1].c=s,d.c=s;var u={cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:v.c[1].c=s};return{aliases:[\"erl\"],k:n,i:\"(</|\\\\*=|\\\\+=|-=|/\\\\*|\\\\*/|\\\\(\\\\*|\\\\*\\\\))\",c:[{cN:\"function\",b:\"^\"+r+\"\\\\s*\\\\(\",e:\"->\",rB:!0,i:\"\\\\(|#|//|/\\\\*|\\\\\\\\|:|;\",c:[u,e.inherit(e.TM,{b:r})],starts:{e:\";|\\\\.\",k:n,c:s}},a,{b:\"^-\",e:\"\\\\.\",relevance:0,eE:!0,rB:!0,l:\"-\"+e.IR,k:\"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec\",c:[u]},b,e.QSM,v,o,t,d,{b:/\\.$/}]}});hljs.registerLanguage(\"powershell\",function(e){var t={keyword:\"if else foreach return do while until elseif begin for trap data dynamicparam end break throw param continue finally in switch exit filter try process catch hidden static parameter\"},n={b:\"`[\\\\s\\\\S]\",relevance:0},c={cN:\"variable\",v:[{b:/\\$\\B/},{cN:\"keyword\",b:/\\$this/},{b:/\\$[\\w\\d][\\w\\d_:]*/}]},i={cN:\"string\",v:[{b:/\"/,e:/\"/},{b:/@\"/,e:/^\"@/}],c:[n,c,{cN:\"variable\",b:/\\$[A-z]/,e:/[^A-z]/}]},a={cN:\"string\",v:[{b:/'/,e:/'/},{b:/@'/,e:/^'@/}]},r=e.inherit(e.C(null,null),{v:[{b:/#/,e:/$/},{b:/<#/,e:/#>/}],c:[{cN:\"doctag\",v:[{b:/\\.(synopsis|description|example|inputs|outputs|notes|link|component|role|functionality)/},{b:/\\.(parameter|forwardhelptargetname|forwardhelpcategory|remotehelprunspace|externalhelp)\\s+\\S+/}]}]}),o={cN:\"built_in\",v:[{b:\"(\".concat(\"Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|Hide|Join|Lock|Move|New|Open|Optimize|Pop|Push|Redo|Remove|Rename|Reset|Resize|Search|Select|Set|Show|Skip|Split|Step|Switch|Undo|Unlock|Watch|Backup|Checkpoint|Compare|Compress|Convert|ConvertFrom|ConvertTo|Dismount|Edit|Expand|Export|Group|Import|Initialize|Limit|Merge|New|Out|Publish|Restore|Save|Sync|Unpublish|Update|Approve|Assert|Complete|Confirm|Deny|Disable|Enable|Install|Invoke|Register|Request|Restart|Resume|Start|Stop|Submit|Suspend|Uninstall|Unregister|Wait|Debug|Measure|Ping|Repair|Resolve|Test|Trace|Connect|Disconnect|Read|Receive|Send|Write|Block|Grant|Protect|Revoke|Unblock|Unprotect|Use|ForEach|Sort|Tee|Where\",\")+(-)[\\\\w\\\\d]+\")}]},l={cN:\"class\",bK:\"class enum\",e:/\\s*[{]/,eE:!0,relevance:0,c:[e.TM]},s={cN:\"function\",b:/function\\s+/,e:/\\s*\\{|$/,eE:!0,rB:!0,relevance:0,c:[{b:\"function\",relevance:0,cN:\"keyword\"},{cN:\"title\",b:/\\w[\\w\\d]*((-)[\\w\\d]+)*/,relevance:0},{b:/\\(/,e:/\\)/,cN:\"params\",relevance:0,c:[c]}]},p={b:/using\\s/,e:/$/,rB:!0,c:[i,a,{cN:\"keyword\",b:/(using|assembly|command|module|namespace|type)/}]},b={v:[{cN:\"operator\",b:\"(\".concat(\"-and|-as|-band|-bnot|-bor|-bxor|-casesensitive|-ccontains|-ceq|-cge|-cgt|-cle|-clike|-clt|-cmatch|-cne|-cnotcontains|-cnotlike|-cnotmatch|-contains|-creplace|-csplit|-eq|-exact|-f|-file|-ge|-gt|-icontains|-ieq|-ige|-igt|-ile|-ilike|-ilt|-imatch|-in|-ine|-inotcontains|-inotlike|-inotmatch|-ireplace|-is|-isnot|-isplit|-join|-le|-like|-lt|-match|-ne|-not|-notcontains|-notin|-notlike|-notmatch|-or|-regex|-replace|-shl|-shr|-split|-wildcard|-xor\",\")\\\\b\")},{cN:\"literal\",b:/(-)[\\w\\d]+/,relevance:0}]},d={cN:\"function\",b:/\\[.*\\]\\s*[\\w]+[ ]??\\(/,e:/$/,rB:!0,relevance:0,c:[{cN:\"keyword\",b:\"(\".concat(t.keyword.toString().replace(/\\s/g,\"|\"),\")\\\\b\"),endsParent:!0,relevance:0},e.inherit(e.TM,{endsParent:!0})]},u=[d,r,n,e.NM,i,a,o,c,{cN:\"literal\",b:/\\$(null|true|false)\\b/},{cN:\"selector-tag\",b:/\\@\\B/,relevance:0}],m={b:/\\[/,e:/\\]/,eB:!0,eE:!0,relevance:0,c:[].concat(\"self\",u,{b:\"(\"+[\"string\",\"char\",\"byte\",\"int\",\"long\",\"bool\",\"decimal\",\"single\",\"double\",\"DateTime\",\"xml\",\"array\",\"hashtable\",\"void\"].join(\"|\")+\")\",cN:\"built_in\",relevance:0},{cN:\"type\",b:/[\\.\\w\\d]+/,relevance:0})};return d.c.unshift(m),{aliases:[\"ps\",\"ps1\"],l:/-?[A-z\\.\\-]+/,cI:!0,k:t,c:u.concat(l,s,p,b,m)}});hljs.registerLanguage(\"typescript\",function(e){var r=\"[A-Za-z$_][0-9A-Za-z$_]*\",t={keyword:\"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract as from extends async await\",literal:\"true false null undefined NaN Infinity\",built_in:\"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void Promise\"},n={cN:\"meta\",b:\"@\"+r},a={b:\"\\\\(\",e:/\\)/,k:t,c:[\"self\",e.QSM,e.ASM,e.NM]},c={cN:\"params\",b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,c:[e.CLCM,e.CBCM,n,a]},s={cN:\"number\",v:[{b:\"\\\\b(0[bB][01]+)n?\"},{b:\"\\\\b(0[oO][0-7]+)n?\"},{b:e.CNR+\"n?\"}],relevance:0},o={cN:\"subst\",b:\"\\\\$\\\\{\",e:\"\\\\}\",k:t,c:[]},i={b:\"html`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"xml\"}},l={b:\"css`\",e:\"\",starts:{e:\"`\",rE:!1,c:[e.BE,o],sL:\"css\"}},b={cN:\"string\",b:\"`\",e:\"`\",c:[e.BE,o]};return o.c=[e.ASM,e.QSM,i,l,b,s,e.RM],{aliases:[\"ts\"],k:t,c:[{cN:\"meta\",b:/^\\s*['\"]use strict['\"]/},e.ASM,e.QSM,i,l,b,e.CLCM,e.CBCM,s,{b:\"(\"+e.RSR+\"|\\\\b(case|return|throw)\\\\b)\\\\s*\",k:\"return throw case\",c:[e.CLCM,e.CBCM,e.RM,{cN:\"function\",b:\"(\\\\(.*?\\\\)|\"+e.IR+\")\\\\s*=>\",rB:!0,e:\"\\\\s*=>\",c:[{cN:\"params\",v:[{b:e.IR},{b:/\\(\\s*\\)/},{b:/\\(/,e:/\\)/,eB:!0,eE:!0,k:t,c:[\"self\",e.CLCM,e.CBCM]}]}]}],relevance:0},{cN:\"function\",bK:\"function\",e:/[\\{;]/,eE:!0,k:t,c:[\"self\",e.inherit(e.TM,{b:r}),c],i:/%/,relevance:0},{bK:\"constructor\",e:/[\\{;]/,eE:!0,c:[\"self\",c]},{b:/module\\./,k:{built_in:\"module\"},relevance:0},{bK:\"module\",e:/\\{/,eE:!0},{bK:\"interface\",e:/\\{/,eE:!0,k:\"interface extends\"},{b:/\\$[(.]/},{b:\"\\\\.\"+e.IR,relevance:0},n,a]}});hljs.registerLanguage(\"fortran\",function(e){return{cI:!0,aliases:[\"f90\",\"f95\"],k:{literal:\".False. .True.\",keyword:\"kind do while private call intrinsic where elsewhere type endtype endmodule endselect endinterface end enddo endif if forall endforall only contains default return stop then block endblock public subroutine|10 function program .and. .or. .not. .le. .eq. .ge. .gt. .lt. goto save else use module select case access blank direct exist file fmt form formatted iostat name named nextrec number opened rec recl sequential status unformatted unit continue format pause cycle exit c_null_char c_alert c_backspace c_form_feed flush wait decimal round iomsg synchronous nopass non_overridable pass protected volatile abstract extends import non_intrinsic value deferred generic final enumerator class associate bind enum c_int c_short c_long c_long_long c_signed_char c_size_t c_int8_t c_int16_t c_int32_t c_int64_t c_int_least8_t c_int_least16_t c_int_least32_t c_int_least64_t c_int_fast8_t c_int_fast16_t c_int_fast32_t c_int_fast64_t c_intmax_t C_intptr_t c_float c_double c_long_double c_float_complex c_double_complex c_long_double_complex c_bool c_char c_null_ptr c_null_funptr c_new_line c_carriage_return c_horizontal_tab c_vertical_tab iso_c_binding c_loc c_funloc c_associated c_f_pointer c_ptr c_funptr iso_fortran_env character_storage_size error_unit file_storage_size input_unit iostat_end iostat_eor numeric_storage_size output_unit c_f_procpointer ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode newunit contiguous recursive pad position action delim readwrite eor advance nml interface procedure namelist include sequence elemental pure integer real character complex logical dimension allocatable|10 parameter external implicit|10 none double precision assign intent optional pointer target in out common equivalence data\",built_in:\"alog alog10 amax0 amax1 amin0 amin1 amod cabs ccos cexp clog csin csqrt dabs dacos dasin datan datan2 dcos dcosh ddim dexp dint dlog dlog10 dmax1 dmin1 dmod dnint dsign dsin dsinh dsqrt dtan dtanh float iabs idim idint idnint ifix isign max0 max1 min0 min1 sngl algama cdabs cdcos cdexp cdlog cdsin cdsqrt cqabs cqcos cqexp cqlog cqsin cqsqrt dcmplx dconjg derf derfc dfloat dgamma dimag dlgama iqint qabs qacos qasin qatan qatan2 qcmplx qconjg qcos qcosh qdim qerf qerfc qexp qgamma qimag qlgama qlog qlog10 qmax1 qmin1 qmod qnint qsign qsin qsinh qsqrt qtan qtanh abs acos aimag aint anint asin atan atan2 char cmplx conjg cos cosh exp ichar index int log log10 max min nint sign sin sinh sqrt tan tanh print write dim lge lgt lle llt mod nullify allocate deallocate adjustl adjustr all allocated any associated bit_size btest ceiling count cshift date_and_time digits dot_product eoshift epsilon exponent floor fraction huge iand ibclr ibits ibset ieor ior ishft ishftc lbound len_trim matmul maxexponent maxloc maxval merge minexponent minloc minval modulo mvbits nearest pack present product radix random_number random_seed range repeat reshape rrspacing scale scan selected_int_kind selected_real_kind set_exponent shape size spacing spread sum system_clock tiny transpose trim ubound unpack verify achar iachar transfer dble entry dprod cpu_time command_argument_count get_command get_command_argument get_environment_variable is_iostat_end ieee_arithmetic ieee_support_underflow_control ieee_get_underflow_mode ieee_set_underflow_mode is_iostat_eor move_alloc new_line selected_char_kind same_type_as extends_type_ofacosh asinh atanh bessel_j0 bessel_j1 bessel_jn bessel_y0 bessel_y1 bessel_yn erf erfc erfc_scaled gamma log_gamma hypot norm2 atomic_define atomic_ref execute_command_line leadz trailz storage_size merge_bits bge bgt ble blt dshiftl dshiftr findloc iall iany iparity image_index lcobound ucobound maskl maskr num_images parity popcnt poppar shifta shiftl shiftr this_image\"},i:/\\/\\*/,c:[e.inherit(e.ASM,{cN:\"string\",relevance:0}),e.inherit(e.QSM,{cN:\"string\",relevance:0}),{cN:\"function\",bK:\"subroutine function program\",i:\"[${=\\\\n]\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\"}]},e.C(\"!\",\"$\",{relevance:0}),{cN:\"number\",b:\"(?=\\\\b|\\\\+|\\\\-|\\\\.)(?=\\\\.\\\\d|\\\\d)(?:\\\\d+)?(?:\\\\.?\\\\d*)(?:[de][+-]?\\\\d+)?\\\\b\\\\.?\",relevance:0}]}});hljs.registerLanguage(\"php\",function(e){var c={b:\"\\\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*\"},i={cN:\"meta\",b:/<\\?(php)?|\\?>/},t={cN:\"string\",c:[e.BE,i],v:[{b:'b\"',e:'\"'},{b:\"b'\",e:\"'\"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:[\"php\",\"php3\",\"php4\",\"php5\",\"php6\",\"php7\"],cI:!0,k:\"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally\",c:[e.HCM,e.C(\"//\",\"$\",{c:[i]}),e.C(\"/\\\\*\",\"\\\\*/\",{c:[{cN:\"doctag\",b:\"@[A-Za-z]+\"}]}),e.C(\"__halt_compiler.+?;\",!1,{eW:!0,k:\"__halt_compiler\",l:e.UIR}),{cN:\"string\",b:/<<<['\"]?\\w+['\"]?$/,e:/^\\w+;?$/,c:[e.BE,{cN:\"subst\",v:[{b:/\\$\\w+/},{b:/\\{\\$/,e:/\\}/}]}]},i,{cN:\"keyword\",b:/\\$this\\b/},c,{b:/(::|->)+[a-zA-Z_\\x7f-\\xff][a-zA-Z0-9_\\x7f-\\xff]*/},{cN:\"function\",bK:\"function\",e:/[;{]/,eE:!0,i:\"\\\\$|\\\\[|%\",c:[e.UTM,{cN:\"params\",b:\"\\\\(\",e:\"\\\\)\",c:[\"self\",c,e.CBCM,t,a]}]},{cN:\"class\",bK:\"class interface\",e:\"{\",eE:!0,i:/[:\\(\\$\"]/,c:[{bK:\"extends implements\"},e.UTM]},{bK:\"namespace\",e:\";\",i:/[\\.']/,c:[e.UTM]},{bK:\"use\",e:\";\",c:[e.UTM]},{b:\"=>\"},t,a]}});hljs.registerLanguage(\"haskell\",function(e){var i={v:[e.C(\"--\",\"$\"),e.C(\"{-\",\"-}\",{c:[\"self\"]})]},a={cN:\"meta\",b:\"{-#\",e:\"#-}\"},l={cN:\"meta\",b:\"^#\",e:\"$\"},c={cN:\"type\",b:\"\\\\b[A-Z][\\\\w']*\",relevance:0},n={b:\"\\\\(\",e:\"\\\\)\",i:'\"',c:[a,l,{cN:\"type\",b:\"\\\\b[A-Z][\\\\w]*(\\\\((\\\\.\\\\.|,|\\\\w+)\\\\))?\"},e.inherit(e.TM,{b:\"[_a-z][\\\\w']*\"}),i]};return{aliases:[\"hs\"],k:\"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec\",c:[{bK:\"module\",e:\"where\",k:\"module where\",c:[n,i],i:\"\\\\W\\\\.|;\"},{b:\"\\\\bimport\\\\b\",e:\"$\",k:\"import qualified as hiding\",c:[n,i],i:\"\\\\W\\\\.|;\"},{cN:\"class\",b:\"^(\\\\s*)?(class|instance)\\\\b\",e:\"where\",k:\"class family instance where\",c:[c,n,i]},{cN:\"class\",b:\"\\\\b(data|(new)?type)\\\\b\",e:\"$\",k:\"data family type newtype deriving\",c:[a,c,n,{b:\"{\",e:\"}\",c:n.c},i]},{bK:\"default\",e:\"$\",c:[c,n,i]},{bK:\"infix infixl infixr\",e:\"$\",c:[e.CNM,i]},{b:\"\\\\bforeign\\\\b\",e:\"$\",k:\"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe\",c:[c,e.QSM,i]},{cN:\"meta\",b:\"#!\\\\/usr\\\\/bin\\\\/env runhaskell\",e:\"$\"},a,l,e.QSM,e.CNM,c,e.inherit(e.TM,{b:\"^[_a-z][\\\\w']*\"}),i,{b:\"->|<-\"}]}});hljs.registerLanguage(\"coffeescript\",function(e){var c={keyword:\"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not\",literal:\"true false null undefined yes no on off\",built_in:\"npm require console print module global window document\"},n=\"[A-Za-z$_][0-9A-Za-z$_]*\",r={cN:\"subst\",b:/#\\{/,e:/}/,k:c},i=[e.BNM,e.inherit(e.CNM,{starts:{e:\"(\\\\s*/)?\",relevance:0}}),{cN:\"string\",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/\"\"\"/,e:/\"\"\"/,c:[e.BE,r]},{b:/\"/,e:/\"/,c:[e.BE,r]}]},{cN:\"regexp\",v:[{b:\"///\",e:\"///\",c:[r,e.HCM]},{b:\"//[gim]{0,3}(?=\\\\W)\",relevance:0},{b:/\\/(?![ *]).*?(?![\\\\]).\\/[gim]{0,3}(?=\\W)/}]},{b:\"@\"+n},{sL:\"javascript\",eB:!0,eE:!0,v:[{b:\"```\",e:\"```\"},{b:\"`\",e:\"`\"}]}];r.c=i;var s=e.inherit(e.TM,{b:n}),t=\"(\\\\(.*\\\\))?\\\\s*\\\\B[-=]>\",a={cN:\"params\",b:\"\\\\([^\\\\(]\",rB:!0,c:[{b:/\\(/,e:/\\)/,k:c,c:[\"self\"].concat(i)}]};return{aliases:[\"coffee\",\"cson\",\"iced\"],k:c,i:/\\/\\*/,c:i.concat([e.C(\"###\",\"###\"),e.HCM,{cN:\"function\",b:\"^\\\\s*\"+n+\"\\\\s*=\\\\s*\"+t,e:\"[-=]>\",rB:!0,c:[s,a]},{b:/[:\\(,=]\\s*/,relevance:0,c:[{cN:\"function\",b:t,e:\"[-=]>\",rB:!0,c:[a]}]},{cN:\"class\",bK:\"class\",e:\"$\",i:/[:=\"\\[\\]]/,c:[{bK:\"extends\",eW:!0,i:/[:=\"\\[\\]]/,c:[s]},s]},{b:n+\":\",e:\":\",rB:!0,rE:!0,relevance:0}])}});hljs.registerLanguage(\"r\",function(e){var r=\"([a-zA-Z]|\\\\.[a-zA-Z.])[a-zA-Z0-9._]*\";return{c:[e.HCM,{b:r,l:r,k:{keyword:\"function if in break next repeat else for return switch while try tryCatch stop warning require library attach detach source setMethod setGeneric setGroupGeneric setClass ...\",literal:\"NULL NA TRUE FALSE T F Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10\"},relevance:0},{cN:\"number\",b:\"0[xX][0-9a-fA-F]+[Li]?\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\d+(?:[eE][+\\\\-]?\\\\d*)?L\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\d+\\\\.(?!\\\\d)(?:i\\\\b)?\",relevance:0},{cN:\"number\",b:\"\\\\d+(?:\\\\.\\\\d*)?(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",relevance:0},{cN:\"number\",b:\"\\\\.\\\\d+(?:[eE][+\\\\-]?\\\\d*)?i?\\\\b\",relevance:0},{b:\"`\",e:\"`\",relevance:0},{cN:\"string\",c:[e.BE],v:[{b:'\"',e:'\"'},{b:\"'\",e:\"'\"}]}]}});hljs.registerLanguage(\"autohotkey\",function(e){var a={b:\"`[\\\\s\\\\S]\"};return{cI:!0,aliases:[\"ahk\"],k:{keyword:\"Break Continue Critical Exit ExitApp Gosub Goto New OnExit Pause return SetBatchLines SetTimer Suspend Thread Throw Until ahk_id ahk_class ahk_pid ahk_exe ahk_group\",literal:\"true false NOT AND OR\",built_in:\"ComSpec Clipboard ClipboardAll ErrorLevel\"},c:[a,e.inherit(e.QSM,{c:[a]}),e.C(\";\",\"$\",{relevance:0}),e.CBCM,{cN:\"number\",b:e.NR,relevance:0},{cN:\"variable\",b:\"%[a-zA-Z0-9#_$@]+%\"},{cN:\"built_in\",b:\"^\\\\s*\\\\w+\\\\s*(,|%)\"},{cN:\"title\",v:[{b:'^[^\\\\n\";]+::(?!=)'},{b:'^[^\\\\n\";]+:(?!=)',relevance:0}]},{cN:\"meta\",b:\"^\\\\s*#\\\\w+\",e:\"$\",relevance:0},{cN:\"built_in\",b:\"A_[a-zA-Z0-9]+\"},{b:\",\\\\s*,\"}]}});hljs.registerLanguage(\"elixir\",function(e){var b=\"[a-zA-Z_][a-zA-Z0-9_.]*(\\\\!|\\\\?)?\",c=\"and false then defined module in return redo retry end for true self when next until do begin unless nil break not case cond alias while ensure or include use alias fn quote require import with|0\",n={cN:\"subst\",b:\"#\\\\{\",e:\"}\",l:b,k:c},r=\"[/|([{<\\\"']\",a={cN:\"string\",b:\"~[a-z](?=\"+r+\")\",c:[{endsParent:!0,c:[{c:[e.BE,n],v:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/\\//,e:/\\//},{b:/\\|/,e:/\\|/},{b:/\\(/,e:/\\)/},{b:/\\[/,e:/\\]/},{b:/\\{/,e:/\\}/},{b:/</,e:/>/}]}]}]},i={cN:\"string\",b:\"~[A-Z](?=\"+r+\")\",c:[{b:/\"/,e:/\"/},{b:/'/,e:/'/},{b:/\\//,e:/\\//},{b:/\\|/,e:/\\|/},{b:/\\(/,e:/\\)/},{b:/\\[/,e:/\\]/},{b:/\\{/,e:/\\}/},{b:/\\</,e:/\\>/}]},l={cN:\"string\",c:[e.BE,n],v:[{b:/\"\"\"/,e:/\"\"\"/},{b:/'''/,e:/'''/},{b:/~S\"\"\"/,e:/\"\"\"/,c:[]},{b:/~S\"/,e:/\"/,c:[]},{b:/~S'''/,e:/'''/,c:[]},{b:/~S'/,e:/'/,c:[]},{b:/'/,e:/'/},{b:/\"/,e:/\"/}]},s={cN:\"function\",bK:\"def defp defmacro\",e:/\\B\\b/,c:[e.inherit(e.TM,{b:b,endsParent:!0})]},t=e.inherit(s,{cN:\"class\",bK:\"defimpl defmodule defprotocol defrecord\",e:/\\bdo\\b|$|;/}),d=[l,i,a,e.HCM,t,s,{b:\"::\"},{cN:\"symbol\",b:\":(?![\\\\s:])\",c:[l,{b:\"[a-zA-Z_]\\\\w*[!?=]?|[-+~]\\\\@|<<|>>|=~|===?|<=>|[<>]=?|\\\\*\\\\*|[-/+%^&*~`|]|\\\\[\\\\]=?\"}],relevance:0},{cN:\"symbol\",b:b+\":(?!:)\",relevance:0},{cN:\"number\",b:\"(\\\\b0o[0-7_]+)|(\\\\b0b[01_]+)|(\\\\b0x[0-9a-fA-F_]+)|(-?\\\\b[1-9][0-9_]*(.[0-9_]+([eE][-+]?[0-9]+)?)?)\",relevance:0},{cN:\"variable\",b:\"(\\\\$\\\\W)|((\\\\$|\\\\@\\\\@?)(\\\\w+))\"},{b:\"->\"},{b:\"(\"+e.RSR+\")\\\\s*\",c:[e.HCM,{cN:\"regexp\",i:\"\\\\n\",c:[e.BE,n],v:[{b:\"/\",e:\"/[a-z]*\"},{b:\"%r\\\\[\",e:\"\\\\][a-z]*\"}]}],relevance:0}];return{l:b,k:c,c:n.c=d}});hljs.registerLanguage(\"gradle\",function(e){return{cI:!0,k:{keyword:\"task project allprojects subprojects artifacts buildscript configurations dependencies repositories sourceSets description delete from into include exclude source classpath destinationDir includes options sourceCompatibility targetCompatibility group flatDir doLast doFirst flatten todir fromdir ant def abstract break case catch continue default do else extends final finally for if implements instanceof native new private protected public return static switch synchronized throw throws transient try volatile while strictfp package import false null super this true antlrtask checkstyle codenarc copy boolean byte char class double float int interface long short void compile runTime file fileTree abs any append asList asWritable call collect compareTo count div dump each eachByte eachFile eachLine every find findAll flatten getAt getErr getIn getOut getText grep immutable inject inspect intersect invokeMethods isCase join leftShift minus multiply newInputStream newOutputStream newPrintWriter newReader newWriter next plus pop power previous print println push putAt read readBytes readLines reverse reverseEach round size sort splitEachLine step subMap times toInteger toList tokenize upto waitForOrKill withPrintWriter withReader withStream withWriter withWriterAppend write writeLine\"},c:[e.CLCM,e.CBCM,e.ASM,e.QSM,e.NM,e.RM]}});hljs.registerLanguage(\"css\",function(e){var c={b:/(?:[A-Z\\_\\.\\-]+|--[a-zA-Z0-9_-]+)\\s*:/,rB:!0,e:\";\",eW:!0,c:[{cN:\"attribute\",b:/\\S/,e:\":\",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\\w-]+\\(/,rB:!0,c:[{cN:\"built_in\",b:/[\\w-]+/},{b:/\\(/,e:/\\)/,c:[e.ASM,e.QSM,e.CSSNM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:\"number\",b:\"#[0-9A-Fa-f]+\"},{cN:\"meta\",b:\"!important\"}]}}]};return{cI:!0,i:/[=\\/|'\\$]/,c:[e.CBCM,{cN:\"selector-id\",b:/#[A-Za-z0-9_-]+/},{cN:\"selector-class\",b:/\\.[A-Za-z0-9_-]+/},{cN:\"selector-attr\",b:/\\[/,e:/\\]/,i:\"$\",c:[e.ASM,e.QSM]},{cN:\"selector-pseudo\",b:/:(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\"'.]+/},{b:\"@(page|font-face)\",l:\"@[a-z-]+\",k:\"@page @font-face\"},{b:\"@\",e:\"[{;]\",i:/:/,rB:!0,c:[{cN:\"keyword\",b:/@\\-?\\w[\\w]*(\\-\\w+)*/},{b:/\\s/,eW:!0,eE:!0,relevance:0,k:\"and or not only\",c:[{b:/[a-z-]+:/,cN:\"attribute\"},e.ASM,e.QSM,e.CSSNM]}]},{cN:\"selector-tag\",b:\"[a-zA-Z-][a-zA-Z0-9_-]*\",relevance:0},{b:\"{\",e:\"}\",i:/\\S/,c:[e.CBCM,c]}]}});\n\nexports.hljs = hljs;\n",
"type": "application/javascript",
"title": "$:/plugins/tiddlywiki/highlight/highlight.js",
"module-type": "library"
},
"$:/plugins/tiddlywiki/highlight/highlight.css": {
"text": "/*\n\nOriginal highlight.js style (c) Ivan Sagalaev <maniac@softwaremaniacs.org>\n\n*/\n\n.hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n background: #F0F0F0;\n}\n\n\n/* Base color: saturation 0; */\n\n.hljs,\n.hljs-subst {\n color: #444;\n}\n\n.hljs-comment {\n color: #888888;\n}\n\n.hljs-keyword,\n.hljs-attribute,\n.hljs-selector-tag,\n.hljs-meta-keyword,\n.hljs-doctag,\n.hljs-name {\n font-weight: bold;\n}\n\n\n/* User color: hue: 0 */\n\n.hljs-type,\n.hljs-string,\n.hljs-number,\n.hljs-selector-id,\n.hljs-selector-class,\n.hljs-quote,\n.hljs-template-tag,\n.hljs-deletion {\n color: #880000;\n}\n\n.hljs-title,\n.hljs-section {\n color: #880000;\n font-weight: bold;\n}\n\n.hljs-regexp,\n.hljs-symbol,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-link,\n.hljs-selector-attr,\n.hljs-selector-pseudo {\n color: #BC6060;\n}\n\n\n/* Language color: hue: 90; */\n\n.hljs-literal {\n color: #78A960;\n}\n\n.hljs-built_in,\n.hljs-bullet,\n.hljs-code,\n.hljs-addition {\n color: #397300;\n}\n\n\n/* Meta color: hue: 200 */\n\n.hljs-meta {\n color: #1f7199;\n}\n\n.hljs-meta-string {\n color: #4d99bf;\n}\n\n\n/* Misc effects */\n\n.hljs-emphasis {\n font-style: italic;\n}\n\n.hljs-strong {\n font-weight: bold;\n}\n",
"type": "text/css",
"title": "$:/plugins/tiddlywiki/highlight/highlight.css",
"tags": "[[$:/tags/Stylesheet]]"
},
"$:/plugins/tiddlywiki/highlight/highlightblock.js": {
"title": "$:/plugins/tiddlywiki/highlight/highlightblock.js",
"text": "/*\\\ntitle: $:/plugins/tiddlywiki/highlight/highlightblock.js\ntype: application/javascript\nmodule-type: widget\n\nWraps up the fenced code blocks parser for highlight and use in TiddlyWiki5\n\n\\*/\n(function() {\n\n/*jslint node: true, browser: true */\n/*global $tw: false */\n\"use strict\";\n\nvar TYPE_MAPPINGS_BASE = \"$:/config/HighlightPlugin/TypeMappings/\";\n\nvar CodeBlockWidget = require(\"$:/core/modules/widgets/codeblock.js\").codeblock;\n\nvar hljs = require(\"$:/plugins/tiddlywiki/highlight/highlight.js\");\n\nhljs.configure({tabReplace: \" \"});\t\n\nCodeBlockWidget.prototype.postRender = function() {\n\tvar domNode = this.domNodes[0],\n\t\tlanguage = this.language,\n\t\ttiddler = this.wiki.getTiddler(TYPE_MAPPINGS_BASE + language);\n\tif(tiddler) {\n\t\tlanguage = tiddler.fields.text || \"\";\n\t}\n\tif(language && hljs.getLanguage(language)) {\n\t\tdomNode.className = language.toLowerCase() + \" hljs\";\n\t\tif($tw.browser && !domNode.isTiddlyWikiFakeDom) {\n\t\t\thljs.highlightBlock(domNode);\t\t\t\n\t\t} else {\n\t\t\tvar text = domNode.textContent;\n\t\t\tdomNode.children[0].innerHTML = hljs.fixMarkup(hljs.highlight(language,text).value);\n\t\t\t// If we're using the fakedom then specially save the original raw text\n\t\t\tif(domNode.isTiddlyWikiFakeDom) {\n\t\t\t\tdomNode.children[0].textInnerHTML = text;\n\t\t\t}\n\t\t}\n\t}\t\n};\n\n})();\n",
"type": "application/javascript",
"module-type": "widget"
},
"$:/plugins/tiddlywiki/highlight/howto": {
"title": "$:/plugins/tiddlywiki/highlight/howto",
"text": "! Supporting Additional Languages\n \nThe [[highlight.js|https://github.com/highlightjs/highlight.js]] project supports many languages. Only a subset of these languages are supported by the plugin. It is possible for users to change the set of languages supported by the plugin by following these steps:\n \n# Go to the highlight.js project [[download page|https://highlightjs.org/download/]], select the language definitions to include, and press the Download button to download a zip archive containing customised support files for a highlight.js syntax highlighting server.\n# Locate the `highlight.pack.js` file in the highlight plugin -- on a stock Debian 8 system running Tiddlywiki5 under node-js it is located at `/usr/local/lib/node_modules/tiddlywiki/plugins/tiddlywiki/highlight/files/highlight.pack.js`.\n# Replace the plugin `highlight.pack.js` file located in step 2 with the one from the downloaded archive obtained in step 1.\n# Restart the Tiddlywiki server.\n"
},
"$:/plugins/tiddlywiki/highlight/license": {
"title": "$:/plugins/tiddlywiki/highlight/license",
"type": "text/plain",
"text": "Copyright (c) 2006, Ivan Sagalaev\nAll rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the distribution.\n * Neither the name of highlight.js nor the names of its contributors\n may be used to endorse or promote products derived from this software\n without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY\nEXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
},
"$:/plugins/tiddlywiki/highlight/readme": {
"title": "$:/plugins/tiddlywiki/highlight/readme",
"text": "This plugin provides syntax highlighting of code blocks using v9.18.1 of [[highlight.js|https://github.com/isagalaev/highlight.js]] from Ivan Sagalaev.\n\n! Usage\n\nWhen the plugin is installed it automatically applies highlighting to all codeblocks defined with triple backticks or with the CodeBlockWidget.\n\nThe language can optionally be specified after the opening triple braces:\n\n<$codeblock code=\"\"\"```css\n * { margin: 0; padding: 0; } /* micro reset */\n\nhtml { font-size: 62.5%; }\nbody { font-size: 14px; font-size: 1.4rem; } /* =14px */\nh1 { font-size: 24px; font-size: 2.4rem; } /* =24px */\n```\"\"\"/>\n\nIf no language is specified highlight.js will attempt to automatically detect the language.\n\n! Built-in Language Brushes\n\nThe plugin includes support for the following languages (referred to as \"brushes\" by highlight.js):\n\n* apache\n* arduino\n* arm assembly\n* asciidoc\n* autohotkey\n* awk\n* bash\n* cmake\n* coffeescript\n* cpp\n* cs\n* css\n* diff\n* dockerfile\n* erlang\n* elixir\n* fortran\n* go\n* gradle\n* haskell\n* html\n* http\n* ini\n* intel x86 assembly\n* java\n* javascript\n* json\n* kotlin\n* less\n* lua\n* makefile\n* markdown\n* mathematica\n* matlab\n* nginx\n* objectivec\n* perl\n* php\n* plaintext\n* powershell\n* properties\n* python\n* R\n* ruby\n* rust\n* scss\n* shell session\n* sql\n* swift\n* toml\n* typescript\n* vala\n* vim script\n* xml\n* yaml\n\nYou can also specify the language as a MIME content type (eg `text/html` or `text/css`). The mapping is accomplished via mapping tiddlers whose titles start with `$:/config/HighlightPlugin/TypeMappings/`.\n"
},
"$:/plugins/tiddlywiki/highlight/styles": {
"title": "$:/plugins/tiddlywiki/highlight/styles",
"tags": "[[$:/tags/Stylesheet]]",
"text": ".hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n background: <<colour tiddler-editor-background>>;\n color: <<colour foreground>>;\n -webkit-text-size-adjust:none\n}\n\n.hljs-comment,\n.hljs-quote {\n color: #93a1a1;\n}\n\n/* Solarized Green */\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-addition {\n color: #859900;\n}\n\n/* Solarized Cyan */\n.hljs-number,\n.hljs-string,\n.hljs-meta .hljs-meta-string,\n.hljs-literal,\n.hljs-doctag,\n.hljs-regexp {\n color: #2aa198;\n}\n\n/* Solarized Blue */\n.hljs-title,\n.hljs-section,\n.hljs-name,\n.hljs-selector-id,\n.hljs-selector-class {\n color: #268bd2;\n}\n\n/* Solarized Yellow */\n.hljs-attribute,\n.hljs-attr,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-class .hljs-title,\n.hljs-type {\n color: #b58900;\n}\n\n/* Solarized Orange */\n.hljs-symbol,\n.hljs-bullet,\n.hljs-subst,\n.hljs-meta,\n.hljs-meta .hljs-keyword,\n.hljs-selector-attr,\n.hljs-selector-pseudo,\n.hljs-link {\n color: #cb4b16;\n}\n\n/* Solarized Red */\n.hljs-built_in,\n.hljs-deletion {\n color: #dc322f;\n}\n\n.hljs-formula {\n background: #eee8d5;\n}\n\n.hljs-emphasis {\n font-style: italic;\n}\n\n.hljs-strong {\n font-weight: bold;\n}\n"
},
"$:/config/HighlightPlugin/TypeMappings/application/javascript": {
"title": "$:/config/HighlightPlugin/TypeMappings/application/javascript",
"text": "javascript"
},
"$:/config/HighlightPlugin/TypeMappings/application/json": {
"title": "$:/config/HighlightPlugin/TypeMappings/application/json",
"text": "json"
},
"$:/config/HighlightPlugin/TypeMappings/text/css": {
"title": "$:/config/HighlightPlugin/TypeMappings/text/css",
"text": "css"
},
"$:/config/HighlightPlugin/TypeMappings/text/html": {
"title": "$:/config/HighlightPlugin/TypeMappings/text/html",
"text": "html"
},
"$:/config/HighlightPlugin/TypeMappings/image/svg+xml": {
"title": "$:/config/HighlightPlugin/TypeMappings/image/svg+xml",
"text": "xml"
},
"$:/config/HighlightPlugin/TypeMappings/text/x-markdown": {
"title": "$:/config/HighlightPlugin/TypeMappings/text/x-markdown",
"text": "markdown"
},
"$:/plugins/tiddlywiki/highlight/usage": {
"title": "$:/plugins/tiddlywiki/highlight/usage",
"text": "! Usage\n\nFenced code blocks can have a language specifier added to trigger highlighting in a specific language. Otherwise heuristics are used to detect the language.\n\n```\n ```js\n var a = b + c; // Highlighted as JavaScript\n ```\n```\n! Adding Themes\n\nYou can add themes from highlight.js by copying the CSS to a new tiddler and tagging it with [[$:/tags/Stylesheet]]. The available themes can be found on GitHub:\n\nhttps://github.com/isagalaev/highlight.js/tree/master/src/styles\n"
}
}
}
$:/themes/tiddlywiki/vanilla
{
"tiddlers": {
"$:/themes/tiddlywiki/snowwhite/base": {
"title": "$:/themes/tiddlywiki/snowwhite/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline\n\n.tc-sidebar-header {\n\ttext-shadow: 0 1px 0 <<colour sidebar-foreground-shadow>>;\n}\n\n.tc-tiddler-info {\n\t<<box-shadow \"inset 1px 2px 3px rgba(0,0,0,0.1)\">>\n}\n\n@media screen {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow \"1px 1px 5px rgba(0, 0, 0, 0.3)\">>\n\t}\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\t.tc-tiddler-frame {\n\t\t<<box-shadow none>>\n\t}\n}\n\n.tc-page-controls button svg, .tc-tiddler-controls button svg, .tc-topbar button svg {\n\t<<transition \"fill 150ms ease-in-out\">>\n}\n\n.tc-tiddler-controls button.tc-selected,\n.tc-page-controls button.tc-selected {\n\t<<filter \"drop-shadow(0px -1px 2px rgba(0,0,0,0.25))\">>\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-edit-tags {\n\t<<box-shadow \"inset 0 1px 8px rgba(0, 0, 0, 0.15)\">>\n}\n\n.tc-tiddler-frame .tc-edit-tags input.tc-edit-texteditor {\n\t<<box-shadow \"none\">>\n\tborder: none;\n\toutline: none;\n}\n\ntextarea.tc-edit-texteditor {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\ncanvas.tc-edit-bitmapeditor {\n\t<<box-shadow \"2px 2px 5px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-drop-down {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-block-dropdown {\n\tborder-radius: 4px;\n\t<<box-shadow \"2px 2px 10px rgba(0, 0, 0, 0.5)\">>\n}\n\n.tc-modal {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n}\n\n.tc-modal-footer {\n\tborder-radius: 0 0 6px 6px;\n\t<<box-shadow \"inset 0 1px 0 #fff\">>;\n}\n\n\n.tc-alert {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.6)\">>\n}\n\n.tc-notification {\n\tborder-radius: 6px;\n\t<<box-shadow \"0 3px 7px rgba(0,0,0,0.3)\">>\n\ttext-shadow: 0 1px 0 rgba(255,255,255, 0.8);\n}\n\n.tc-sidebar-lists .tc-tab-set .tc-tab-divider {\n\tborder-top: none;\n\theight: 1px;\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.15) 0%, rgba(0,0,0,0.0) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.01) 0%, rgba(0,0,0,0.1) 100%\">>\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\t<<background-linear-gradient \"left, rgba(0,0,0,0.05) 0%, rgba(255,255,255,0.05) 100%\">>\n}\n\n.tc-message-box img {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n\n.tc-plugin-info {\n\t<<box-shadow \"1px 1px 3px rgba(0,0,0,0.5)\">>\n}\n"
}
}
}
{
"tiddlers": {
"$:/themes/tiddlywiki/vanilla/base": {
"title": "$:/themes/tiddlywiki/vanilla/base",
"tags": "[[$:/tags/Stylesheet]]",
"text": "\\define custom-background-datauri()\n<$set name=\"background\" value={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}>\n<$list filter=\"[<background>is[image]]\">\n`background: url(`\n<$list filter=\"[<background>!has[_canonical_uri]]\">\n`\"`<$macrocall $name=\"datauri\" title={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}}/>`\"`\n</$list>\n<$list filter=\"[<background>has[_canonical_uri]]\">\n`\"`<$view tiddler={{$:/themes/tiddlywiki/vanilla/settings/backgroundimage}} field=\"_canonical_uri\"/>`\"`\n</$list>\n`) center center;`\n`background-attachment: `{{$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment}}`;\n-webkit-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-moz-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\n-o-background-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;\nbackground-size:` {{$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize}}`;`\n</$list>\n</$set>\n\\end\n\n\\define sidebarbreakpoint()\n<$text text={{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}}/>\n\\end\n\n\\define sidebarbreakpoint-minus-one()\n<$text text={{{ [{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}removesuffix[px]subtract[1]addsuffix[px]] ~[{$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint}] }}}/>\n\\end\n\n\\define if-fluid-fixed(text,hiddenSidebarText)\n<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\" type=\"match\" text=\"fluid-fixed\">\n$text$\n<$reveal state=\"$:/state/sidebar\" type=\"nomatch\" text=\"yes\" default=\"yes\">\n$hiddenSidebarText$\n</$reveal>\n</$reveal>\n\\end\n\n\\define if-editor-height-fixed(then,else)\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"fixed\">\n$then$\n</$reveal>\n<$reveal state=\"$:/config/TextEditor/EditorHeight/Mode\" type=\"match\" text=\"auto\">\n$else$\n</$reveal>\n\\end\n\n\\define set-type-selector-min-width()\n<$set name=\"typeLength\" value={{{ [all[shadows+tiddlers]prefix[$:/language/Docs/Types/]get[name]length[]maxall[]] }}}>\n\n\t.tc-type-selector-dropdown-wrapper {\n\t\tmin-width: calc(<<typeLength>>ch + 4em);\n\t}\n\n\t.tc-type-selector-dropdown-wrapper input.tc-edit-typeeditor {\n\t\tmin-width: <<typeLength>>ch;\n\t}\n\n</$set>\n\\end\n\n\\rules only filteredtranscludeinline transcludeinline macrodef macrocallinline macrocallblock\n\n/*\n** Start with the normalize CSS reset, and then belay some of its effects\n*/\n\n{{$:/themes/tiddlywiki/vanilla/reset}}\n\n*, input[type=\"search\"] {\n\tbox-sizing: border-box;\n\t-moz-box-sizing: border-box;\n\t-webkit-box-sizing: border-box;\n}\n\ninput[type=\"search\"] {\n outline-offset: initial;\n}\n\nhtml button {\n\tline-height: 1.2;\n\tcolor: <<colour button-foreground>>;\n\tfill: <<colour button-foreground>>;\n\tbackground: <<colour button-background>>;\n\tborder-color: <<colour button-border>>;\n}\n\n/*\n** Basic element styles\n*/\n\nhtml, body {\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/fontfamily}};\n\ttext-rendering: optimizeLegibility; /* Enables kerning and ligatures etc. */\n\t-webkit-font-smoothing: antialiased;\n\t-moz-osx-font-smoothing: grayscale;\n}\n\nhtml:-webkit-full-screen {\n\tbackground-color: <<colour page-background>>;\n}\n\nbody.tc-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/fontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/lineheight}};\n\tword-wrap: break-word;\n\t<<custom-background-datauri>>\n\tcolor: <<colour foreground>>;\n\tbackground-color: <<colour page-background>>;\n\tfill: <<colour foreground>>;\n}\n\n<<if-background-attachment \"\"\"\n\nbody.tc-body {\n background-color: transparent;\n}\n\n\"\"\">>\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n\tfont-size: 2em;\n}\n\nh1, h2, h3, h4, h5, h6 {\n\tline-height: 1.2;\n\tfont-weight: 300;\n}\n\npre {\n\tdisplay: block;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\tword-break: normal;\n\tword-wrap: break-word;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tbackground-color: <<colour pre-background>>;\n\tborder: 1px solid <<colour pre-border>>;\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\ncode {\n\tcolor: <<colour code-foreground>>;\n\tbackground-color: <<colour code-background>>;\n\tborder: 1px solid <<colour code-border>>;\n\twhite-space: {{$:/themes/tiddlywiki/vanilla/options/codewrapping}};\n\tpadding: 0 3px 2px;\n\tborder-radius: 3px;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/codefontfamily}};\n}\n\nblockquote {\n\tborder-left: 5px solid <<colour blockquote-bar>>;\n\tmargin-left: 25px;\n\tpadding-left: 10px;\n\tquotes: \"\\201C\"\"\\201D\"\"\\2018\"\"\\2019\";\n}\n\nblockquote > div {\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n}\n\nblockquote.tc-big-quote {\n\tfont-family: Georgia, serif;\n\tposition: relative;\n\tbackground: <<colour pre-background>>;\n\tborder-left: none;\n\tmargin-left: 50px;\n\tmargin-right: 50px;\n\tpadding: 10px;\n border-radius: 8px;\n}\n\nblockquote.tc-big-quote cite:before {\n\tcontent: \"\\2014 \\2009\";\n}\n\nblockquote.tc-big-quote:before {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: open-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n left: -50px;\n top: 42px;\n}\n\nblockquote.tc-big-quote:after {\n\tfont-family: Georgia, serif;\n\tcolor: <<colour blockquote-bar>>;\n\tcontent: close-quote;\n\tfont-size: 8em;\n\tline-height: 0.1em;\n\tmargin-right: 0.25em;\n\tvertical-align: -0.4em;\n\tposition: absolute;\n right: -80px;\n bottom: -20px;\n}\n\ndl dt {\n\tfont-weight: bold;\n\tmargin-top: 6px;\n}\n\nbutton, textarea, input, select {\n\toutline-color: <<colour primary>>;\n}\n\ntextarea,\ninput[type=text],\ninput[type=search],\ninput[type=\"\"],\ninput:not([type]) {\n\tcolor: <<colour foreground>>;\n\tbackground: <<colour background>>;\n}\n\ninput[type=\"checkbox\"] {\n vertical-align: middle;\n}\n\ninput[type=\"search\"]::-webkit-search-decoration,\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-results-button,\ninput[type=\"search\"]::-webkit-search-results-decoration {\n\t-webkit-appearance:none;\n}\n\n.tc-muted {\n\tcolor: <<colour muted-foreground>>;\n}\n\nsvg.tc-image-button {\n\tpadding: 0px 1px 1px 0px;\n}\n\n.tc-icon-wrapper > svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\nkbd {\n\tdisplay: inline-block;\n\tpadding: 3px 5px;\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tcolor: <<colour foreground>>;\n\tvertical-align: middle;\n\tbackground-color: <<colour background>>;\n\tborder: solid 1px <<colour muted-foreground>>;\n\tborder-bottom-color: <<colour muted-foreground>>;\n\tborder-radius: 3px;\n\tbox-shadow: inset 0 -1px 0 <<colour muted-foreground>>;\n}\n\n::selection {\n\tbackground-color: Highlight;\n\tcolor: HighlightText;\n\tbackground-color: <<colour selection-background>>;\n\tcolor: <<colour selection-foreground>>;\n}\n\n/*\nMarkdown likes putting code elements inside pre elements\n*/\npre > code {\n\tpadding: 0;\n\tborder: none;\n\tbackground-color: inherit;\n\tcolor: inherit;\n}\n\ntable {\n\tborder: 1px solid <<colour table-border>>;\n\twidth: auto;\n\tmax-width: 100%;\n\tcaption-side: bottom;\n\tmargin-top: 1em;\n\tmargin-bottom: 1em;\n\t/* next 2 elements needed, since normalize 8.0.1 */\n\tborder-collapse: collapse;\n\tborder-spacing: 0;\n}\n\ntable th, table td {\n\tpadding: 0 7px 0 7px;\n\tborder-top: 1px solid <<colour table-border>>;\n\tborder-left: 1px solid <<colour table-border>>;\n}\n\ntable thead tr td, table th {\n\tbackground-color: <<colour table-header-background>>;\n\tfont-weight: bold;\n}\n\ntable tfoot tr td {\n\tbackground-color: <<colour table-footer-background>>;\n}\n\n.tc-csv-table {\n\twhite-space: nowrap;\n}\n\n.tc-tiddler-frame img,\n.tc-tiddler-frame svg,\n.tc-tiddler-frame canvas,\n.tc-tiddler-frame embed,\n.tc-tiddler-frame iframe {\n\tmax-width: 100%;\n}\n\n.tc-tiddler-body > embed,\n.tc-tiddler-body > iframe {\n\twidth: 100%;\n\theight: 600px;\n}\n\n/*\n** Links\n*/\n\nbutton.tc-tiddlylink,\na.tc-tiddlylink {\n\ttext-decoration: none;\n\tfont-weight: 500;\n\tcolor: <<colour tiddler-link-foreground>>;\n\t-webkit-user-select: inherit; /* Otherwise the draggable attribute makes links impossible to select */\n}\n\n.tc-sidebar-lists a.tc-tiddlylink {\n\tcolor: <<colour sidebar-tiddler-link-foreground>>;\n}\n\n.tc-sidebar-lists a.tc-tiddlylink:hover {\n\tcolor: <<colour sidebar-tiddler-link-foreground-hover>>;\n}\n\nbutton.tc-tiddlylink:hover,\na.tc-tiddlylink:hover {\n\ttext-decoration: underline;\n}\n\na.tc-tiddlylink-resolves {\n}\n\na.tc-tiddlylink-shadow {\n\tfont-weight: bold;\n}\n\na.tc-tiddlylink-shadow.tc-tiddlylink-resolves {\n\tfont-weight: normal;\n}\n\na.tc-tiddlylink-missing {\n\tfont-style: italic;\n}\n\na.tc-tiddlylink-external {\n\ttext-decoration: underline;\n\tcolor: <<colour external-link-foreground>>;\n\tbackground-color: <<colour external-link-background>>;\n}\n\na.tc-tiddlylink-external:visited {\n\tcolor: <<colour external-link-foreground-visited>>;\n\tbackground-color: <<colour external-link-background-visited>>;\n}\n\na.tc-tiddlylink-external:hover {\n\tcolor: <<colour external-link-foreground-hover>>;\n\tbackground-color: <<colour external-link-background-hover>>;\n}\n\n.tc-drop-down a.tc-tiddlylink:hover {\n\tcolor: <<colour tiddler-link-background>>;\n}\n\n/*\n** Drag and drop styles\n*/\n\n.tc-tiddler-dragger {\n\tposition: relative;\n\tz-index: -10000;\n}\n\n.tc-tiddler-dragger-inner {\n\tposition: absolute;\n\ttop: -1000px;\n\tleft: -1000px;\n\tdisplay: inline-block;\n\tpadding: 8px 20px;\n\tfont-size: 16.9px;\n\tfont-weight: bold;\n\tline-height: 20px;\n\tcolor: <<colour dragger-foreground>>;\n\ttext-shadow: 0 1px 0 rgba(0, 0, 0, 1);\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour dragger-background>>;\n\tborder-radius: 20px;\n}\n\n.tc-tiddler-dragger-cover {\n\tposition: absolute;\n\tbackground-color: <<colour page-background>>;\n}\n\n.tc-dropzone {\n\tposition: relative;\n}\n\n.tc-dropzone.tc-dragover:before {\n\tz-index: 10000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour dropzone-background>>;\n\ttext-align: center;\n\tcontent: \"<<lingo DropMessage>>\";\n}\n\n.tc-droppable > .tc-droppable-placeholder {\n\tdisplay: none;\n}\n\n.tc-droppable.tc-dragover > .tc-droppable-placeholder {\n\tdisplay: block;\n\tborder: 2px dashed <<colour dropzone-background>>;\n}\n\n.tc-draggable {\n\tcursor: move;\n}\n\n.tc-sidebar-tab-open .tc-droppable-placeholder, .tc-tagged-draggable-list .tc-droppable-placeholder,\n.tc-links-draggable-list .tc-droppable-placeholder {\n\tline-height: 2em;\n\theight: 2em;\n}\n\n.tc-sidebar-tab-open-item {\n\tposition: relative;\n}\n\n.tc-sidebar-tab-open .tc-btn-invisible.tc-btn-mini svg {\n\tfont-size: 0.7em;\n\tfill: <<colour muted-foreground>>;\n}\n\n/*\n** Plugin reload warning\n*/\n\n.tc-plugin-reload-warning {\n\tz-index: 1000;\n\tdisplay: block;\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbackground: <<colour alert-background>>;\n\ttext-align: center;\n}\n\n/*\n** Buttons\n*/\n\nbutton svg, button img, label svg, label img {\n\tvertical-align: middle;\n}\n\n.tc-btn-invisible {\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\tcursor: pointer;\n\tcolor: <<colour foreground>>;\n\tfill: <<colour foreground>>;\n}\n\n.tc-btn-boxed {\n\tfont-size: 0.6em;\n\tpadding: 0.2em;\n\tmargin: 1px;\n\tbackground: none;\n\tborder: 1px solid <<colour tiddler-controls-foreground>>;\n\tborder-radius: 0.25em;\n}\n\nhtml body.tc-body .tc-btn-boxed svg {\n\tfont-size: 1.6666em;\n}\n\n.tc-btn-boxed:hover {\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n}\n\nhtml body.tc-body .tc-btn-boxed:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded {\n\tfont-size: 0.5em;\n\tline-height: 2;\n\tpadding: 0em 0.3em 0.2em 0.4em;\n\tmargin: 1px;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour muted-foreground>>;\n\tcolor: <<colour background>>;\n\tborder-radius: 2em;\n}\n\nhtml body.tc-body .tc-btn-rounded svg {\n\tfont-size: 1.6666em;\n\tfill: <<colour background>>;\n}\n\n.tc-btn-rounded:hover {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tcolor: <<colour muted-foreground>>;\n}\n\nhtml body.tc-body .tc-btn-rounded:hover svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-icon svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-btn-text {\n\tpadding: 0;\n\tmargin: 0;\n}\n\n/* used for documentation \"fake\" buttons */\n.tc-btn-standard {\n\tline-height: 1.8;\n\tcolor: #667;\n\tbackground-color: #e0e0e0;\n\tborder: 1px solid #888;\n\tpadding: 2px 1px 2px 1px;\n\tmargin: 1px 4px 1px 4px;\n}\n\n.tc-btn-big-green {\n\tdisplay: inline-block;\n\tpadding: 8px;\n\tmargin: 4px 8px 4px 8px;\n\tbackground: <<colour download-background>>;\n\tcolor: <<colour download-foreground>>;\n\tfill: <<colour download-foreground>>;\n\tborder: none;\n\tborder-radius: 2px;\n\tfont-size: 1.2em;\n\tline-height: 1.4em;\n\ttext-decoration: none;\n}\n\n.tc-btn-big-green svg,\n.tc-btn-big-green img {\n\theight: 2em;\n\twidth: 2em;\n\tvertical-align: middle;\n\tfill: <<colour download-foreground>>;\n}\n\n.tc-primary-btn {\n \tbackground: <<colour primary>>;\n}\n\n.tc-sidebar-lists input {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-sidebar-lists button {\n\tcolor: <<colour sidebar-button-foreground>>;\n\tfill: <<colour sidebar-button-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini {\n\tcolor: <<colour sidebar-muted-foreground>>;\n}\n\n.tc-sidebar-lists button.tc-btn-mini:hover {\n\tcolor: <<colour sidebar-muted-foreground-hover>>;\n}\n\n.tc-sidebar-lists button small {\n\tcolor: <<colour foreground>>;\n}\n\nbutton svg.tc-image-button, button .tc-image-button img {\n\theight: 1em;\n\twidth: 1em;\n}\n\n.tc-unfold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 100%;\n\twidth: calc(100% + 2px);\n\tmargin-left: -43px;\n\ttext-align: center;\n\tborder-top: 2px solid <<colour tiddler-info-background>>;\n\tmargin-top: 4px;\n}\n\n.tc-unfold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n\tborder-top: 2px solid <<colour tiddler-info-border>>;\n}\n\n.tc-unfold-banner svg, .tc-fold-banner svg {\n\theight: 0.75em;\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-unfold-banner:hover svg, .tc-fold-banner:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n.tc-fold-banner {\n\tposition: absolute;\n\tpadding: 0;\n\tmargin: 0;\n\tbackground: none;\n\tborder: none;\n\twidth: 23px;\n\ttext-align: center;\n\tmargin-left: -35px;\n\ttop: 6px;\n\tbottom: 6px;\n}\n\n.tc-fold-banner:hover {\n\tbackground: <<colour tiddler-info-background>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-unfold-banner {\n\t\tposition: static;\n\t\twidth: calc(100% + 59px);\n\t}\n\n\t.tc-fold-banner {\n\t\twidth: 16px;\n\t\tmargin-left: -16px;\n\t\tfont-size: 0.75em;\n\t}\n\n}\n\n/*\n** Tags and missing tiddlers\n*/\n\n.tc-tag-list-item {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin-right: 7px;\n}\n\n.tc-tags-wrapper {\n\tmargin: 4px 0 14px 0;\n}\n\n.tc-missing-tiddler-label {\n\tfont-style: italic;\n\tfont-weight: normal;\n\tdisplay: inline-block;\n\tfont-size: 11.844px;\n\tline-height: 14px;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n}\n\n.tc-block-tags-dropdown > .tc-btn-invisible:hover {\n\tbackground-color: <<colour primary>>;\n}\n\nbutton.tc-tag-label, span.tc-tag-label {\n\tdisplay: inline-block;\n\tpadding: 0.16em 0.7em;\n\tfont-size: 0.9em;\n\tfont-weight: 400;\n\tline-height: 1.2em;\n\tcolor: <<colour tag-foreground>>;\n\twhite-space: nowrap;\n\tvertical-align: baseline;\n\tbackground-color: <<colour tag-background>>;\n\tborder-radius: 1em;\n}\n\n.tc-sidebar-scrollable .tc-tag-label {\n\ttext-shadow: none;\n}\n\n.tc-untagged-separator {\n\twidth: 10em;\n\tleft: 0;\n\tmargin-left: 0;\n\tborder: 0;\n\theight: 1px;\n\tbackground: <<colour tab-divider>>;\n}\n\nbutton.tc-untagged-label {\n\tbackground-color: <<colour untagged-background>>;\n}\n\n.tc-tag-label svg, .tc-tag-label img {\n\theight: 1em;\n\twidth: 1em;\n\tmargin-right: 3px; \n\tmargin-bottom: 1px;\n\tvertical-align: bottom;\n}\n\n.tc-edit-tags button.tc-remove-tag-button svg {\n\tfont-size: 0.7em;\n\tvertical-align: middle;\n}\n\n.tc-tag-manager-table .tc-tag-label {\n\twhite-space: normal;\n}\n\n.tc-tag-manager-tag {\n\twidth: 100%;\n}\n\nbutton.tc-btn-invisible.tc-remove-tag-button {\n\toutline: none;\n}\n\n.tc-tag-button-selected,\n.tc-list-item-selected a.tc-tiddlylink, a.tc-list-item-selected {\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour tiddler-background>>;\n}\n\n/*\n** Page layout\n*/\n\n.tc-topbar {\n\tposition: fixed;\n\tz-index: 1200;\n}\n\n.tc-topbar-left {\n\tleft: 29px;\n\ttop: 5px;\n}\n\n.tc-topbar-right {\n\ttop: 5px;\n\tright: 29px;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-topbar-right {\n\t\tright: 10px;\n\t}\n\n}\n\n.tc-topbar button {\n\tpadding: 8px;\n}\n\n.tc-topbar svg {\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-topbar button:hover svg {\n\tfill: <<colour foreground>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-show-sidebar-btn svg.tc-image-chevron-left, .tc-hide-sidebar-btn svg.tc-image-chevron-right {\n\t\ttransform: rotate(-90deg);\n\t}\n\n}\n\n.tc-sidebar-header {\n\tcolor: <<colour sidebar-foreground>>;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-sidebar-header .tc-title a.tc-tiddlylink-resolves {\n\tfont-weight: 300;\n}\n\n.tc-sidebar-header .tc-sidebar-lists p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-sidebar-header .tc-missing-tiddler-label {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-advanced-search input {\n\twidth: 60%;\n}\n\n.tc-search a svg {\n\twidth: 1.2em;\n\theight: 1.2em;\n\tvertical-align: middle;\n}\n\n.tc-page-controls {\n\tmargin-top: 14px;\n\tfont-size: 1.5em;\n}\n\n.tc-page-controls .tc-drop-down {\n font-size: 1rem;\n}\n\n.tc-page-controls button {\n\tmargin-right: 0.5em;\n}\n\n.tc-page-controls a.tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-page-controls img {\n\twidth: 1em;\n}\n\n.tc-page-controls svg {\n\tfill: <<colour sidebar-controls-foreground>>;\n}\n\n.tc-page-controls button:hover svg, .tc-page-controls a:hover svg {\n\tfill: <<colour sidebar-controls-foreground-hover>>;\n}\n\n.tc-sidebar-lists .tc-menu-list-item {\n\twhite-space: nowrap;\n}\n\n.tc-menu-list-count {\n\tfont-weight: bold;\n}\n\n.tc-menu-list-subitem {\n\tpadding-left: 7px;\n}\n\n.tc-story-river {\n\tposition: relative;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-sidebar-header {\n\t\tpadding: 14px;\n\t\tmin-height: 32px;\n\t\tmargin-top: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\ttransition: min-height {{$:/config/AnimationDuration}}ms ease-in-out, padding-top {{$:/config/AnimationDuration}}ms ease-in-out, padding-bottom {{$:/config/AnimationDuration}}ms ease-in-out;\n\t}\n\t\n\t<<if-no-sidebar \"\"\"\n\n\t\t.tc-sidebar-header {\n\t\t\tmin-height: 0;\n\t\t\tpadding-top: 0;\n\t\t\tpadding-bottom: 0;\n\t\t}\n\n\t\"\"\">>\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tpadding: 0;\n\t}\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-message-box {\n\t\tmargin: 21px -21px 21px -21px;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tposition: fixed;\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t\tbottom: 0;\n\t\tright: 0;\n\t\toverflow-y: auto;\n\t\toverflow-x: auto;\n\t\t-webkit-overflow-scrolling: touch;\n\t\tmargin: 0 0 0 -42px;\n\t\tpadding: 71px 0 28px 42px;\n\t}\n\n\thtml[dir=\"rtl\"] .tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tright: {{$:/themes/tiddlywiki/vanilla/metrics/storyright}};\n\t}\n\n\t.tc-story-river {\n\t\tposition: relative;\n\t\tleft: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\ttop: {{$:/themes/tiddlywiki/vanilla/metrics/storytop}};\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/storywidth}};\n\t\tpadding: 42px 42px 42px 42px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-story-river {\n\t\twidth: calc(100% - {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}});\n\t}\n\n\">>\n\n\t.tc-story-river.tc-static-story-river {\n\t\tmargin-right: 0;\n\t\tpadding-right: 42px;\n\t}\n\n}\n\n@media print {\n\n\tbody.tc-body {\n\t\tbackground-color: transparent;\n\t}\n\n\t.tc-sidebar-header, .tc-topbar {\n\t\tdisplay: none;\n\t}\n\n\t.tc-story-river {\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t}\n\n\t.tc-story-river .tc-tiddler-frame {\n\t\tmargin: 0;\n\t\tborder: none;\n\t\tpadding: 0;\n\t}\n}\n\n/*\n** Tiddler styles\n*/\n\n.tc-tiddler-frame {\n\tposition: relative;\n\tmargin-bottom: 28px;\n\tbackground-color: <<colour tiddler-background>>;\n\tborder: 1px solid <<colour tiddler-border>>;\n}\n\n{{$:/themes/tiddlywiki/vanilla/sticky}}\n\n.tc-tiddler-info {\n\tpadding: 14px 42px 14px 42px;\n\tbackground-color: <<colour tiddler-info-background>>;\n\tborder-top: 1px solid <<colour tiddler-info-border>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-border>>;\n}\n\n.tc-tiddler-info p {\n\tmargin-top: 3px;\n\tmargin-bottom: 3px;\n}\n\n.tc-tiddler-info .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour tiddler-info-tab-background>>;\n\tborder-bottom: 1px solid <<colour tiddler-info-tab-background>>;\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\n\t.tc-tiddler-info {\n\t\tpadding: 14px 14px 14px 14px;\n\t}\n\n}\n\n.tc-view-field-table {\n\twidth: 100%;\n}\n\n.tc-view-field-name {\n\twidth: 1%; /* Makes this column be as narrow as possible */\n\ttext-align: right;\n\tfont-style: italic;\n\tfont-weight: 200;\n}\n\n.tc-view-field-value {\n}\n\n@media (max-width: <<sidebarbreakpoint-minus-one>>) {\n\t.tc-tiddler-frame {\n\t\tpadding: 14px 14px 14px 14px;\n\t\tmargin-bottom: .5em;\n\t}\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -14px 0 -14px;\n\t}\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\t.tc-tiddler-frame {\n\t\tpadding: 28px 42px 42px 42px;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth}};\n\t\tborder-radius: 2px;\n\t}\n\n<<if-no-sidebar \"\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\">>\n\n\t.tc-tiddler-info {\n\t\tmargin: 0 -42px 0 -42px;\n\t}\n}\n\n.tc-site-title,\n.tc-titlebar {\n\tfont-weight: 300;\n\tfont-size: 2.35em;\n\tline-height: 1.35em;\n\tcolor: <<colour tiddler-title-foreground>>;\n\tmargin: 0;\n}\n\n.tc-site-title {\n\tcolor: <<colour site-title-foreground>>;\n}\n\n.tc-tiddler-title-icon {\n\tvertical-align: middle;\n\tmargin-right: .1em;\n}\n\n.tc-system-title-prefix {\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-titlebar h2 {\n\tfont-size: 1em;\n\tdisplay: inline;\n}\n\n.tc-titlebar img {\n\theight: 1em;\n}\n\n.tc-subtitle {\n\tfont-size: 0.9em;\n\tcolor: <<colour tiddler-subtitle-foreground>>;\n\tfont-weight: 300;\n}\n\n.tc-subtitle .tc-tiddlylink {\n\tmargin-right: .3em;\n}\n\n.tc-tiddler-missing .tc-title {\n font-style: italic;\n font-weight: normal;\n}\n\n.tc-tiddler-frame .tc-tiddler-controls {\n\tfloat: right;\n}\n\n.tc-tiddler-controls .tc-drop-down {\n\tfont-size: 0.6em;\n}\n\n.tc-tiddler-controls .tc-drop-down .tc-drop-down {\n\tfont-size: 1em;\n}\n\n.tc-tiddler-controls > span > button,\n.tc-tiddler-controls > span > span > button,\n.tc-tiddler-controls > span > span > span > button {\n\tvertical-align: baseline;\n\tmargin-left:5px;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img,\n.tc-search button svg, .tc-search a svg {\n\tfill: <<colour tiddler-controls-foreground>>;\n}\n\n.tc-tiddler-controls button svg, .tc-tiddler-controls button img {\n\theight: 0.75em;\n}\n\n.tc-search button svg, .tc-search a svg {\n height: 1.2em;\n width: 1.2em;\n margin: 0 0.25em;\n}\n\n.tc-tiddler-controls button.tc-selected svg,\n.tc-page-controls button.tc-selected svg {\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n}\n\n.tc-tiddler-controls button.tc-btn-invisible:hover svg,\n.tc-search button:hover svg, .tc-search a:hover svg {\n\tfill: <<colour tiddler-controls-foreground-hover>>;\n}\n\n@media print {\n\t.tc-tiddler-controls {\n\t\tdisplay: none;\n\t}\n}\n\n.tc-tiddler-help { /* Help prompts within tiddler template */\n\tcolor: <<colour muted-foreground>>;\n\tmargin-top: 14px;\n}\n\n.tc-tiddler-help a.tc-tiddlylink {\n\tcolor: <<colour very-muted-foreground>>;\n}\n\n.tc-tiddler-frame .tc-edit-texteditor {\n\twidth: 100%;\n\tmargin: 4px 0 4px 0;\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor,\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tpadding: 3px 3px 3px 3px;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tline-height: 1.3em;\n\t-webkit-appearance: none;\n\tfont-family: {{$:/themes/tiddlywiki/vanilla/settings/editorfontfamily}};\n}\n\n.tc-tiddler-frame input.tc-edit-texteditor,\n.tc-tiddler-frame textarea.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-editor-background>>;\n}\n\n.tc-tiddler-frame iframe.tc-edit-texteditor {\n\tbackground-color: <<colour tiddler-background>>;\n}\n\n.tc-tiddler-frame .tc-binary-warning {\n\twidth: 100%;\n\theight: 5em;\n\ttext-align: center;\n\tpadding: 3em 3em 6em 3em;\n\tbackground: <<colour alert-background>>;\n\tborder: 1px solid <<colour alert-border>>;\n}\n\ncanvas.tc-edit-bitmapeditor {\n\tborder: 6px solid <<colour tiddler-editor-border-image>>;\n\tcursor: crosshair;\n\t-moz-user-select: none;\n\t-webkit-user-select: none;\n\t-ms-user-select: none;\n\tmargin-top: 6px;\n\tmargin-bottom: 6px;\n}\n\n.tc-edit-bitmapeditor-width {\n\tdisplay: block;\n}\n\n.tc-edit-bitmapeditor-height {\n\tdisplay: block;\n}\n\n.tc-tiddler-body {\n\tclear: both;\n}\n\n.tc-tiddler-frame .tc-tiddler-body {\n\tfont-size: {{$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize}};\n\tline-height: {{$:/themes/tiddlywiki/vanilla/metrics/bodylineheight}};\n}\n\n.tc-titlebar, .tc-tiddler-edit-title {\n\toverflow: hidden; /* https://github.com/Jermolene/TiddlyWiki5/issues/282 */\n}\n\nhtml body.tc-body.tc-single-tiddler-window {\n\tmargin: 1em;\n\tbackground: <<colour tiddler-background>>;\n}\n\n.tc-single-tiddler-window img,\n.tc-single-tiddler-window svg,\n.tc-single-tiddler-window canvas,\n.tc-single-tiddler-window embed,\n.tc-single-tiddler-window iframe {\n\tmax-width: 100%;\n}\n\n/*\n** Editor\n*/\n\n.tc-editor-toolbar {\n\tmargin-top: 8px;\n}\n\n.tc-editor-toolbar button {\n\tvertical-align: middle;\n\tbackground-color: <<colour tiddler-controls-foreground>>;\n\tcolor: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour tiddler-controls-foreground-selected>>;\n\tborder-radius: 4px;\n\tpadding: 3px;\n\tmargin: 2px 0 2px 4px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-adjunct {\n\tmargin-left: 1px;\n\twidth: 1em;\n\tborder-radius: 8px;\n}\n\n.tc-editor-toolbar button.tc-text-editor-toolbar-item-start-group {\n\tmargin-left: 11px;\n}\n\n.tc-editor-toolbar button.tc-selected {\n\tbackground-color: <<colour primary>>;\n}\n\n.tc-editor-toolbar button svg {\n\twidth: 1.6em;\n\theight: 1.2em;\n}\n\n.tc-editor-toolbar button:hover {\n\tbackground-color: <<colour tiddler-controls-foreground-selected>>;\n\tfill: <<colour background>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more {\n\twhite-space: normal;\n}\n\n.tc-editor-toolbar .tc-text-editor-toolbar-more button {\n\tdisplay: inline-block;\n\tpadding: 3px;\n\twidth: auto;\n}\n\n.tc-editor-toolbar .tc-search-results {\n\tpadding: 0;\n}\n\n/*\n** Adjustments for fluid-fixed mode\n*/\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n<<if-fluid-fixed text:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 0;\n\t\tposition: relative;\n\t\twidth: auto;\n\t\tleft: 0;\n\t\tmargin-left: {{$:/themes/tiddlywiki/vanilla/metrics/storyleft}};\n\t\tmargin-right: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\t.tc-tiddler-frame {\n\t\twidth: 100%;\n\t}\n\n\t.tc-sidebar-scrollable {\n\t\tleft: auto;\n\t\tbottom: 0;\n\t\tright: 0;\n\t\twidth: {{$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth}};\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 42px);\n\t}\n\n\"\"\" hiddenSidebarText:\"\"\"\n\n\t.tc-story-river {\n\t\tpadding-right: 3em;\n\t\tmargin-right: 0;\n\t}\n\n\tbody.tc-body .tc-storyview-zoomin-tiddler {\n\t\twidth: 100%;\n\t\twidth: calc(100% - 84px);\n\t}\n\n\"\"\">>\n\n}\n\n/*\n** Toolbar buttons\n*/\n\n.tc-page-controls svg.tc-image-new-button {\n fill: <<colour toolbar-new-button>>;\n}\n\n.tc-page-controls svg.tc-image-options-button {\n fill: <<colour toolbar-options-button>>;\n}\n\n.tc-page-controls svg.tc-image-save-button {\n fill: <<colour toolbar-save-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-info-button {\n fill: <<colour toolbar-info-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-edit-button {\n fill: <<colour toolbar-edit-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-close-button {\n fill: <<colour toolbar-close-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-delete-button {\n fill: <<colour toolbar-delete-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-cancel-button {\n fill: <<colour toolbar-cancel-button>>;\n}\n\n.tc-tiddler-controls button svg.tc-image-done-button {\n fill: <<colour toolbar-done-button>>;\n}\n\n/*\n** Tiddler edit mode\n*/\n\n.tc-tiddler-edit-frame em.tc-edit {\n\tcolor: <<colour muted-foreground>>;\n\tfont-style: normal;\n}\n\n.tc-edit-type-dropdown a.tc-tiddlylink-missing {\n\tfont-style: normal;\n}\n\n.tc-type-selector .tc-edit-typeeditor {\n\twidth: auto;\n}\n\n.tc-type-selector-dropdown-wrapper {\n\tdisplay: inline-block;\n}\n\n<<set-type-selector-min-width>>\n\n.tc-edit-tags {\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tpadding: 4px 8px 4px 8px;\n}\n\n.tc-edit-add-tag {\n\tdisplay: inline-block;\n}\n\n.tc-edit-add-tag .tc-add-tag-name input {\n\twidth: 50%;\n}\n\n.tc-edit-add-tag .tc-keyboard {\n\tdisplay:inline;\n}\n\n.tc-edit-tags .tc-tag-label {\n\tdisplay: inline-block;\n}\n\n.tc-edit-tags-list {\n\tmargin: 14px 0 14px 0;\n}\n\n.tc-remove-tag-button {\n\tpadding-left: 4px;\n}\n\n.tc-tiddler-preview {\n\toverflow: auto;\n}\n\n.tc-tiddler-preview-preview {\n\tfloat: right;\n\twidth: 49%;\n\tborder: 1px solid <<colour tiddler-editor-border>>;\n\tmargin: 4px 0 3px 3px;\n\tpadding: 3px 3px 3px 3px;\n}\n\n<<if-editor-height-fixed then:\"\"\"\n\n.tc-tiddler-preview-preview {\n\toverflow-y: scroll;\n\theight: {{$:/config/TextEditor/EditorHeight/Height}};\n}\n\n\"\"\">>\n\n.tc-tiddler-frame .tc-tiddler-preview .tc-edit-texteditor {\n\twidth: 49%;\n}\n\n.tc-tiddler-frame .tc-tiddler-preview canvas.tc-edit-bitmapeditor {\n\tmax-width: 49%;\n}\n\n.tc-edit-fields {\n\twidth: 100%;\n}\n\n.tc-edit-fields.tc-edit-fields-small {\n\tmargin-top: 0;\n\tmargin-bottom: 0;\n}\n\n.tc-edit-fields table, .tc-edit-fields tr, .tc-edit-fields td {\n\tborder: none;\n\tpadding: 4px;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(odd) {\n\tbackground-color: <<colour tiddler-editor-fields-odd>>;\n}\n\n.tc-edit-fields > tbody > .tc-edit-field:nth-child(even) {\n\tbackground-color: <<colour tiddler-editor-fields-even>>;\n}\n\n.tc-edit-field-name {\n\ttext-align: right;\n}\n\n.tc-edit-field-value input {\n\twidth: 100%;\n}\n\n.tc-edit-field-remove {\n}\n\n.tc-edit-field-remove svg {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n\tvertical-align: middle;\n}\n\n.tc-edit-field-add-name-wrapper input.tc-edit-texteditor {\n\twidth: auto;\n}\n\n.tc-edit-field-add-name-wrapper {\n\tdisplay: inline-block;\n}\n\n.tc-edit-field-add-value {\n\tdisplay: inline-block;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-edit-field-add-value {\n\t\twidth: 35%;\n\t}\n\n}\n\n.tc-edit-field-add-button {\n\tdisplay: inline-block;\n\twidth: 10%;\n}\n\n/*\n** Storyview Classes\n*/\n\n.tc-viewswitcher .tc-image-button {\n\tmargin-right: .3em;\n}\n\n.tc-storyview-zoomin-tiddler {\n\tposition: absolute;\n\tdisplay: block;\n\twidth: 100%;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-storyview-zoomin-tiddler {\n\t\twidth: calc(100% - 84px);\n\t}\n\n}\n\n/*\n** Dropdowns\n*/\n\n.tc-btn-dropdown {\n\ttext-align: left;\n}\n\n.tc-btn-dropdown svg, .tc-btn-dropdown img {\n\theight: 1em;\n\twidth: 1em;\n\tfill: <<colour muted-foreground>>;\n}\n\n.tc-drop-down-wrapper {\n\tposition: relative;\n}\n\n.tc-drop-down {\n\tmin-width: 380px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\ttext-shadow: none;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-drop-down {\n\tmargin-left: 14px;\n}\n\n.tc-drop-down button svg, .tc-drop-down a svg {\n\tfill: <<colour foreground>>;\n}\n\n.tc-drop-down button.tc-btn-invisible:hover svg {\n\tfill: <<colour background>>;\n}\n\n.tc-drop-down .tc-drop-down-info {\n\tpadding-left: 14px;\n}\n\n.tc-drop-down p {\n\tpadding: 0 14px 0 14px;\n}\n\n.tc-drop-down svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-drop-down img {\n\twidth: 1em;\n}\n\n.tc-drop-down a, .tc-drop-down button {\n\tdisplay: block;\n\tpadding: 0 14px 0 14px;\n\twidth: 100%;\n\ttext-align: left;\n\tcolor: <<colour foreground>>;\n\tline-height: 1.4;\n}\n\n.tc-drop-down .tc-tab-set .tc-tab-buttons button {\n\tdisplay: inline-block;\n width: auto;\n margin-bottom: 0px;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.tc-drop-down .tc-prompt {\n\tpadding: 0 14px;\n}\n\n.tc-drop-down .tc-chooser {\n\tborder: none;\n}\n\n.tc-drop-down .tc-chooser .tc-swatches-horiz {\n\tfont-size: 0.4em;\n\tpadding-left: 1.2em;\n}\n\n.tc-drop-down .tc-file-input-wrapper {\n\twidth: 100%;\n}\n\n.tc-drop-down .tc-file-input-wrapper button {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-drop-down a:hover, .tc-drop-down button:hover, .tc-drop-down .tc-file-input-wrapper:hover button {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-tab-buttons button {\n\tbackground-color: <<colour dropdown-tab-background>>;\n}\n\n.tc-drop-down .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour dropdown-tab-background-selected>>;\n\tborder-bottom: 1px solid <<colour dropdown-tab-background-selected>>;\n}\n\n.tc-drop-down-bullet {\n\tdisplay: inline-block;\n\twidth: 0.5em;\n}\n\n.tc-drop-down .tc-tab-contents a {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-block-dropdown-wrapper {\n\tposition: relative;\n}\n\n.tc-block-dropdown {\n\tposition: absolute;\n\tmin-width: 220px;\n\tborder: 1px solid <<colour dropdown-border>>;\n\tbackground-color: <<colour dropdown-background>>;\n\tpadding: 7px 0;\n\tmargin: 4px 0 0 0;\n\twhite-space: nowrap;\n\tz-index: 1000;\n\ttext-shadow: none;\n}\n\n.tc-block-dropdown.tc-search-drop-down {\n\tmargin-left: -12px;\n}\n\n.tc-block-dropdown a {\n\tdisplay: block;\n\tpadding: 4px 14px 4px 14px;\n}\n\n.tc-block-dropdown.tc-search-drop-down a {\n\tdisplay: block;\n\tpadding: 0px 10px 0px 10px;\n}\n\n.tc-drop-down .tc-dropdown-item-plain,\n.tc-block-dropdown .tc-dropdown-item-plain {\n\tpadding: 4px 14px 4px 7px;\n}\n\n.tc-drop-down .tc-dropdown-item,\n.tc-block-dropdown .tc-dropdown-item {\n\tpadding: 4px 14px 4px 7px;\n\tcolor: <<colour muted-foreground>>;\n}\n\n.tc-block-dropdown a.tc-tiddlylink:hover {\n\tcolor: <<colour tiddler-link-background>>;\n\tbackground-color: <<colour tiddler-link-foreground>>;\n\ttext-decoration: none;\n}\n\n.tc-search-results {\n\tpadding: 0 7px 0 7px;\n}\n\n.tc-image-chooser, .tc-colour-chooser {\n\twhite-space: normal;\n}\n\n.tc-image-chooser a,\n.tc-colour-chooser a {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\ttext-align: center;\n\tposition: relative;\n}\n\n.tc-image-chooser a {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 2px;\n\tmargin: 2px;\n\twidth: 4em;\n\theight: 4em;\n}\n\n.tc-colour-chooser a {\n\tpadding: 3px;\n\twidth: 2em;\n\theight: 2em;\n\tvertical-align: middle;\n}\n\n.tc-image-chooser a:hover,\n.tc-colour-chooser a:hover {\n\tbackground: <<colour primary>>;\n\tpadding: 0px;\n\tborder: 3px solid <<colour primary>>;\n}\n\n.tc-image-chooser a svg,\n.tc-image-chooser a img {\n\tdisplay: inline-block;\n\twidth: auto;\n\theight: auto;\n\tmax-width: 3.5em;\n\tmax-height: 3.5em;\n\tposition: absolute;\n\ttop: 0;\n\tbottom: 0;\n\tleft: 0;\n\tright: 0;\n\tmargin: auto;\n}\n\n/*\n** Modals\n*/\n\n.tc-modal-wrapper {\n\tposition: fixed;\n\toverflow: auto;\n\toverflow-y: scroll;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 900;\n}\n\n.tc-modal-backdrop {\n\tposition: fixed;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\tleft: 0;\n\tz-index: 1000;\n\tbackground-color: <<colour modal-backdrop>>;\n}\n\n.tc-modal {\n\tz-index: 1100;\n\tbackground-color: <<colour modal-background>>;\n\tborder: 1px solid <<colour modal-border>>;\n}\n\n@media (max-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 1em;\n\t\tleft: 1em;\n\t\tright: 1em;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n@media (min-width: 55em) {\n\t.tc-modal {\n\t\tposition: fixed;\n\t\ttop: 2em;\n\t\tleft: 25%;\n\t\twidth: 50%;\n\t}\n\n\t.tc-modal-body {\n\t\toverflow-y: auto;\n\t\tmax-height: 400px;\n\t\tmax-height: 60vh;\n\t}\n}\n\n.tc-modal-header {\n\tpadding: 9px 15px;\n\tborder-bottom: 1px solid <<colour modal-header-border>>;\n}\n\n.tc-modal-header h3 {\n\tmargin: 0;\n\tline-height: 30px;\n}\n\n.tc-modal-header img, .tc-modal-header svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-modal-body {\n\tpadding: 15px;\n}\n\n.tc-modal-footer {\n\tpadding: 14px 15px 15px;\n\tmargin-bottom: 0;\n\ttext-align: right;\n\tbackground-color: <<colour modal-footer-background>>;\n\tborder-top: 1px solid <<colour modal-footer-border>>;\n}\n\n\n/*\n** Centered modals\n*/\n.tc-modal-centered .tc-modal {\n\twidth: auto;\n\ttop: 50%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%) !important;\n}\n\n/*\n** Notifications\n*/\n\n.tc-notification {\n\tposition: fixed;\n\ttop: 14px;\n\tright: 42px;\n\tz-index: 1300;\n\tmax-width: 280px;\n\tpadding: 0 14px 0 14px;\n\tbackground-color: <<colour notification-background>>;\n\tborder: 1px solid <<colour notification-border>>;\n}\n\n/*\n** Tabs\n*/\n\n.tc-tab-set.tc-vertical {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tab-buttons {\n\tfont-size: 0.85em;\n\tpadding-top: 1em;\n\tmargin-bottom: -2px;\n}\n\n.tc-tab-buttons.tc-vertical {\n\tz-index: 100;\n\tdisplay: block;\n\tpadding-top: 14px;\n\tvertical-align: top;\n\ttext-align: right;\n\tmargin-bottom: inherit;\n\tmargin-right: -1px;\n\tmax-width: 33%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n}\n\n.tc-tab-buttons button.tc-tab-selected {\n\tcolor: <<colour tab-foreground-selected>>;\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-left: 1px solid <<colour tab-border-selected>>;\n\tborder-top: 1px solid <<colour tab-border-selected>>;\n\tborder-right: 1px solid <<colour tab-border-selected>>;\n}\n\n.tc-tab-buttons button {\n\tcolor: <<colour tab-foreground>>;\n\tpadding: 3px 5px 3px 5px;\n\tmargin-right: 0.3em;\n\tfont-weight: 300;\n\tborder: none;\n\tbackground: inherit;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-right: 1px solid <<colour tab-border>>;\n\tborder-top-left-radius: 2px;\n\tborder-top-right-radius: 2px;\n\tborder-bottom-left-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button {\n\tdisplay: block;\n\twidth: 100%;\n\tmargin-top: 3px;\n\tmargin-right: 0;\n\ttext-align: right;\n\tbackground-color: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tborder-right: none;\n\tborder-top-left-radius: 2px;\n\tborder-bottom-left-radius: 2px;\n\tborder-top-right-radius: 0;\n\tborder-bottom-right-radius: 0;\n}\n\n.tc-tab-buttons.tc-vertical button.tc-tab-selected {\n\tbackground-color: <<colour tab-background-selected>>;\n\tborder-right: 1px solid <<colour tab-background-selected>>;\n}\n\n.tc-tab-divider {\n\tborder-top: 1px solid <<colour tab-divider>>;\n}\n\n.tc-tab-divider.tc-vertical {\n\tdisplay: none;\n}\n\n.tc-tab-content {\n\tmargin-top: 14px;\n}\n\n.tc-tab-content.tc-vertical {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-top: 0;\n\tpadding-left: 14px;\n\tborder-left: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 70%;\n\tflex: 1 0 70%;\n\toverflow: auto;\n}\n\n.tc-sidebar-lists .tc-tab-buttons {\n\tmargin-bottom: -1px;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tcolor: <<colour sidebar-tab-foreground-selected>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border-selected>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border-selected>>;\n}\n\n.tc-sidebar-lists .tc-tab-buttons button {\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tcolor: <<colour sidebar-tab-foreground>>;\n\tborder-left: 1px solid <<colour sidebar-tab-border>>;\n\tborder-top: 1px solid <<colour sidebar-tab-border>>;\n\tborder-right: 1px solid <<colour sidebar-tab-border>>;\n}\n\n.tc-sidebar-lists .tc-tab-divider {\n\tborder-top: 1px solid <<colour sidebar-tab-divider>>;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button {\n\tdisplay: block;\n\twidth: 100%;\n\tbackground-color: <<colour sidebar-tab-background>>;\n\tborder-top: none;\n\tborder-left: none;\n\tborder-bottom: none;\n\tborder-right: 1px solid #ccc;\n\tmargin-bottom: inherit;\n}\n\n.tc-more-sidebar > .tc-tab-set > .tc-tab-buttons > button.tc-tab-selected {\n\tbackground-color: <<colour sidebar-tab-background-selected>>;\n\tborder: none;\n}\n\n/*\n** Manager\n*/\n\n.tc-manager-wrapper {\n\t\n}\n\n.tc-manager-controls {\n\t\n}\n\n.tc-manager-control {\n\tmargin: 0.5em 0;\n}\n\n.tc-manager-list {\n\twidth: 100%;\n\tborder-top: 1px solid <<colour muted-foreground>>;\n\tborder-left: 1px solid <<colour muted-foreground>>;\n\tborder-right: 1px solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item {\n\n}\n\n.tc-manager-list-item-heading {\n display: block;\n width: 100%;\n text-align: left;\t\n\tborder-bottom: 1px solid <<colour muted-foreground>>;\n\tpadding: 3px;\n}\n\n.tc-manager-list-item-heading-selected {\n\tfont-weight: bold;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n\tbackground-color: <<colour foreground>>;\n}\n\n.tc-manager-list-item-heading:hover {\n\tbackground: <<colour primary>>;\n\tcolor: <<colour background>>;\n}\n\n.tc-manager-list-item-content {\n\tdisplay: flex;\n}\n\n.tc-manager-list-item-content-sidebar {\n flex: 1 0;\n background: <<colour tiddler-editor-background>>;\n border-right: 0.5em solid <<colour muted-foreground>>;\n border-bottom: 0.5em solid <<colour muted-foreground>>;\n white-space: nowrap;\n}\n\n.tc-manager-list-item-content-item-heading {\n\tdisplay: block;\n\twidth: 100%;\n\ttext-align: left;\n background: <<colour muted-foreground>>;\n\ttext-transform: uppercase;\n\tfont-size: 0.6em;\n\tfont-weight: bold;\n padding: 0.5em 0 0.5em 0;\n}\n\n.tc-manager-list-item-content-item-body {\n\tpadding: 0 0.5em 0 0.5em;\n}\n\n.tc-manager-list-item-content-item-body > pre {\n\tmargin: 0.5em 0 0.5em 0;\n\tborder: none;\n\tbackground: inherit;\n}\n\n.tc-manager-list-item-content-tiddler {\n flex: 3 1;\n border-left: 0.5em solid <<colour muted-foreground>>;\n border-right: 0.5em solid <<colour muted-foreground>>;\n border-bottom: 0.5em solid <<colour muted-foreground>>;\n}\n\n.tc-manager-list-item-content-item-body > table {\n\tborder: none;\n\tpadding: 0;\n\tmargin: 0;\n}\n\n.tc-manager-list-item-content-item-body > table td {\n\tborder: none;\n}\n\n.tc-manager-icon-editor > button {\n\twidth: 100%;\n}\n\n.tc-manager-icon-editor > button > svg,\n.tc-manager-icon-editor > button > button {\n\twidth: 100%;\n\theight: auto;\n}\n\n/*\n** Import table\n*/\n\n.tc-import-table {\n\twidth: 100%;\n}\n\n.tc-import-table svg.tc-image-edit-button {\n\tmax-width: unset;\n}\n\n.tc-import-table th:first-of-type {\n\twidth: 10%;\n}\n\n.tc-import-table th:last-of-type {\n\twidth: 30%;\n}\n\n.tc-import-table .tc-row-disabled {\n\tbackground: <<colour very-muted-foreground>>10;\n\topacity: 0.8;\n}\n\n.tc-import-table .tc-row-warning {\n\tbackground: <<colour diff-delete-background>>50;\n}\n\n/*\n** Alerts\n*/\n\n.tc-alerts {\n\tposition: fixed;\n\ttop: 28px;\n\tleft: 0;\n\tright: 0;\n\tmax-width: 50%;\n\tz-index: 20000;\n}\n\n.tc-alert {\n\tposition: relative;\n\tmargin: 14px;\n\tpadding: 7px;\n\tborder: 1px solid <<colour alert-border>>;\n\tbackground-color: <<colour alert-background>>;\n}\n\n.tc-alert-toolbar {\n\tposition: absolute;\n\ttop: 7px;\n\tright: 7px;\n line-height: 0;\n}\n\n.tc-alert-toolbar svg {\n\tfill: <<colour alert-muted-foreground>>;\n}\n\n.tc-alert-subtitle {\n\tcolor: <<colour alert-muted-foreground>>;\n\tfont-weight: bold;\n font-size: 0.8em;\n margin-bottom: 0.5em;\n}\n\n.tc-alert-body > p {\n\tmargin: 0;\n}\n\n.tc-alert-highlight {\n\tcolor: <<colour alert-highlight>>;\n}\n\n@media (min-width: <<sidebarbreakpoint>>) {\n\n\t.tc-static-alert {\n\t\tposition: relative;\n\t}\n\n\t.tc-static-alert-inner {\n\t\tposition: absolute;\n\t\tz-index: 100;\n\t}\n\n}\n\n.tc-static-alert-inner {\n\tpadding: 0 2px 2px 42px;\n\tcolor: <<colour static-alert-foreground>>;\n}\n\n/*\n** Floating drafts list\n*/\n\n.tc-drafts-list {\n\tz-index: 2000;\n\tposition: fixed;\n\tfont-size: 0.8em;\n\tleft: 0;\n\tbottom: 0;\n}\n\n.tc-drafts-list a {\n\tmargin: 0 0.5em;\n\tpadding: 4px 4px;\n\tborder-top-left-radius: 4px;\n\tborder-top-right-radius: 4px;\n\tborder: 1px solid <<colour background>>;\n\tborder-bottom-none;\n\tbackground: <<colour dirty-indicator>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a:hover {\n\ttext-decoration: none;\n\tbackground: <<colour foreground>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour background>>;\n}\n\n.tc-drafts-list a svg {\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: text-bottom;\n}\n\n/*\n** Control panel\n*/\n\n.tc-control-panel td {\n\tpadding: 4px;\n}\n\n.tc-control-panel table, .tc-control-panel table input, .tc-control-panel table textarea {\n\twidth: 100%;\n}\n\n.tc-plugin-info {\n\tdisplay: flex;\n\tborder: 1px solid <<colour muted-foreground>>;\n\tfill: <<colour muted-foreground>>;\n\tbackground-color: <<colour background>>;\n\tmargin: 0.5em 0 0.5em 0;\n\tpadding: 4px;\n align-items: center;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info {\n margin: 0.5em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugin-indicator {\n\tmargin: -16px 1em 0 2em;\n}\n\n.tc-plugin-info-sub-plugin-indicator button {\n\tcolor: <<colour background>>;\n\tbackground: <<colour foreground>>;\n\tborder-radius: 8px;\n padding: 2px 7px;\n font-size: 0.75em;\n}\n\n.tc-plugin-info-sub-plugins .tc-plugin-info-dropdown {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-plugin-info-disabled {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n\tbackground: repeating-linear-gradient(45deg, #ff0, #ff0 10px, #eee 10px, #eee 20px);\n}\n\n.tc-plugin-info-disabled:hover {\n\tbackground: -webkit-repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n\tbackground: repeating-linear-gradient(45deg, #aa0, #aa0 10px, #888 10px, #888 20px);\n}\n\na.tc-tiddlylink.tc-plugin-info:hover {\n\ttext-decoration: none;\n\tbackground-color: <<colour primary>>;\n\tcolor: <<colour background>>;\n\tfill: <<colour foreground>>;\n}\n\na.tc-tiddlylink.tc-plugin-info:hover > .tc-plugin-info-chunk > svg {\n\tfill: <<colour background>>;\n}\n\n.tc-plugin-info-chunk {\n margin: 2px;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\tline-height: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description {\n\tflex-grow: 1;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-buttons {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tflex-grow: 0;\n\tflex-shrink: 0;\n text-align: right;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h1 {\n\tfont-size: 1em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description h2 {\n\tfont-size: 0.8em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-description div {\n\tfont-size: 0.7em;\n\tline-height: 1.2;\n\tmargin: 2px 0 2px 0;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-toggle img, .tc-plugin-info-chunk.tc-plugin-info-toggle svg {\n\twidth: 1em;\n\theight: 1em;\n}\n\n.tc-plugin-info-chunk.tc-plugin-info-icon img, .tc-plugin-info-chunk.tc-plugin-info-icon svg {\n\twidth: 2em;\n\theight: 2em;\n}\n\n.tc-plugin-info-dropdown {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tbackground: <<colour background>>;\n\tmargin-top: -8px;\n}\n\n.tc-plugin-info-dropdown-message {\n\tbackground: <<colour message-background>>;\n\tpadding: 0.5em 1em 0.5em 1em;\n\tfont-weight: bold;\n\tfont-size: 0.8em;\n}\n\n.tc-plugin-info-dropdown-body {\n\tpadding: 1em 1em 0 1em;\n\tbackground: <<colour background>>;\n}\n\n.tc-plugin-info-sub-plugins {\n\tpadding: 0.5em;\n margin: 0 1em 1em 1em;\n\tbackground: <<colour notification-background>>;\n}\n\n.tc-install-plugin {\n\tfont-weight: bold;\n\tbackground: green;\n\tcolor: white;\n\tfill: white;\n\tborder-radius: 4px;\n\tpadding: 3px;\n}\n\n.tc-install-plugin.tc-reinstall-downgrade {\n\tbackground: red;\n}\n\n.tc-install-plugin.tc-reinstall {\n\tbackground: blue;\n}\n\n.tc-install-plugin.tc-reinstall-upgrade {\n\tbackground: orange;\n}\n\n.tc-check-list {\n\tline-height: 2em;\n}\n\n.tc-check-list .tc-image-button {\n\theight: 1.5em;\n}\n\n/*\n** Message boxes\n*/\n\n.tc-message-box {\n\tborder: 1px solid <<colour message-border>>;\n\tbackground: <<colour message-background>>;\n\tpadding: 0px 21px 0px 21px;\n\tfont-size: 12px;\n\tline-height: 18px;\n\tcolor: <<colour message-foreground>>;\n}\n\n.tc-message-box svg {\n\twidth: 1em;\n\theight: 1em;\n vertical-align: text-bottom;\n}\n\n/*\n** Pictures\n*/\n\n.tc-bordered-image {\n\tborder: 1px solid <<colour muted-foreground>>;\n\tpadding: 5px;\n\tmargin: 5px;\n}\n\n/*\n** Floats\n*/\n\n.tc-float-right {\n\tfloat: right;\n}\n\n/*\n** Chooser\n*/\n\n.tc-chooser {\n\tborder-right: 1px solid <<colour table-header-background>>;\n\tborder-left: 1px solid <<colour table-header-background>>;\n}\n\n\n.tc-chooser-item {\n\tborder-bottom: 1px solid <<colour table-header-background>>;\n\tborder-top: 1px solid <<colour table-header-background>>;\n\tpadding: 2px 4px 2px 14px;\n}\n\n.tc-drop-down .tc-chooser-item {\n\tpadding: 2px;\n}\n\n.tc-chosen,\n.tc-chooser-item:hover {\n\tbackground-color: <<colour table-header-background>>;\n\tborder-color: <<colour table-footer-background>>;\n}\n\n.tc-chosen .tc-tiddlylink {\n\tcursor:default;\n}\n\n.tc-chooser-item .tc-tiddlylink {\n\tdisplay: block;\n\ttext-decoration: none;\n\tbackground-color: transparent;\n}\n\n.tc-chooser-item:hover .tc-tiddlylink:hover {\n\ttext-decoration: none;\n}\n\n.tc-drop-down .tc-chosen .tc-tiddlylink,\n.tc-drop-down .tc-chooser-item .tc-tiddlylink:hover {\n\tcolor: <<colour foreground>>;\n}\n\n.tc-chosen > .tc-tiddlylink:before {\n\tmargin-left: -10px;\n\tposition: relative;\n\tcontent: \"» \";\n}\n\n.tc-chooser-item svg,\n.tc-chooser-item img{\n\twidth: 1em;\n\theight: 1em;\n\tvertical-align: middle;\n}\n\n.tc-language-chooser .tc-image-button img {\n\twidth: 2em;\n\tvertical-align: -0.15em;\n}\n\n/*\n** Palette swatches\n*/\n\n.tc-swatches-horiz {\n}\n\n.tc-swatches-horiz .tc-swatch {\n\tdisplay: inline-block;\n}\n\n.tc-swatch {\n\twidth: 2em;\n\theight: 2em;\n\tmargin: 0.4em;\n\tborder: 1px solid #888;\n}\n\ninput.tc-palette-manager-colour-input {\n\twidth: 100%;\n\tpadding: 0;\n}\n\n/*\n** Table of contents\n*/\n\n.tc-sidebar-lists .tc-table-of-contents {\n\twhite-space: nowrap;\n}\n\n.tc-table-of-contents button {\n\tcolor: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents svg {\n\twidth: 0.7em;\n\theight: 0.7em;\n\tvertical-align: middle;\n\tfill: <<colour sidebar-foreground>>;\n}\n\n.tc-table-of-contents ol {\n\tlist-style-type: none;\n\tpadding-left: 0;\n}\n\n.tc-table-of-contents ol ol {\n\tpadding-left: 1em;\n}\n\n.tc-table-of-contents li {\n\tfont-size: 1.0em;\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li a {\n\tfont-weight: bold;\n}\n\n.tc-table-of-contents li li {\n\tfont-size: 0.95em;\n\tfont-weight: normal;\n\tline-height: 1.4;\n}\n\n.tc-table-of-contents li li a {\n\tfont-weight: normal;\n}\n\n.tc-table-of-contents li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n\tline-height: 1.5;\n}\n\n.tc-table-of-contents li li li li {\n\tfont-size: 0.95em;\n\tfont-weight: 200;\n}\n\n.tc-tabbed-table-of-contents {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents {\n\tz-index: 100;\n\tdisplay: inline-block;\n\tpadding-left: 1em;\n\tmax-width: 50%;\n\t-webkit-flex: 0 0 auto;\n\tflex: 0 0 auto;\n\tbackground: <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a,\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tdisplay: block;\n\tpadding: 0.12em 1em 0.12em 0.25em;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a {\n\tborder-top: 1px solid <<colour tab-background>>;\n\tborder-left: 1px solid <<colour tab-background>>;\n\tborder-bottom: 1px solid <<colour tab-background>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item > a:hover {\n\ttext-decoration: none;\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour tab-border>>;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a {\n\tborder-top: 1px solid <<colour tab-border>>;\n\tborder-left: 1px solid <<colour tab-border>>;\n\tborder-bottom: 1px solid <<colour tab-border>>;\n\tbackground: <<colour background>>;\n\tmargin-right: -1px;\n}\n\n.tc-tabbed-table-of-contents .tc-table-of-contents .toc-item-selected > a:hover {\n\ttext-decoration: none;\n}\n\n.tc-tabbed-table-of-contents .tc-tabbed-table-of-contents-content {\n\tdisplay: inline-block;\n\tvertical-align: top;\n\tpadding-left: 1.5em;\n\tpadding-right: 1.5em;\n\tborder: 1px solid <<colour tab-border>>;\n\t-webkit-flex: 1 0 50%;\n\tflex: 1 0 50%;\n}\n\n/*\n** Dirty indicator\n*/\n\nbody.tc-dirty span.tc-dirty-indicator, body.tc-dirty span.tc-dirty-indicator svg {\n\tfill: <<colour dirty-indicator>>;\n\tcolor: <<colour dirty-indicator>>;\n}\n\n/*\n** File inputs\n*/\n\n.tc-file-input-wrapper {\n\tposition: relative;\n\toverflow: hidden;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n\n.tc-file-input-wrapper input[type=file] {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tfont-size: 999px;\n\tmax-width: 100%;\n\tmax-height: 100%;\n\tfilter: alpha(opacity=0);\n\topacity: 0;\n\toutline: none;\n\tbackground: white;\n\tcursor: pointer;\n\tdisplay: inline-block;\n}\n\n::-webkit-file-upload-button {\n\tcursor:pointer;\n}\n\n/*\n** Thumbnail macros\n*/\n\n.tc-thumbnail-wrapper {\n\tposition: relative;\n\tdisplay: inline-block;\n\tmargin: 6px;\n\tvertical-align: top;\n}\n\n.tc-thumbnail-right-wrapper {\n\tfloat:right;\n\tmargin: 0.5em 0 0.5em 0.5em;\n}\n\n.tc-thumbnail-image {\n\ttext-align: center;\n\toverflow: hidden;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-image svg,\n.tc-thumbnail-image img {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n\tmin-width: 100%;\n\tmin-height: 100%;\n\tmax-width: 100%;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-image img {\n\tfilter: alpha(opacity=0.8);\n\topacity: 0.8;\n}\n\n.tc-thumbnail-background {\n\tposition: absolute;\n\tborder-radius: 3px;\n}\n\n.tc-thumbnail-icon svg,\n.tc-thumbnail-icon img {\n\twidth: 3em;\n\theight: 3em;\n\t<<filter \"drop-shadow(2px 2px 4px rgba(0,0,0,0.3))\">>\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon svg,\n.tc-thumbnail-wrapper:hover .tc-thumbnail-icon img {\n\tfill: #fff;\n\t<<filter \"drop-shadow(3px 3px 4px rgba(0,0,0,0.6))\">>\n}\n\n.tc-thumbnail-icon {\n\tposition: absolute;\n\ttop: 0;\n\tleft: 0;\n\tright: 0;\n\tbottom: 0;\n\tdisplay: -webkit-flex;\n\t-webkit-align-items: center;\n\t-webkit-justify-content: center;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.tc-thumbnail-caption {\n\tposition: absolute;\n\tbackground-color: #777;\n\tcolor: #fff;\n\ttext-align: center;\n\tbottom: 0;\n\twidth: 100%;\n\tfilter: alpha(opacity=0.9);\n\topacity: 0.9;\n\tline-height: 1.4;\n\tborder-bottom-left-radius: 3px;\n\tborder-bottom-right-radius: 3px;\n}\n\n.tc-thumbnail-wrapper:hover .tc-thumbnail-caption {\n\tfilter: alpha(opacity=1);\n\topacity: 1;\n}\n\n/*\n** Diffs\n*/\n\n.tc-diff-equal {\n\tbackground-color: <<colour diff-equal-background>>;\n\tcolor: <<colour diff-equal-foreground>>;\n}\n\n.tc-diff-insert {\n\tbackground-color: <<colour diff-insert-background>>;\n\tcolor: <<colour diff-insert-foreground>>;\n}\n\n.tc-diff-delete {\n\tbackground-color: <<colour diff-delete-background>>;\n\tcolor: <<colour diff-delete-foreground>>;\n}\n\n.tc-diff-invisible {\n\tbackground-color: <<colour diff-invisible-background>>;\n\tcolor: <<colour diff-invisible-foreground>>;\n}\n\n.tc-diff-tiddlers th {\n\ttext-align: right;\n\tbackground: <<colour background>>;\n\tfont-weight: normal;\n\tfont-style: italic;\n}\n\n.tc-diff-tiddlers pre {\n margin: 0;\n padding: 0;\n border: none;\n background: none;\n}\n\n/*\n** Errors\n*/\n\n.tc-error {\n\tbackground: #f00;\n\tcolor: #fff;\n}\n\n/*\n** Tree macro\n*/\n\n.tc-tree div {\n \tpadding-left: 14px;\n}\n\n.tc-tree ol {\n \tlist-style-type: none;\n \tpadding-left: 0;\n \tmargin-top: 0;\n}\n\n.tc-tree ol ol {\n \tpadding-left: 1em; \n}\n\n.tc-tree button { \n \tcolor: #acacac;\n}\n\n.tc-tree svg {\n \tfill: #acacac;\n}\n\n.tc-tree span svg {\n \twidth: 1em;\n \theight: 1em;\n \tvertical-align: baseline;\n}\n\n.tc-tree li span {\n \tcolor: lightgray;\n}\n\nselect {\n color: <<colour select-tag-foreground>>;\n background: <<colour select-tag-background>>;\n}\n\n/*\n** Utility classes for SVG icons\n*/\n\n.tc-fill-background {\n\tfill: <<colour background>>;\n}\n\n/*\n** Flexbox utility classes\n*/\n\n.tc-flex {\n\tdisplay: -webkit-flex;\n\tdisplay: flex;\n}\n\n.tc-flex-column {\n\tflex-direction: column;\n}\n\n.tc-flex-row {\n\tflex-direction: row;\n}\n\n.tc-flex-grow-1 {\n\tflex-grow: 1;\n}\n\n.tc-flex-grow-2 {\n\tflex-grow: 2;\n}\n\n/*\n** Other utility classes\n*/\n\n.tc-small-gap {\n\tmargin-left: .5em;\n\tmargin-right: .5em;\n}\n\n.tc-small-gap-left {\n\tmargin-left: .5em;\n}\n\n.tc-small-gap-right {\n\tmargin-right: .5em;\n}\n\n.tc-big-gap {\n\tmargin-left: 1em;\n\tmargin-right: 1em;\n}\n\n.tc-big-gap-left {\n\tmargin-left: 1em;\n}\n\n.tc-big-gap-right {\n\tmargin-right: 1em;\n}\n\n.tc-word-break {\n\tword-break: break-all;\n}\n"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize",
"text": "15px"
},
"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/bodylineheight",
"text": "22px"
},
"$:/themes/tiddlywiki/vanilla/metrics/fontsize": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/fontsize",
"text": "14px"
},
"$:/themes/tiddlywiki/vanilla/metrics/lineheight": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/lineheight",
"text": "20px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyleft": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyleft",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storytop": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storytop",
"text": "0px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storyright": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storyright",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/storywidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/storywidth",
"text": "770px"
},
"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth",
"text": "686px"
},
"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint",
"text": "960px"
},
"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth": {
"title": "$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth",
"text": "350px"
},
"$:/themes/tiddlywiki/vanilla/options/stickytitles": {
"title": "$:/themes/tiddlywiki/vanilla/options/stickytitles",
"text": "no"
},
"$:/themes/tiddlywiki/vanilla/options/sidebarlayout": {
"title": "$:/themes/tiddlywiki/vanilla/options/sidebarlayout",
"text": "fixed-fluid"
},
"$:/themes/tiddlywiki/vanilla/options/codewrapping": {
"title": "$:/themes/tiddlywiki/vanilla/options/codewrapping",
"text": "pre-wrap"
},
"$:/themes/tiddlywiki/vanilla/reset": {
"title": "$:/themes/tiddlywiki/vanilla/reset",
"type": "text/plain",
"text": "/*! modern-normalize v1.0.0 | MIT License | https://github.com/sindresorhus/modern-normalize */\n\n/*\nDocument\n========\n*/\n\n/**\nUse a better box model (opinionated).\n*/\n\n*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n/**\nUse a more readable tab size (opinionated).\n*/\n\n:root {\n -moz-tab-size: 4;\n tab-size: 4;\n}\n\n/**\n1. Correct the line height in all browsers.\n2. Prevent adjustments of font size after orientation changes in iOS.\n*/\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/*\nSections\n========\n*/\n\n/**\nRemove the margin in all browsers.\n*/\n\nbody {\n margin: 0;\n}\n\n/**\nImprove consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n*/\n\nbody {\n font-family:\n system-ui,\n -apple-system, /* Firefox supports this but not yet `system-ui` */\n 'Segoe UI',\n Roboto,\n Helvetica,\n Arial,\n sans-serif,\n 'Apple Color Emoji',\n 'Segoe UI Emoji';\n}\n\n/*\nGrouping content\n================\n*/\n\n/**\n1. Add the correct height in Firefox.\n2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)\n*/\n\nhr {\n height: 0; /* 1 */\n color: inherit; /* 2 */\n}\n\n/*\nText-level semantics\n====================\n*/\n\n/**\nAdd the correct text decoration in Chrome, Edge, and Safari.\n*/\n\nabbr[title] {\n text-decoration: underline dotted;\n}\n\n/**\nAdd the correct font weight in Edge and Safari.\n*/\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3)\n2. Correct the odd 'em' font sizing in all browsers.\n*/\n\ncode,\nkbd,\nsamp,\npre {\n font-family:\n ui-monospace,\n SFMono-Regular,\n Consolas,\n 'Liberation Mono',\n Menlo,\n monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\nAdd the correct font size in all browsers.\n*/\n\nsmall {\n font-size: 80%;\n}\n\n/**\nPrevent 'sub' and 'sup' elements from affecting the line height in all browsers.\n*/\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/*\nTabular data\n============\n*/\n\n/**\n1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)\n2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)\n*/\n\ntable {\n text-indent: 0; /* 1 */\n border-color: inherit; /* 2 */\n}\n\n/*\nForms\n=====\n*/\n\n/**\n1. Change the font styles in all browsers.\n2. Remove the margin in Firefox and Safari.\n*/\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\nRemove the inheritance of text transform in Edge and Firefox.\n1. Remove the inheritance of text transform in Firefox.\n*/\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\nCorrect the inability to style clickable types in iOS and Safari.\n*/\n\nbutton,\n[type='button'],\n[type='reset'],\n[type='submit'] {\n -webkit-appearance: button;\n}\n\n/**\nRemove the inner border and padding in Firefox.\n*/\n\n::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\nRestore the focus styles unset by the previous rule.\n*/\n\n:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\nRemove the additional ':invalid' styles in Firefox.\nSee: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737\n*/\n\n:-moz-ui-invalid {\n box-shadow: none;\n}\n\n/**\nRemove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers.\n*/\n\nlegend {\n padding: 0;\n}\n\n/**\nAdd the correct vertical alignment in Chrome and Firefox.\n*/\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\nCorrect the cursor style of increment and decrement buttons in Safari.\n*/\n\n::-webkit-inner-spin-button,\n::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n1. Correct the odd appearance in Chrome and Safari.\n2. Correct the outline style in Safari.\n*/\n\n[type='search'] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\nRemove the inner padding in Chrome and Safari on macOS.\n*/\n\n::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n1. Correct the inability to style clickable types in iOS and Safari.\n2. Change font properties to 'inherit' in Safari.\n*/\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/*\nInteractive\n===========\n*/\n\n/*\nAdd the correct display in Chrome and Safari.\n*/\n\nsummary {\n display: list-item;\n}\n"
},
"$:/themes/tiddlywiki/vanilla/settings/fontfamily": {
"title": "$:/themes/tiddlywiki/vanilla/settings/fontfamily",
"text": "system-ui, -apple-system, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\""
},
"$:/themes/tiddlywiki/vanilla/settings/codefontfamily": {
"title": "$:/themes/tiddlywiki/vanilla/settings/codefontfamily",
"text": "\"SFMono-Regular\",Consolas,\"Liberation Mono\",Menlo,Courier,monospace"
},
"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment": {
"title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment",
"text": "fixed"
},
"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize": {
"title": "$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize",
"text": "auto"
},
"$:/themes/tiddlywiki/vanilla/sticky": {
"title": "$:/themes/tiddlywiki/vanilla/sticky",
"text": "<$reveal state=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\" type=\"match\" text=\"yes\">\n``\n.tc-tiddler-title {\n\tposition: -webkit-sticky;\n\tposition: -moz-sticky;\n\tposition: -o-sticky;\n\tposition: -ms-sticky;\n\tposition: sticky;\n\ttop: 0px;\n\tbackground: ``<<colour tiddler-background>>``;\n\tz-index: 500;\n}\n\n``\n<$list filter=\"[range[100]]\">\n`.tc-story-river .tc-tiddler-frame:nth-child(100n+`<$text text=<<currentTiddler>>/>`) {\nz-index: `<$text text={{{ [[200]subtract<currentTiddler>] }}}/>`;\n}\n`\n</$list>\n</$reveal>\n"
},
"$:/themes/tiddlywiki/vanilla/themetweaks": {
"title": "$:/themes/tiddlywiki/vanilla/themetweaks",
"tags": "$:/tags/ControlPanel/Appearance",
"caption": "{{$:/language/ThemeTweaks/ThemeTweaks}}",
"text": "\\define lingo-base() $:/language/ThemeTweaks/\n\n\\define replacement-text()\n[img[$(imageTitle)$]]\n\\end\n\n\\define backgroundimage-dropdown()\n<div class=\"tc-drop-down-wrapper\">\n<$button popup=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> class=\"tc-btn-invisible tc-btn-dropdown\">{{$:/core/images/down-arrow}}</$button>\n<$reveal state=<<qualify \"$:/state/popup/themetweaks/backgroundimage\">> type=\"popup\" position=\"belowleft\" text=\"\" default=\"\">\n<div class=\"tc-drop-down\">\n<$macrocall $name=\"image-picker\" actions=\"\"\"\n\n<$action-setfield\n\t$tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"\n\t$value=<<imageTitle>>\n/>\n\n\"\"\"/>\n</div>\n</$reveal>\n</div>\n\\end\n\n\\define backgroundimageattachment-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\" default=\"scroll\">\n<option value=\"scroll\"><<lingo Settings/BackgroundImageAttachment/Scroll>></option>\n<option value=\"fixed\"><<lingo Settings/BackgroundImageAttachment/Fixed>></option>\n</$select>\n\\end\n\n\\define backgroundimagesize-dropdown()\n<$select tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\" default=\"scroll\">\n<option value=\"auto\"><<lingo Settings/BackgroundImageSize/Auto>></option>\n<option value=\"cover\"><<lingo Settings/BackgroundImageSize/Cover>></option>\n<option value=\"contain\"><<lingo Settings/BackgroundImageSize/Contain>></option>\n</$select>\n\\end\n\n<<lingo ThemeTweaks/Hint>>\n\n! <<lingo Options>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><<lingo Options/SidebarLayout>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/sidebarlayout\"><option value=\"fixed-fluid\"><<lingo Options/SidebarLayout/Fixed-Fluid>></option><option value=\"fluid-fixed\"><<lingo Options/SidebarLayout/Fluid-Fixed>></option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><<lingo Options/StickyTitles>></$link><br>//<<lingo Options/StickyTitles/Hint>>// |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/stickytitles\"><option value=\"no\">{{$:/language/No}}</option><option value=\"yes\">{{$:/language/Yes}}</option></$select> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><<lingo Options/CodeWrapping>></$link> |<$select tiddler=\"$:/themes/tiddlywiki/vanilla/options/codewrapping\"><option value=\"pre\">{{$:/language/No}}</option><option value=\"pre-wrap\">{{$:/language/Yes}}</option></$select> |\n\n! <<lingo Settings>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\"><<lingo Settings/FontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/fontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\"><<lingo Settings/CodeFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/codefontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\"><<lingo Settings/EditorFontFamily>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/editorfontfamily\" default=\"\" tag=\"input\"/> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\"><<lingo Settings/BackgroundImage>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimage\" default=\"\" tag=\"input\"/> |<<backgroundimage-dropdown>> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimageattachment\"><<lingo Settings/BackgroundImageAttachment>></$link> |<<backgroundimageattachment-dropdown>> | |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/settings/backgroundimagesize\"><<lingo Settings/BackgroundImageSize>></$link> |<<backgroundimagesize-dropdown>> | |\n\n! <<lingo Metrics>>\n\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\"><<lingo Metrics/FontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/fontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\"><<lingo Metrics/LineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/lineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\"><<lingo Metrics/BodyFontSize>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodyfontsize\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\"><<lingo Metrics/BodyLineHeight>></$link> |<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/bodylineheight\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\"><<lingo Metrics/StoryLeft>></$link><br>//<<lingo Metrics/StoryLeft/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyleft\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\"><<lingo Metrics/StoryTop>></$link><br>//<<lingo Metrics/StoryTop/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storytop\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\"><<lingo Metrics/StoryRight>></$link><br>//<<lingo Metrics/StoryRight/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storyright\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\"><<lingo Metrics/StoryWidth>></$link><br>//<<lingo Metrics/StoryWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/storywidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\"><<lingo Metrics/TiddlerWidth>></$link><br>//<<lingo Metrics/TiddlerWidth/Hint>>//<br> |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/tiddlerwidth\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\"><<lingo Metrics/SidebarBreakpoint>></$link><br>//<<lingo Metrics/SidebarBreakpoint/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarbreakpoint\" default=\"\" tag=\"input\"/> |\n|<$link to=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\"><<lingo Metrics/SidebarWidth>></$link><br>//<<lingo Metrics/SidebarWidth/Hint>>// |^<$edit-text tiddler=\"$:/themes/tiddlywiki/vanilla/metrics/sidebarwidth\" default=\"\" tag=\"input\"/> |\n"
}
}
}
''Prerequisites'' Charisma 16.
You have a reputation in towns and villages you’ve visited, and residents are always willing to open their doors to you.
When in a town or village, during downtime, you can spend 8 hours to locate a resident willing to provide lodging for you and up to six allies for up to 24 hours at no charge.
The standard of living within the acquired lodging is comfortable, and square meals are provided at no cost.
After 24 hours, you must pay standard prices for further lodging and meals or use this feat again to fnd a new resident willing to host you.
You descend from celestials or were touched by the celestial realms, gaining an air of awe and grace, as well as features distinctive to your celestial forebears.
You gain the <<tag Aasimar>> trait, in addition to the traits from your ancestry.
You also gain [[Low-Light Vision]], or you gain [[Darkvision]] if your ancestry already has low light vision.
You can choose from <<tag Aasimar>> feats and feats from your ancestry whenever you gain an ancestry feat.
{{||VHerFeatList}}
Your celestial powers allow you to remove lesser afflictions with ease.
Each day, you can cast two 4th-level divine innate spells.
You can choose from the following spells each time you cast: [[Remove Curse]], [[Remove Disease]], and [[Neutralize Poison]].
{{||SpellSummaryTable}}
You utter phrases in an unknown tongue, assaulting the minds of those nearby.
Each target must attempt a [[Will]] save.
Regardless of the result of its save, each target is then temporarily immune for 1 minute.
You can increase the number of actions it takes to Cast the Spell (to a maximum of 3 actions total). For each additional action, increase the emanation’s radius by 5 feet, to a maximum of 10 extra feet for 3 actions.
''Heightened (+3)'' The initial radius increases by 5 feet.
{{||SaveSuccessTable}}
Your mind resonates with the inscrutable thought processes that inhuman aberrations use to communicate.
You can cast [[Mindlink]] as an innate occult spell once per day, but you can target only aberrations.
//An Ability Score is one of the six basic value used to calculate your character's modifiers.//
//The Ability Scores are://
<$list filter="[tag[Ability Score]]" />
Abjurations protect and ward. They create barriers that keep out attacks, effects, or even certain types of creatures. They also create effects that harm trespassers or banish interlopers.
<<schoolspelllist Abjuration>>
You have tapped into the ancient magic used by alghollthu masters (also known as aboleths) to mold the flesh of your ancestors. You can use this magic to transfigure other beings.
You gain 3rd-level [[Feet to Fins]] and 2nd-level [[Water Breathing]] as arcane innate spells. You can cast each of these arcane innate spells once per day.
''Frequency'' once per 10 minutes
''Trigger'' You critically succeed at a saving throw against a foe’s spell, and that spell is of a level you can normally cast.
You absorb a spell and store it in your body.
If you are a spontaneous spellcaster, you can cast the triggering spell once during the next 10 minutes, even if it’s not on your spell list as if it were in your repertoire.
If you are a prepared spellcaster, you can replace one of your prepared spells of the same level with the absorbed spell, but you must cast the absorbed spell within 10 minutes or you lose that spell slot for the day.
You cast the spell at the same spell level as the spell you absorbed, but the spell is of your magical tradition and uses your spell DC, spell attack roll, and other statistics to determine its effects.
{{||SpellSummaryTable}}
You move so fast you blur across planar boundaries.
You teleport up to a distance equal to your Speed within your line of sight.
{{||SpellSummaryTable}}
Your touch afflicts the target with Abyssal Plague, which siphons fragments of their soul away to empower the Abyss.
The effect is based on the target's Fortitude save.
{{||SaveSuccessTable}}
Abyssal Plague (disease); Level 9. The target can’t recover from the drained condition from Abyssal plague until the disease is cured. Stage 1 drained 1 (1 day); Stage 2 drained increases by 2 (1 day).
{{||SpellSummaryTable}}
You evoke the energy of an Abyssal realm. The damage types of the spell (one energy and one physical) are based on the result of rolling on the table below.
| !1d4 | !Realm | !Manifestation | !Damage Type |
|1 |Skies |Bolts of lightning and flying debris |<<tag Bludgeoning>> and <<tag Electricity>> |
|2 |Depths |Acid and demonic shells |<<tag Acid>> and <<tag Slashing>> |
|3 |Frozen |Frigid air and ice |<<tag Bludgeoning>> and <<tag Cold>> |
|4 |Volcanic |Jagged volcanic rocks and magma |<<tag Fire>> and <<tag Piercing>> |
You deal 4d6 damage of each of the corresponding damage types to each creature in the cone (8d6 total damage).
''Heightened (+1)'' The damage for each type increases by 1d6.
Your healing energies are infused with bounding energy.
A creature that recovers Hit Points from your [[Lay on Hands]] gains a +10-foot status bonus to its Speed until the end of its next turn.
{{||SpellSummaryTable}}
You sift through the multiverse’s divine knowledge, seeking out tidbits related to a particular subject.
Choose one [[Lore]] skill. You temporarily gain the same proficiency rank in that Lore skill as your proficiency rank for your oracle spellcasting.
Your time spent in the hostile parts of the world has inured you to extreme climates.
In your favored terrain, you gain resistance equal to half your level to all environmental damage and are affected by [[Temperature Effects]] as though they were one step less severe (incredible heat or cold becomes extreme, extreme heat or cold becomes severe, and so on).
When other creatures [[Follow the Expert]] with you as a guide in your favored terrain, they too treat temperature effects as one step less severe.
''Trigger'' An ally within 30 feet Casts a Spell.
You use your performances to supplement an ally’s spellcasting, providing magical energy for their spells.
Attempt a [[Performance]] check, using a very high DC for the ally’s level, and either spend a Focus Point (if the triggering spell is a focus spell) or expend a spell slot at least 1 level higher than the triggering spell.
If you succeed at the Performance check, your ally’s spell doesn’t cost the Focus Point or spell slot.
''Requirements'' You are wielding two melee weapons, each in a different hand.
You refine the precision of your unbelievable storm of blows.
When you perform an [[Impossible Flurry]], your first attack with each weapon instead takes the multiple attack penalty as though you had already made one attack this turn.
All subsequent attacks take the maximum multiple attack penalty, as though you had already made two or more attacks this turn.
Your claws carry your mother’s hag magic.
When you critically hit with a claw [[Strike]], the target takes an additional 1d4 persistent <<tag Mental>> damage.
//This feat does not give you claws if you don't have them.//
''Prerequisites'' expert in unarmed attacks
You have replaced one of your forearms with one made of clay and infused with cursed arcane magic.
When you make an unarmed [[Strike]] with your clay fist and hit, your target takes a –2 status penalty to saving throws against curse effects for 1 hour.
''Special'' The damage die for your clay fist is 1d8, and it loses the agile and finesse traits of a typical fist.
{{||SpellSummaryTable}}
You conjure an arrow of acid that continues corroding the target after it hits.
Make a spell attack against the target.
On a hit, you deal 3d8 acid damage plus 1d6 [[persistent|Persistent Damage]] acid damage.
On a critical hit, double the initial damage, but not the persistent damage.
''Heightened (+2)'' The initial damage increases by 2d8, and the persistent acid damage increases by 1d6.
This flask filled with corrosive acid deals 1 acid damage and gives extra bonuses as below.
| !Type | !Level | !Price | !Persistent Acid Damage | !Acid Splash Damage | !Item bonus to attack |
| Lesser | 1 | 30 | 1d6 | 1 | None |
| Moderate | 3 | 100 | 2d6 | 2 | +1 |
| Greater | 11 | 2500 | 3d6 | 3 | +2 |
| Major | 17 | 25000 | 4d6 | 4 | +3 |
{{||SpellSummaryTable}}
You splash a glob of acid that splatters creatures and objects alike.
Make a spell attack.
If you hit, you deal 1d6 acid damage plus 1 splash acid damage. On a critical success, the target also takes 1 persistent acid damage.
If heightened, the damage increases as follows.
| !Level | !Acid Damage | !Splash Damage | !Persistent Damage |
| 1 | 1d6 | 1 | 1 |
| 3 | 1d6+your spellcasting ability modifier | 1 | 2 |
| 5 | 2d6+your spellcasting ability modifier | 2 | 3 |
| 7 | 3d6+your spellcasting ability modifier | 3 | 4 |
| 9 | 4d6+your spellcasting ability modifier | 4 | 5 |
{{||SpellSummaryTable}}
You evoke a storm of acid rain that pelts the area for the spell’s duration.
A creature that begins its turn in the area takes 3d8 <<tag Acid>>damage (basic [[Reflex]] save).
''Heightened (+2)'' The damage increases by 1d8.
{{||SpellSummaryTable}}
You create a shell of acid around yourself that immediately bursts outward, dealing 2d6 <<tag Acid>> damage to each creature in the area //with a basic [[Reflex]] save//.
''Heightened (+1)'' The damage increases by 2d6.
A small amount of poison, taken at nonlethal doses, can help the body build up a resistance against a more deadly dosage.
Reroll the triggering check and use the second result.
Once you use Acquired Tolerance, you can continue to use it against the same type of poison that day, but you can’t use it against a different type of poison until after you make your next daily preparations. For instance, if you used the reaction on a save against giant scorpion venom, you could use it again against giant scorpion venom even if it came from a different source, but you couldn’t use it against nettleweed residue, lich dust, or another poison.
You become an expert in [[Acrobatics]].
At 7th level, you become a master in Acrobatics, and at 15th level, you become legendary in Acrobatics.
Whenever you critically succeed at an Acrobatics check to [[Tumble Through]] an enemy’s space, you don’t treat the enemy’s space as difficult terrain.
<<archetypefeatlist "4 6 7 8 10" "Acrobat">>
You’re an incredible acrobat, evoking wonder and enrapturing audiences with your prowess. It’s almost a performance!
You can roll an [[Acrobatics]] check instead of a Performance check when using the [[Perform]] action.
''Key Ability'' [[Dexterity]].
Acrobatics measures your ability to perform tasks requiring coordination and grace.
When you use the [[Escape]] basic action, you can use your Acrobatics modifier instead of your unarmed attack modifier.
{{||SkillActionList}}
{{||SkillFeatList}}
{{||SkillRitualList}}
Actions represent the basic things a character can do during their turn.
By default, you can take 3 actions each turn.
<$list filter="[all[current]tag[Incapacitation]tag[Spell]]">
<p style="border: 1px solid black; padding:2px; background-color: tomato">''Incapacitation effect: Against all targets of more than twice the spell level, use the result one worse (for you) than the roll indicates.''</p>
</$list>
<$list filter="[all[current]tag[Incapacitation]!tag[Spell]]">
<p style="border: 1px solid black; padding:2px; background-color: tomato">''Incapacitation effect: Against all targets of higher level than the effect, use the result one worse (for you) than the roll indicates.''</p>
</$list>
|!Critical Success|{{!!a-crit}}|
|!Success|{{!!a-hit}}|
|!Failure|{{!!a-fail}}|
|!Critical Failure|{{!!a-fumble}}|
<table>
<tr><th>Actions</th><td>
<$list filter="[all[current]tag[Reaction]]">Reaction</$list>
<$list filter="[all[current]tag[Free]]">Free</$list>
<$list filter="[all[current]has[a-time]]">Long</$list>
{{!!a-actions}}</td></tr>
<tr><th>Time</th><td>{{!!a-time}}</td></tr>
<tr><th>Free Hands</th><td>{{!!a-hands}}</td></tr>
<tr><th>Skill</th><td><$list filter="[all[current]list[!!a-skill]]"><$link to=<<currentTiddler>>/> </$list></td></tr>
<tr><th>Defense</th><td><$list filter="[all[current]list[!!a-defense]]"><$link to=<<currentTiddler>>/> </$list></td></tr>
<tr><th>Tool</th><td>{{!!a-tool}}</td></tr>
<tr><th>Sub-actions</th><td>{{!!a-subactions}}</td></tr>
</table>
''Trigger'' The target of //your// [[Foresight]] //spell// defends against a hostile creature or other danger.
If the hostile creature or danger forces the target to roll dice (a saving throw, for example), the target rolls twice and uses the higher result, and this spell gains the <<tag Fortune>>trait.
If the hostile creature or danger is rolling against the target (an attack roll or skill check, for example), that hostile creature or danger rolls twice and uses the lower result, and this spell gains the <<tag Misfortune>>trait.
When you [[Rage]], your sense of smell improves.
You gain imprecise scent with a range of 30 feet.
When you are raging, your visual senses improve, granting you [[Darkvision]].
Mined from rocks that fell from the heavens, adamantine is one of the hardest metals known. It has a shiny, black appearance, and it is prized for its amazing resiliency and ability to hold an incredibly sharp edge.
| !Unit | !Price | !Bulk |
| Chunk | 5000 | L |
| Ingot | 50000 | 1 |
| !Grade | !Level | !Price |
| Standard | 8 | 3500/Bulk |
| High | 16 | 6000/Bulk |
| !Item | !Grade | !Hardness | !HP | !BT |
| Thin | Standard | 10 | 40 | 20 |
| Thin | High | 13 | 52 | 26 |
| Item | Standard | 14 | 56 | 28 |
| Item | High | 17 | 68 | 34 |
| Structure | Standard | 28 | 112 | 56 |
| Structure | High | 34 | 136 | 68 |
Adamantine armor has a shiny, black appearance and is amazingly durable.
| !Type | !Level | !Price | !Value of Adamantine needed | !Hardness | !HP | !BT | !Magic Level Limit |
| Standard-Grade | 12 | 16000 + 1600/Bulk | 2000 + 200/Bulk | 7 | 28 | 14 | 15 |
| High-Grade | 19 | 320000 + 32000/Bulk | 160000 + 16000/Bulk | 10 | 40 | 20 | Any |
| !Type | !Grade | !Level | !Price | !Bulk | !Adamantine Value | !Hardness | !HP | !BT |
| Buckler | Standard | 8 | 4000 | L | 500 | 8 | 32 | 16 |
| Shield | Standard | 8 | 4400 | 1 | 550 | 10 | 40 | 20 |
| Buckler | High | 16 | 80000 | L | 40000 | 11 | 44 | 22 |
| Shield | High | 16 | 88000 | 1 | 44000 | 13 | 52 | 26 |
When you focus your will into your limbs, your blows are as unyielding as the hardest of metals.
Your unarmed attacks are treated as [[Adamantine]].
Adamantine weapons have a shiny black appearance and cut through lesser items with ease.
They treat any object they hit as if it had half as much Hardness as usual, unless the object’s Hardness is greater than that of the adamantine weapon.
| !Type | !Level | !Price | !Value of Adamantine needed |
| Standard-Grade | 11 | 14000 + 1400/Bulk | 1750 + 175/Bulk |
| High-Grade | 17 | 135000 + 13500/Bulk | 67500 + 6750/Bulk |
{{||SpellSummaryTable}}
You make subtle changes to yourself to adapt to the situation. Choose one of the following options that applies to you.
* If you are in water, you gain a swim Speed equal to half your Speed.
* If you are in water, you become able to breathe water.
* If it’s too dark for you to see, you gain [[Darkvision]].
* If you are in an environment of severe heat or severe cold, you are protected from the effects of severe heat or severe cold, and the spell lasts 10 minutes.
//You must have spellcasting as a class feature to take this.//
Through study of multiple magical traditions, you’ve altered a spell to suit your spellcasting style.
Choose one cantrip from a magical tradition other than your own. If you have a spell repertoire or a spellbook, replace one of the cantrips you know or have in your spellbook with the chosen spell. If you prepare spells without a spellbook (if you’re a cleric or druid, for example), one of your cantrips must always be the chosen spell, and you prepare the rest normally. You can cast this cantrip as a spell of your class’s tradition.
If you swap or retrain this cantrip later, you can choose its replacement from the same alternate tradition or a different one.
{{||SpellSummaryTable}}
''Trigger'' You take <<tag Acid>>, <<tag Cold>>, <<tag Fire>>, <<tag Electricity>>, or <<tag Sonic>> damage.
You shift yourself to adapt to the mystical wavelengths of the energy damage, protecting yourself from further harm.
You gain resistance 5 to the triggering energy type; you gain this resistance after you take the triggering damage, so it applies only to future damage you take during the duration.
''Heightened (+2)'' Increase the resistance by 5.
//You must be able to cast 3rd-level spells to take this.//
You’ve continued adapting your magic to blend your class’s tradition with your adapted tradition.
Choose a cantrip or 1st‑level spell from the same magical tradition as your cantrip from [[Adapted Cantrip]]. You gain that spell, adding it to your spell repertoire, spellbook, or prepared spells just like the cantrip from Adapted __Cantrip__.
You can cast this spell as a spell of your class’s magical tradition.
If you choose a 1st-level spell, you don’t gain access to the heightened versions of that spell, meaning you can’t prepare them if you prepare spells and you can’t learn them or select the spell as a signature spell if you have a spell repertoire.
Your mask familiar adapts quickly to material form, allowing it to gain more [[familiar|Familiar Abilities]] and [[Master Abilities]].
You select four master and familiar abilities each day instead of two.
Another animal joins you in your travels.
It is a young [[Animal Companion]] that has the <<tag Minion>> trait.
See [[Beastmaster Dedication]] for rules on how having multiple animal companions works.
''Special'' You can select this feat more than once, gaining an additional animal companion each time, to a maximum of four total companions (including the one you gained from Beastmaster Dedication and possibly one you gained from sources other than the beastmaster archetype).
''Prerequisites'' Trained in [[Lore]].
Your knowledge has expanded to encompass a new field.
Choose an additional Lore skill subcategory. You become trained in it.
At 3rd, 7th, and 15th levels, you gain an additional skill increase you can apply only to the chosen Lore subcategory.
You can select this feat more than once. Each time you must select a new subcategory of Lore and you gain the additional skill increases to that subcategory for the listed levels.
''Trigger'' You succeed or critically succeed at a check to [[Recall Knowledge]] on your hunted prey.
You scan the battlefield quickly, remembering critical details about multiple opponents you face.
You immediately attempt a check to [[Recall Knowledge]] about a different creature you can perceive.
Choose an additional shadowdancer focus spell you haven’t already selected from [[Shadow Magic]].
Increase the number of Focus Points in your pool by 1.
Feats with the additive trait allow you to spend actions to add special substances to bombs or elixirs.
The additive trait is always followed by a level, such as additive 2. An additive adds its level to the level of the alchemical item you’re modifying; the result is the new level of the mixture. The mixture’s item level must be no higher than your advanced alchemy level.
You can add only one additive to a single alchemical item, and attempting to add another spoils the item.
You can typically use actions with the additive trait only when you’re creating an infused alchemical item, and some can be used only with the [[Quick Alchemy]] action.
You descend from the rare psychic vampires known as vetalaranas. Your forebear gained sustenance from the mental and emotional energy of living creatures, which manifests in you as powerful resistance to such effects.
You gain a +1 circumstance bonus to [[Will]] saves against effects with the <<tag Emotion>> trait, and when you roll a success on a saving throw against such an effect, you get a critical success instead.
''Requirements'' You have [[Healer’s Tools]].
You perform first aid on an adjacent creature that is [[Dying]] or bleeding //(has [[Persistent Damage]] with type "bleed")//.
If a creature is both dying and bleeding, choose which ailment you’re trying to treat before you roll. You can Administer First Aid again to attempt to remedy the other effect.
* ''Stabilize'': Attempt a [[Medicine]] check on a creature that has 0 Hit Points and the dying condition. The DC is equal to 5 + that creature’s recovery roll DC (typically 15 + its dying value).
* ''Stop Bleeding'' Attempt a Medicine check on a creature that is taking persistent bleed damage, giving them a chance to make another flat check to remove the persistent damage. The DC is usually the DC of the effect that caused the bleed.
You’re fully immersed in another ancestry’s culture and traditions, whether born into them, earned through rite of passage, or bonded through a deep friendship or romance.
Choose a common [[Ancestry]].
You can select ancestry feats from the ancestry you chose, in addition to your character’s own ancestry, as long as the ancestry feats don’t require any physiological feature that you lack, as determined by the GM.
In the heat of battle, you are capable of amazing feats of strength.
While you are raging, increase your encumbered and maximum [[Bulk]] limits by 2; you also gain a +1 status bonus to [[Athletics]] checks to lift heavy objects, [[Escape]], and [[Force Open]].
{{LOCGFeat}}
You’ve fiddled with knots, locks, and blacksmith’s puzzles since you were a child to give your hands something to do.
You gain the trained proficiency rank in [[Thievery]] (or another skill of your choice, if you’re already trained in Thievery).
If you roll a success on a Thievery check to [[Pick a Lock]], you get a critical success instead.
During your [[daily preparations|Rest]], after producing new infused reagents, you can spend batches of those infused reagents to create infused alchemical items.
You don’t need to attempt a [[Crafting]] check to do this, and you ignore both the number of days typically required to create the items and any alchemical reagent requirements.
Your advanced alchemy level is equal to your level //if you are an [[Alchemist]]. If you have [[Alchemist Dedication]], it is equal to 1 unless you have the feats [[Expert Alchemy]] and/or [[Master Alchemy]] to increase it.//
For each batch of infused reagents you spend, choose an alchemical item of your advanced alchemy level or lower that’s in your formula book, and make a batch of two of that item.
These items have the <<tag Infused>> trait and remain potent for 24 hours or until your next daily preparations, whichever comes first.
You gain one wizard feat.
For the purpose of meeting its prerequisites, your wizard level is equal to half your character level.
<<levelfeatlist "1 2 4 6 8 10" "[tag[Class]tag[Wizard]]">>
You gain one sorcerer feat.
For the purpose of meeting its prerequisites, your sorcerer level is equal to half your character level.
<<levelfeatlist "1 2 4 6 8 10" "[tag[Class]tag[Sorcerer]]">>
''Prerequisites'' bloodline spell
You have studied your bloodline to learn the secrets of its magic.
You gain the advanced bloodline spell associated with your bloodline.
Increase the number of Focus Points in your focus pool by 1.
Through constant practice and the crucible of experience, you increase your skill with advanced bows.
You gain proficiency with all advanced bows as if they were martial weapons in the bow weapon group.
You gain one alchemist feat. For the purpose of meeting its prerequisites, your alchemist level is equal to half your character level.
You can select this feat more than once. Each time you select it, you gain another alchemist feat.
<<levelfeatlist "1 2 4 6 8 10" "[tag[Feat]tag[Class]tag[Alchemist]]">>
Through your conviction, you have glimpsed the deeper secrets of your deity’s domain.
You gain an advanced domain spell from the domain you chose with [[Deity's Domain]].
You can cast that spell as a devotion spell.
Increase the number of Focus Points in your focus pool by 1.
You gain one Champion feat.
For the purpose of meeting its prerequisites, your Champion level is equal to half your character level.
<<levelfeatlist "1 2 4 6 8 10" "[tag[Class]tag[Champion]]">>
You gain one Cleric feat.
For the purpose of meeting its prerequisites, your Cleric level is equal to half your character level.
<<levelfeatlist "1 2 4 6 8 10" "[tag[Class]tag[Cleric]]">>
Your studies or prayers have unlocked deeper secrets of your deity’s domain.
You gain an advanced domain spell from one of your [[Domain]]s.
Increase the number of Focus Points in your focus pool by 1.
''Special'' You can select this feat multiple times. Each time, you must select a different advanced domain spell from a domain for which you have an initial domain spell.
You use your medical training to ameliorate sickness or assuage fears.
When you use [[Medicine]] to [[Administer First Aid]], instead of Stabilizing a character or Stopping Bleeding, you can reduce an ally’s [[Frightened]] or [[Sickened]] condition by 2, or remove either of those conditions entirely on a critical success.
You can remove only one condition at a time.
The DC for the Medicine check is usually the DC of the effect that caused the condition.
You gain one barbarian feat. For the purpose of meeting its prerequisites, your barbarian level is equal to half your character level.
You can select this feat more than once. Each time you select it, you gain another barbarian feat.
<<levelfeatlist "1 2 4 6 8 10" "[tag[Feat]tag[Class]tag[Barbarian]]">>
Over the course of adventuring, your adaptability has let you pick up numerous useful abilities.
You gain a general feat of 7th level or lower. You must meet the feat’s prerequisites.
''Special'' You can select this feat multiple times, choosing a different feat each time.
You gain one ranger feat.
For the purpose of meeting its prerequisites, your ranger level is equal to half your character level.
<<levelfeatlist "1 2 4 6 8 10" "[tag[Class]tag[Ranger]]">>
You gain one monk feat.
For the purpose of meeting its prerequisites, your monk level is equal to half your character level.
<<levelfeatlist "1 2 4 6 8 10" "[tag[Class]tag[Monk]]">>
You gain one Fighter feat.
For the purpose of meeting its prerequisites, your Fighter level is equal to half your character level.
<<levelfeatlist "1 2 4 6 8 10" "[tag[Class]tag[Fighter]]">>
You gain one bard feat.
For the purpose of meeting its prerequisites, your bard level is equal to half your character level.
<<levelfeatlist "1 2 4 6 8 10" "[tag[Class]tag[Bard]]">>
{{LOCGFeat}}
You gain the greater order benefit for the Hellknight order to which you belong.
//This is one of the following. See the Character Guide for which is associated with which order.//
* [[Sturdy Bindings]]
* [[Devil Allies]]
* [[Blessing of the Five]]
* [[Reveal Beasts]]
* [[Spiritual Disruption]]
* [[Silence Heresy]]
* [[Seek Injustice]]
{{LOWGFeat}}
Your Red Mantis magical training has improved.
Add two 2nd-level spells to your Red Mantis assassin spellbook.
You gain a 2nd-level spell slot that you can use to prepare a spell from your Red Mantis assassin spellbook.
At 8th level, add two 3rd-level spells to your Red Mantis assassin spellbook. You gain a 3rd-level spell slot that you can use to prepare a spell from your Red Mantis assassin spellbook.
At 10th level, add two 4th-level spells to your Red Mantis assassin spellbook. You gain a 4th level spell slot that you can use to prepare a spell from your Red Mantis assassin spellbook.
You must have an initial revelation spell in order to take this feat.
You learn an advanced revelation spell associated with your mystery.
Increase the number of Focus Points in your focus pool by 1.
''Prerequisites'' You must specialise in an arcane school.
You gain access to a powerful new school spell depending on your arcane school.
| !Specialized School | !Spell Gained |
| Abjuration | [[Energy Absorption]] |
| Conjuration | [[Dimensional Steps]] |
| Divination | [[Vigilant Eye]] |
| Enchantment | [[Dread Aura]] |
| Evocation | [[Elemental Tempest]] |
| Illusion | [[Invisibility Cloak]] |
| Necromancer | [[Life Siphon]] |
| Transmutation | [[Shifting Form]] |
Increase the number of Focus Points in your focus pool by 1.
Your ocular processors are augmented with advanced targeting systems, which allow you to more easily pinpoint your enemy and read their movements.
You can cast [[True Strike]] once per day as a 1st-level arcane innate spell.
You gain one rogue feat.
For the purpose of meeting its prerequisites, your rogue level is equal to half your character level.
<<levelfeatlist "1 2 4 6 8 10" "[tag[Class]tag[Rogue]]">>
You’ve studied the art of wielding an advanced weapon.
Choose a weapon group. You gain proficiency with all advanced weapons in that group as if they were martial weapons of their weapon group.
You gain one Druid feat.
For the purpose of meeting its prerequisites, your Druid level is equal to half your character level.
<<levelfeatlist "1 2 4 6 8 10" "[tag[Class]tag[Druid]]">>
!! Advancement Schedule
| !Feature | !Frequency | !Levels |
| Class features | As per class | As per class |
| Ancestry Feat | 1st, then every 4 | 1, 5, 9, 13, 17 |
| Class Feat | 1st, 2nd, then every 2 | 1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 |
| General Feats | 3rd, then every 4 | 3, 7, 11, 15, 19 |
| Skill Feats | 2nd, then every 2 | 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 |
| Skill Increase (Expert) | 3rd, 5th | |
| Skill Increase (Master) | 7th, 9th, 11th, 13th | |
| Skill Increase (Legendary) | 15th, 17th, 19th | |
| Ability boost | 5th, then every 5 | 5, 10, 15, 20 |
!! Incremental Advancement Table
| !Level | !Advancement |
| 1 | Basic class features, class [[Splat]], Ancestry Feat, Class Feat |
| 2 | Class Feat, Skill Feat |
| 3 | General Feat, Skill Increase |
| 4 | Class Feat, Skill Feat |
| 5 | Ability boost, Ancestry Feat, Skill Increase |
| 6 | Class Feat, Skill Feat |
| 7 | General Feat, Skill Increase |
| 8 | Class Feat, Skill Feat |
| 9 | Ancestry Feat, Skill Increase |
| 10 | Ability boosts, Class Feat, Skill Feat |
| 11 | General Feat, Skill Increase |
| 12 | Class Feat, Skill Feat |
| 13 | Ancestry Feat, Skill Increase |
| 14 | Class Feat, Skill Feat |
| 15 | Ability boost, General Feat, Skill Increase |
| 16 | Class Feat, Skill Feat |
| 17 | Ancestry Feat, Skill Increase |
| 18 | Class Feat, Skill Feat |
| 19 | General Feat, Skill Increase |
| 20 | Ability boost, Class Feat, Skill Feat |
!! In-place Advancement Table
| !Level | !Ancestry Feats | !Class Feats | !General Feats | !Skill Feats | !Ability Boosts | !Skill increases |
| 1 | !1 | !1 | 0 | 0 | 0 | Starting |
| 2 | 1 | !2 | 0 | !1 | 0 | Starting |
| 3 | 1 | 2 | !1 | 1 | 0 | !1 Expert |
| 4 | 1 | !3 | 1 | !2 | 0 | 1 Expert |
| 5 | !2 | 3 | 1 | 2 | !4 | !2 Expert |
| 6 | 2 | !4 | 1 | !3 | 4 | 2 Expert |
| 7 | 2 | 4 | !2 | 3 | 4 | !2 Expert, 1 Master |
| 8 | 2 | !5 | 2 | !4 | 4 | 2 Expert, 1 Master |
| 9 | !3 | 5 | 2 | 4 | 4 | !2 Expert, 2 Master |
| 10 | 3 | !6 | 2 | !5 | !8 | 2 Expert, 2 Master |
| 11 | 3 | 6 | !3 | 5 | 8 | !2 Expert, 3 Master |
| 12 | 3 | !7 | 3 | !6 | 8 | 2 Expert, 3 Master |
| 13 | !4 | 7 | 3 | 6 | 8 | !2 Expert, 4 Master |
| 14 | 4 | !8 | 3 | !7 | 8 | 2 Expert, 4 Master |
| 15 | 4 | 8 | !4 | 7 | !12 | !2 Expert, 4 Master, 1 Legendary |
| 16 | 4 | !9 | 4 | !8 | 12 | 2 Expert, 4 Master, 1 Legendary |
| 17 | !5 | 9 | 4 | 8 | 12 | !2 Expert, 4 Master, 2 Legendary |
| 18 | 5 | !10 | 4 | !9 | 12 | 2 Expert, 4 Master, 2 Legendary |
| 19 | 5 | 10 | !5 | 9 | 12 | !2 Expert, 4 Master, 3 Legendary |
| 20 | 5 | !11 | 5 | !10 | !16 | 2 Expert, 4 Master, 3 Legendary |
When an enemy’s movement is compromised, you deliver a more deadly blow.
Make a [[Strike]] against a creature that is [[Grabbed]], [[Prone]], or [[Restrained]].
You gain a circumstance bonus to damage on this Strike equal to the number of weapon damage dice, or that number + 2 if you’re wielding the weapon in two hands.
The Strike gains the following failure effect: You deal damage to the target equal to the number of weapon damage dice, or that number + 2 if you’re wielding the weapon in two hands. This damage has the same damage type as the weapon.
{{LOCGFeat}}
''Requirements'' You are wielding a shield.
Inspired by the tale of Arnisant, you transform your shield into a magic ward.
Until the beginning of your next turn, you gain the following reaction:
Absorb into the Aegis {{ReactionIcon}} <<tag Manipulate>> ''Trigger'' An enemy casts a spell that targets you or an ally within 15 feet of you; ''Effect'' You interpose your shield’s ward against the spell. Attempt a [[Counteract]] check, using your [[Religion]] modifier as your counteract modifier. On a success, the spell is counteracted and your shield takes damage equal to four times the spell level as it absorbs and disperses the magical energy. On a failure, the shield takes damage equal to twice the spell’s level.
These monitors are the self-styled defenders of reality.
Traditional aeons have dualistic natures and forms, and they hold a dichotomy of interests, though axiomites and inevitables do not.
Aeons other than axiomites and inevitables communicate via a strange telepathic hodgepodge of sensory sending called envisioning.
Over millennia, these mysterious, intricately cut gemstones have been hoarded by mystics and fanatics hoping to discover their secrets. Despite their myriad forms and functions, these stones are purportedly all fragments of crystal tools used by otherworldly entities to construct the universe in primeval times.
When you invest one of these precisely shaped crystals, the stone orbits your head instead of being worn on your body.
You can stow an aeon stone with an [[Interact]] action, and an orbiting stone can be snatched out of the air with a successful [[Disarm]] action against you.
A stowed or removed stone remains invested, but its effects are suppressed until you return it to orbit your head again.
There are various types of aeon stones, each with a different shape, color, and magical effect. Each aeon stone also gains a resonant power when slotted into a special magical item called a [[Wayfinder]].
| !Type | !Level | !Price | !Effect | !Resonant |
|Clear Spindle | 7 | 3250 |After a week, don't need to eat or drink |[[Air Bubble]] 1/day |
|Dull Gray | 1 | 90 |Orbits your head |None |
|Gold Nodule | 6 | 2300 |Know a languge while invested |[[Comprehend Language]] 1/day |
|Lavender and Green Ellipsoid | 19 | 300000 |Counters spells cast on you, then might burn out |[[Read Aura]] at will, [[Detect Magic]] at will |
|Orange Prism | 16 | 97500 |{{OneAction}} Increase a spell's counteract level by 1 |+2 item to tradition's skill |
|Pale Lavender Ellipsoid | 13 | 22000 |Counters spells cast on you, then might burn out |[[Read Aura]] at will |
|Pink Rhomboid | 12 | 19000 |+15 temp HP |[[Stabilize]] at will |
|Tourmaline Sphere | 7 | 3500 |Saves your life then burns out |[[Heal]] 1/day |
* ''Clear Spindle'': You don’t need to eat or drink while this aeon stone is invested by you. This aeon stone doesn’t function until it has been worn continuously for a week and invested each day therein. If it’s invested by someone else, this interval starts over. The resonant power allows you to cast [[Air Bubble]] as a primal innate spell once per day.
* ''Dull Gray'': A dull gray aeon stone has lost its special magical properties, sometimes as a result of overusing a tourmaline sphere or pale lavender ellipsoid aeon stone. It still orbits your head like any other aeon stone and can thus serve as a stylish, hands-free option for various spells that target an object, like [[Continual Flame]]. Dull gray aeon stones have no resonant power.
* ''Gold Nodule'': When a gold nodule aeon stone is created, its creator chooses a language they know to store within the crystal. When you invest the stone, you gain the ability to understand, speak, and write that language. The resonant power allows you to cast [[Comprehend Language]] as an occult innate spell once per day.
* ''Lavender and Green Ellipsoid'': This functions as a pale lavender ellipsoid aeon stone, but it casts an 8th-level [[Dispel Magic]] spell with a counteract modifier of +31. The resonant power allows you to cast [[Detect Magic]] and [[Read Aura]] as arcane innate spells at will.
* ''Orange Prism'': An orange prism aeon stone must be activated to provide a benefit. The resonant power grants you a +2 item bonus to [[Arcana]], [[Nature]], [[Occultism]], or [[Religion]] checks—whichever corresponds to the tradition of the last spell you enhanced with this aeon stone. ''Activate'' {{OneAction}} envision; ''Effect'' If your next action is to [[Cast a Spell]], that spell’s level is 1 higher (maximum 10th level) for the purposes of counteracting and being counteracted.
* ''Pale Lavender Ellipsoid'': This aeon stone must be activated to provide a benefit. The resonant power allows you to cast the [[Read Aura]] cantrip as an arcane innate spell. ''Activate'' {{ReactionIcon}} envision; ''Frequency'' once per day; ''Trigger'' A spell targets you; ''Effect'' The stone casts a 6th-level [[Dispel Magic]] spell in an attempt to [[Counteract]] the triggering spell, with a counteract modifier of +22. This can be used only on spells that specifically target you—not area spells that don’t have targets. If it succeeds, it counteracts the spell for all targets if other creatures were targeted in addition to you. Each time you activate this aeon stone, attempt a DC 5 flat check. On a failure, the stone permanently turns into a dull gray aeon stone.
* ''Pink Rhomboid'': When you invest this stone, you gain 15 temporary Hit Points. If the stone’s effects are suppressed, you lose any of the temporary Hit Points remaining until it returns. The temporary Hit Points refresh during your daily preparations; they do not refresh if you re-invest the stone, or invest another pink rhomboid aeon stone, before then. The resonant power allows you to cast the [[Stabilize]] cantrip as a divine innate spell.
* ''Tourmaline sphere'': When you would die from the dying condition (typically at dying 4), this aeon stone automatically activates and reduces your dying value to 1 less than would normally kill you (typically to dying 3). The stone then permanently turns into a dull gray aeon stone. You can benefit from this ability only once per day, even if you have multiple such stones. The resonant power allows you to cast 1st-level [[Heal]] as a divine innate spell once per day.
{{||SpellSummaryTable}}
You harness your mastery of primal forces to reshape your body into a Medium flying animal battle form.
When you cast this spell, choose bat, bird, pterosaur, or wasp. You can decide the specific type of animal (such as an owl or eagle for bird), but this has no effect on the form’s Size or statistics.
While in this form, you gain the [[Animal]] trait.
You gain [[Low-Light Vision]].
You can Dismiss the spell.
You gain the following statistics and abilities regardless of which battle form you choose, depending on the level to which the spell was Heightened:
| !Level | !AC | !Size | !Temp HP | !Attack Modifier | !Damage Bonus | !Acrobatics | !Fly Speed Bonus |
| 4 | 18+your level | Medium | 5 | +16 | +5 | +16 | 0 |
| 5 | 18+your level | Large | 10 | +18 | +8 | +20 | +10' |
| 6 | 21+your level | Huge | 15 | +21 | +4 | +23 | +15' |
You ignore your armor's check penalty and Speed reduction when in your aerial form.
The unarmed melee attacks specific to the battle form you choose are the only attacks you
can use. You’re trained with them. These attacks are [[Dexterity]] based (for the purpose of the clumsy condition, for example). If your attack modifier for Dexterity-based unarmed attacks is higher, you can use it instead.
If your own [[Acrobatics]] modifier is higher than the one for your form, you can use it instead.
The bonus given to your Fly speed is a status bonus.
If you cast the spell at level 6, you additionally gain 10' reach and damage dice are doubled, including for [[Persistent Damage]].
If you are made larger by casting the spell, you must have enough room to expand into or the spell is lost.
You also gain specific abilities based on the form you choose:
* ''Bat'' Speed 20 feet, fly Speed 30 feet; precise echolocation 40 feet; Melee [one-action] fangs, Damage 2d8 piercing; Melee [one-action] wing ([[Agile]]), Damage 2d6 bludgeoning.
* ''Bird'' Speed 10 feet, fly Speed 50 feet; Melee [one-action] beak, Damage 2d8 piercing; Melee [one-action] talon (agile), Damage 1d10 slashing.
* ''Pterosaur'' Speed 10 feet, fly Speed 40 feet; imprecise scent 30 feet; Melee [one-action] beak, Damage 3d6 piercing.
* ''Wasp'' Speed 20 feet, fly Speed 40 feet; Melee [one-action] stinger, Damage 1d8 piercing plus 1d6 persistent poison.
{{BattleFormRestrictions}}
You move with grace in flight and can perform amazing aerial stunts.
You gain a +2 circumstance bonus to [[Acrobatics]] checks to [[Maneuver in Flight]] and can combine two maneuvers into a single action, such as reversing direction while making a steep ascent or descent or hovering in gale-force winds.
The DC of the Acrobatics check is equal to the DC of the most difficult maneuver + 5.
If you’re legendary in Acrobatics, you can combine three such maneuvers into a single action; the DC of the Acrobatics check is equal to the DC of the most difficult maneuver + 10.
Regardless of the combination, these maneuvers rarely allow you to move farther than your fly Speed.
You spend 10 minutes affixing a talisman to an item, placing the item on a stable surface and using the repair kit with both hands.
You can also use this activity to remove a talisman.
If more than one talisman is affixed to an item, the talismans are suppressed; none of them can be activated.
Diseases and poisons are types of afflictions, as are curses and radiation. An affliction can infect a creature for a long time, progressing through different and often increasingly debilitating stages.
The level of an affliction is the level of the monster, hazard, or item causing the affliction or, in the case of a spell, is listed in the affliction entry for that spell.
When you’re first exposed to the affliction, you must attempt a saving throw against it. This first attempt to stave off the affliction is called the initial save.
An affliction usually requires a [[Fortitude]] save, but the exact save and its DC are listed after the name and type of affliction. Spells that can poison you typically use the caster’s spell DC.
On a successful initial saving throw, you are unaffected by that exposure to the affliction. You do not need to attempt further saving throws against it unless you are exposed to the affliction again.
If you fail the initial saving throw, after the affliction’s onset period elapses (if applicable), you advance to stage 1 of the affliction and are subjected to the listed effect. On a critical failure, after its onset period (if applicable), you advance to stage 2 of the affliction and are subjected to that effect instead.
Some afflictions have onset times. For these afflictions, once you fail your initial save, you don’t gain the effects for the first stage of the affliction until the onset time has elapsed. If this entry is absent, you gain the effects for the first stage (or the second stage on a critical failure) immediately upon failing the initial saving throw.
If an affliction lasts only a limited amount of time, it lists a maximum duration. Once this duration passes, the affliction ends. Otherwise, the affliction lasts until you succeed at enough saves to recover.
An affliction typically has multiple stages, each of which lists an effect followed by an interval in parentheses. When you reach a given stage of an affliction, you are subjected to the effects listed for that stage.
At the end of a stage’s listed interval, you must attempt a new saving throw.
On a success, you reduce the stage by 1; on a critical success, you reduce the stage by 2. On a failure, the stage increases by 1; on a critical failure, the stage increases by 2. You are then subjected to the effects listed for the new stage.
Afflictions with the virulent trait are harder to remove. You must succeed at two consecutive saves to reduce a virulent affliction’s stage by 1. ''These saves are made over the course of two intervals, not both at once.'' A critical success reduces a virulent affliction’s stage by only 1 instead of by 2.
If the affliction’s stage is ever reduced below stage 1, the affliction ends and you don’t need to attempt further saves unless you’re exposed to the affliction again.
If a failure or critical failure would increase the stage beyond the highest listed stage, the affliction instead repeats the effects of the highest stage.
An affliction might give you conditions with a longer or shorter duration than the affliction. For instance, if an affliction causes you to be drained but has a maximum duration of 5 minutes, you remain drained even after the affliction ends, as is normal for the drained condition. Or, you might succeed at the flat check to remove persistent damage you took from an ongoing affliction, but you would still need to attempt saves to remove the affliction itself, and failing one might give you new persistent damage.
Multiple exposures to the same [[Curse]] or [[Disease]] currently affecting you have no effect.
For a [[Poison]], however, failing the initial saving throw against a new exposure increases the stage by 1 (or by 2 if you critically fail) without affecting the maximum duration. This is true even if you’re within the poison’s onset period, though it doesn’t change the onset length.
The divine grace that flows through you grants reprieve from an affliction.
When you use [[Mercy]], you can instead attempt to [[Counteract]] a <<tag Curse>>, <<tag Disease>>, or <<tag Poison>>.
The harmonious magic of Nirvana flows through you.
You can cast [[Animal Form]] and [[Calm Emotions]] each once per day as 2nd-level divine innate spells.
You work at a pace born from longevity that enhances your thoroughness.
You can voluntarily spend twice as much time as normal on a [[Perception]] check or skill check to gain a +2 circumstance bonus to that check. You also don’t treat a natural 1 as worse than usual on these checks; you get a critical failure only if your result is 10 lower than the DC. For example, you could get these benefits if you spent 2 actions to [[Seek]], which normally takes 1 action. You can get these benefits during exploration by taking twice as long exploring as normal, or in downtime by spending twice as much downtime.
The GM might determine a situation doesn’t grant you a benefit if a delay would be directly counterproductive to your success, such as a tense negotiation with an impatient creature.
You remember more about your previous incarnations than most leshys.
During your daily preparations, you can meditate upon fragmentary memories of your past lives to gain the trained proficiency rank in one skill of your choice. This proficiency lasts until you prepare again.
Since this proficiency is temporary, you can’t use it as a prerequisite for a skill increase or a permanent character option like a feat.
''Prerequisites'' claw unarmed attack.
Your claws carry an irritant that is harmless to you but can be damaging to others.
Your claw [[Strike]]s deal an additional 1d4 persistent <<tag Poison>> damage on a critical hit.
''Trigger'' You use the [[Shield Block]] reaction, and the opponent that triggered Shield Block is adjacent to you and is your size or smaller.
You push back as you block the attack, knocking your foe away or off balance.
You use your shield to push the triggering creature, either automatically [[Shoving|Shove]] it 5 feet or causing it to become [[Flat-Footed]] until the start of your next turn.
The triggering creature chooses whether to be moved or become flat-footed. If it chooses to be
moved, you choose the direction.
If the Shove would cause it to hit a solid object, enter a square of difficult terrain, or enter another creature’s space, it must become [[Flat-Footed]] instead of being moved.
The [[Multiple Attack Penalty]] you take with this weapon on the second attack on your turn is –4 instead of –5, and –8 instead of –10 on the third and subsequent attacks in the turn.
{{||SpellSummaryTable}}
The blessings of your god make your feet faster and your movements more fluid.
You gain a +5-foot status bonus to your Speed and ignore [[Difficult Terrain]].
As part of casting agile feet, you can [[Stride]] or [[Step]]; you can instead [[Burrow]], [[Climb]], [[Fly]], or [[Swim]] if you have the appropriate Speed.
Your graceful moves with agile weapons are beyond compare.
Your multiple attack penalty with [[Agile]] weapons and agile unarmed attacks becomes –3 for your second attack and –6 for subsequent attacks (rather than –4 and –8).
{{||SpellSummaryTable}}
You send the target’s mind and body into overdrive, forcing it to become restless and hyperactive.
During the duration, the target must [[Stride]] at least once each turn or take 2d8 <<tag Mental>>damage that turn.
The duration of this effect depends on the target’s [[Will]] save.
''Heightened (+1)'' The damage increases by 2d8.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
Your target’s mind tumbles down a deep well of dread, dwelling so intently on deep-seated fears that it’s painful.
The target takes 4d6 <<tag Mental>>damage with a Will saving throw.
''Heightened (+1)'' Increase the damage by 2d6.
{{||SaveSuccessTable}}
When you terrorize your enemies, you also cause them painful mental distress.
When you successfully [[Demoralize]] a foe, that foe takes 1d4 mental damage at the start of each of its turns as long as it remains [[Frightened]] and continues to engage in combat with you.
If you have master proficiency in [[Intimidation]], the damage increases to 2d4, and if you have legendary proficiency, the damage increases to 3d4.
You try to help your ally with a task.
To use this reaction, you must first prepare to help, usually by using an action during your turn. You must explain to the GM exactly how you’re trying to help, and they determine whether you can Aid your ally.
When you use your Aid reaction, attempt a skill check or attack roll of a type decided by the GM. The typical DC is 20, but the GM might adjust this DC for particularly hard or easy tasks.
The GM can add any relevant traits to your preparatory action or to your Aid reaction depending on the situation, or even allow you to Aid checks other than skill checks and attack rolls.
{{||ActionSuccessTable}}
!! Trait
Effects with the air trait either manipulate or conjure air.
Those that manipulate air have no effect in a vacuum or in areas without air.
Creatures with this trait consist primarily of air or have a magical connection to that element.
{{||SpellSummaryTable}}
''Trigger'' A creature within range enters an environment where it can’t breathe.
A bubble of pure air appears around the target’s head, allowing it to breathe normally. The effect ends as soon as the target returns to an environment where it can breathe normally.
{{||SpellSummaryTable}}
The target can walk on air as if it were solid ground.
It can ascend and descend in this way at a maximum of a 45-degree angle.
''Frequency'' once per day
''Trigger'' A creature targets you with an attack or other targeted effect, and you can see the attacker.
You create a blanket of fog in a 5–foot burst centered on one corner of your space.
All creatures within that area are [[Concealed]], and all others are concealed to them. This concealment applies to the triggering effect, and the fog lasts for 1 minute or until dispersed by a strong wind.
After resolving the triggering effect, you [[Step]]. If an effect prevents you from Stepping, you attempt to [[Escape]] the effect and Step if you succeed.
You ward an area to alert you when creatures enter without your permission.
When you cast alarm, select a password.
Whenever a Small or larger corporeal creature enters the spell’s area without speaking the password, alarm sends your choice of a mental alert (in which case the spell gains the [[Mental]] trait) or an audible alarm with the sound and volume of a hand bell (in which case the spell gains the [[Auditory]] trait).
Either option automatically awakens you, and the bell allows each creature in the area to attempt a DC 15 [[Perception]] check to wake up.
A creature aware of the alarm must succeed at a Stealth check against the spell’s DC or trigger the spell when moving into the area.
''Heightened (3rd)'' You can specify criteria for which creatures sound the alarm spell—for instance, orcs or masked people.
Your comfort in concocting items is such that you can create three at a time.
When using the [[Quick Alchemy]] action, you can spend up to three batches of infused reagents to make up to three alchemical items as described in that action. These items do not have to be the same.
__You automatically stow one of these new items as you create them.__
''Prerequisites'' Trained in [[Crafting]].
You can use the [[Craft]] activity to create [[Alchemical]] items.
When you select this feat, you immediately add the formulas for four common 1st-level alchemical items to your formula book.
This crossbow can deliver alchemically infused bolts. The strange weapon has a metal bracket
mounted on the side of the stock near the lath.
As an action, you can load a single lesser alchemical bomb into the bracket; this bomb must be one that deals energy damage (such as an [[Acid Flask]], [[Alchemist’s Fire]], [[Bottled Lightning]], [[Frost Vial]], or [[Thunderstone]]).
The next three attacks made with the crossbow deal 1d6 damage of the bomb’s damage type in addition to the crossbow’s normal damage.
If the second and third attacks are not all made within 1 minute of the first attack, the bomb’s energy is wasted.
These attacks never deal splash damage or other special effects of the bomb and are not modified by any abilities that add to or modify a bomb’s effect.
The addition of the bracket serves to unbalance the weapon, reducing its range to 30 feet.
It otherwise functions as a crossbow (when determining damage, reload, and so on). Creatures use their crossbow proficiency when using the alchemical crossbow.
The alchemical crossbow costs 25 gp.
You’ve devoted extra time in the lab to improve your knowledge of alchemy.
You learn the formulas for two alchemical items each time you level up instead of one; these must still be elixirs or tools.
The number of versatile vials you can create each day increases by 1 if you’re an expert in [[Crafting]], 2 if you’re a master, or 3 if you’re legendary.
Constant practice has increased the effectiveness of your concoctions.
Your proficiency rank for your alchemist class DC increases to expert.
You have used alchemy to create life, a simple creature formed from alchemical materials,
reagents, and a bit of your own blood.
This alchemical familiar appears to be a small creature of flesh and blood, though it might have some unusual or distinguishing aspects depending on your creative process.
Like other familiars, your alchemical familiar assists you in your laboratory and on adventures.
The [[Familiar]] uses your [[Intelligence]] modifier to determine its [[Perception]], [[Acrobatics]], and [[Stealth]] modifiers.
Your alchemical concoctions are incredibly effective.
Your proficiency rank for your alchemist class DC increases to master.
''Prerequisites'' Trained in [[Crafting]].
You can identify alchemical items quickly.
When using the [[Crafting]] skill to [[Identify Alchemy]] on an alchemical item you hold, you can do so as a single action, which has the <<tag Concentrate>>and <<tag Manipulate>>traits, instead of spending 10 minutes.
If you have the formula for the item you are attempting to identify, you gain a +2 circumstance bonus to your check, and if you roll a critical failure, you get a failure instead.
You learn formulas more easily.
You gain four common 1st-level alchemical formulas when you take this feat, and each time you gain a level, you gain a common alchemical formula of that level.
You still need [[Alchemical Crafting]] to [[Craft]] alchemical items.
''Special'' You can take this feat only at 1st level, and you can’t [[retrain|Retraining]] into or out of this feat.
Your methodology emphasizes chemical and alchemical analysis, collecting information from unusual particles and fluids found on the scene. You possess enough alchemical know-how to whip up a few tinctures to help you with your cases.
You’re trained in [[Crafting]] and gain the [[Alchemical Crafting]] skill feat.
In addition, you gain a standard formula book for free and learn the formulas for two additional common 1st‑level alchemical items, which must be elixirs or tools.
Each time you gain a level, you learn the formula for one common alchemical elixir or alchemical tool of any level of item you can create.
During your daily preparations, you can create a number of versatile vials—alchemical concoctions that can quickly be turned into elixirs and tools—equal to your Intelligence modifier. You can use the [[Quick Tincture]] action to turn one of these vials into an elixir or alchemical tool for which you know the formula.
You’ve trained to more effectively wield the weapons you find in your lab.
Your proficiency ranks for [[Simple]] weapons and alchemical bombs increase to expert.
!! Splats
<$list filter="[tag<currentTiddler>tag[Splat]]" />
!! Class Features
| !Level | !Features |
| 1 | [[Alchemical Crafting]], [[Infused Reagents]], [[Advanced Alchemy]], [[Quick Alchemy]], __[[Signature Items]]__, +2 Formulas |
| 2 | +2 Formulas |
| 3 | +2 Formulas |
| 4 | +2 Formulas |
| 5 | __[[Powerful Alchemy]]__, Splat Feature, +2 Formulas |
| 6 | +2 Formulas |
| 7 | [[Alchemical Weapon Expertise]], [[Iron Will]], [[Perpetual Infusions]], +2 Formulas |
| 8 | +2 Formulas |
| 9 | [[Alchemical Expertise]], [[Alertness]], [[Double Brew]], +2 Formulas |
| 10 | +2 Formulas |
| 11 | [[Juggernaut]], [[Perpetual Potency]], +2 Formulas |
| 12 | +2 Formulas |
| 13 | Splat Feature, __[[Medium Armor Expertise]]__, [[Weapon Specialization]], +2 Formulas |
| 14 | +2 Formulas |
| 15 | [[Alchemical Alacrity]], [[Evasion]], +2 Formulas |
| 16 | +2 Formulas |
| 17 | [[Alchemical Mastery]], [[Perpetual Perfection]], +2 Formulas |
| 18 | +2 Formulas |
| 19 | __[[Medium Armor Mastery]]__, +2 Formulas |
| 20 | +2 Formulas |
!! Class Feats
{{||ClassFeatList}}
You put your alchemical interest into practice. You become trained in alchemical bombs and [[Crafting]]; if you were already trained in [[Crafting]], you instead become trained in a skill of your choice.
You become trained in alchemist class DC.
You gain the alchemist’s [[Infused Reagents]] class feature, gaining a number of reagents each day equal to your level.
You also gain the [[Alchemical Crafting]] feat and four additional formulas for 1st-level alchemical items, as well as the ability to create free items during your daily preparations.
Your [[Advanced Alchemy]] level is 1 and doesn’t increase on its own.
<<levelfeatlist "4 6 12" "[tag[Archetype]field:feat-arch[Alchemist]]">>
Alchemist’s fire is a combination of volatile liquids that ignite when exposed to air. Alchemist’s fire deals the listed fire damage, persistent fire damage, and splash damage. Many types grant an item bonus to attack rolls.
| !Type | !Level | !Price | !Fire Damage | !Persistent Fire Damage | !Fire Splash Damage | !Item bonus to attack |
| Lesser | 1 | 30 | 1d8 | 1 | 1 | None |
| Moderate | 3 | 100 | 2d8 | 2 | 2 | +1 |
| Greater | 11 | 2500 | 3d8 | 3 | 3 | +2 |
| Major | 17 | 25000 | 4d8 | 4 | 4 | +3 |
{{LOWGFeat}}
Your Aldori duelist training teaches you martial techniques and increases your dedication to the Aldori dueling sword.
You become trained in your choice of [[Acrobatics]] or [[Athletics]] and in Dueling [[Lore]]; if you were already trained, you become an expert instead.
Whenever your proficiency rank in any weapon increases to expert or beyond, you also gain that new proficiency rank with Aldori dueling swords.
You gain access to [[Aldori dueling swords]].
<<archetypefeatlist "4 6 10" "[[Aldori Duelist]]">>
''Requirements'' You are wielding only an Aldori dueling sword and have your other hand or hands free.
You can parry attacks against you with your Aldori dueling sword.
You gain a +2 circumstance bonus to [[AC]] until the start of your next turn as long as you continue to meet the requirement.
//This is identical to the Fighter/Duelist Feat [[Dueling Parry]] except two levels higher and requiring an Aldori dueling sword.//
''Requirements'' You are benefiting from Aldori Parry.
''Trigger'' An opponent within your reach critically fails a Strike against you.
You riposte with your Aldori dueling sword when your enemy leaves an opening.
Make a melee [[Strike]] or use a [[Disarm]] action against the triggering opponent using your Aldori dueling sword.
//This is identical to the Fighter/Duelist feat [[Dueling Riposte]] except two levels lower and except for the requirement to use an Aldori dueling sword.//
You remain alert to threats around you.
Your proficiency rank for [[Perception]] increases to expert.
Although you may not even be aware, the alghollthus your ancestors once served maintain a stranglehold on the deepest, tethered parts of your mind.
You receive a +2 circumstance bonus to [[Will]] saves against <<tag Mental>> effects that would make you [[Controlled]], and if you roll a success against such an effect, you get a critical success instead.
However, you gain none of these benefits against effects originating from alghollthus and instead take a –2 circumstance penalty against mental effects from alghollthus.
''Prerequisites'' chaotic, evil, good, or lawful deity.
''Frequency'' once per round.
You bring a weapon into metaphysical concordance with your deity’s beliefs.
When you select this feat, choose <<tag Chaotic>>, <<tag Evil>>, <<tag Good>>, or <<tag Lawful>>. Your choice must match one of your deity’s alignment components. This action has the trait corresponding to the chosen alignment component.
When you use this action, you touch a weapon. For 1 round, that weapon deals an additional 1d6 damage of the chosen type to creatures of the opposed alignment. For example, if you chose good, the weapon would deal an extra 1d6 good damage to evil creatures.
If you Align an Armament again, any previously aligned armament loses its additional damage.
''Special'' You can select this feat a second time, choosing your deity’s other alignment component. When you Align an Armament, you can choose either alignment component.
''Frequency'' once per hour.
''Trigger'' You [[Cast a Spell]] that has the <<tag Monk>> trait.
The power of your ki soothes your wounds and energizes you for battle.
You regain Hit Points equal to your level plus your [[Wisdom]] modifier.
This oil fills a weapon with cosmic power of an alignment.
Each aligned oil is crafted to one alignment: <<tag Chaos>>, <<tag Evil>>, <<tag Good>>, or <<tag Law>> (such as a good-aligned oil).
A weapon anointed with this oil gains the effects of the property rune matching its alignment: [[Anarchic]] (chaos), [[Axiomatic]] (law), [[Holy]] (good), or [[Unholy]] (evil).
This lasts for 1 minute.
''Trigger'' You would take damage from a [[Strike]] or spell that doesn’t have the <<tag Death>> trait or otherwise cause instant death.
Using your occult connections and incredible powers of persuasion, you convince yourself that the triggering damage is a figment of your imagination.
The damage changes from its usual damage type to <<tag Mental>> damage, and the damaging effect gains the [[Nonlethal]] trait.
You can’t use this reaction if you are immune to mental effects or mental damage.
//NB: Since this is an Illusion effect, abilities that normally help you see through illusions will work against it.//
This monster can see in all directions simultaneously, and therefore can’t be [[Flanked]].
{{||SpellSummaryTable}}
You perform rapidly, speeding up your ally.
The ally becomes [[Quickened]] and can use the additional action to [[Strike]], [[Stride]], or [[Step]].
''Frequency'' once per day.
''Trigger'' You attempt a saving throw while adjacent to one or more allies, but you haven’t rolled yet.
In stressful circumstances, you find strength in your allies’ example.
Roll the save using an adjacent ally’s modifier for that type of saving throw instead of your own.
You use your occult lore and the power of your mind to manipulate the spiritual multiverse, resulting in any of the following effects:
* Duplicate any occult spell of 9th level or lower.
* Duplicate any non-occult spell of 7th level or lower.
* Produce any effect whose power is equivalent to any occult spell 9th level or lower, or non occult spell 7th level or lower.
* Reverse certain effects that refer to the [[Wish]] spell
At the GM’s discretion, you can try to produce greater effects, but this is dangerous and the spell may have only a partial effect.
''Occult spells that can be duplicated:''
<$list filter="[tag[Spell]tag[Occult]]" variable="spell">
<$list filter="[<spell>get[m-level]compare:number:lteq[9]]">
<$link to=<<spell>> />,
</$list>
</$list>
''Non-Occult spells that can be duplicated:''
<$list filter="[tag[Spell]!tag[Occult]]" variable="spell">
<$list filter="[<spell>get[m-level]compare:number:lteq[7]]">
<$link to=<<spell>> />,
</$list>
</$list>
''Frequency'' once per hour
''Trigger'' You take <<tag Acid>>, <<tag Electricity>>, or <<tag Sonic>> damage.
You focus on your protean forebears to change your energy resistance.
The energy resistance you gain from your ganzi heritage changes to match the triggering damage. This change occurs after the damage is dealt.
In your companion’s natural environment, it can use a [[Sneak]] action even if it’s currently observed.
Its proficiency rank in Stealth increases to expert (or master if it was already an expert from its type), and its [[Dexterity]] modifier increases by 1.
Its proficiency rank for unarmored defense increases to expert, or master if it’s nimble.
Your body is supremely flexible.
You gain a +1 circumstance bonus on checks to [[Escape]] or [[Squeeze]], and when you critically fail when Squeezing, you get a failure instead.
An amphibious creature can breathe in water and in air, even outside of its preferred environment, usually indefinitely but at least for hours.
These creatures often have a swim Speed.
Their bludgeoning and slashing unarmed Strikes don’t take the usual –2 penalty for being underwater.
Your healing energies empower attacks.
An ally that recovers Hit Points from your [[Lay on Hands]] gains a +1 status bonus to their attack rolls and deals 1 additional good damage on all their [[Strike]]s until the end of their next turn.
You break down a specific individual’s idiolect, memorizing their speech mannerisms and habits.
If you interact with someone for at least 10 minutes, when you later attempt to [[Impersonate]]
that individual, you gain a +4 circumstance bonus to your [[Deception]] checks and DCs.
Due to the intense character study required, you can’t remember more than one idiolect at a time.
You can stoke your mind into a burst of analytical prowess.
You can cast 3rd-level [[Hypercognition]] once per day as a divine innate spell.
''Prerequisites'' [[Sneak Attack]] 2d6.
''Requirements'' You must have identified a creature with [[Recall Knowledge]].
Your knowledge of a creature’s physiology and understanding of tactics helps you attack with pinpoint accuracy. You carefully study a creature that you’ve identified to scope out particularly weak points in its positioning or physical form.
The next time you deal sneak attack damage to the chosen creature with a [[Strike]] before the end of your turn, add an additional 2d6 precision damage.
At 11th and 17th levels, if your additional damage from sneak attack increases, increase the additional damage from Analyze Weakness to 3d6 at 11th level and 4d6 at 17th level.
''Usage'' etched onto a weapon without an [[Axiomatic]] rune.
''Craft Requirements'' You are chaotic.
An anarchic rune is jagged and asymmetrical, channeling chaotic energy.
A weapon with this rune deals an additional 1d6 <<tag Chaotic>> damage against <<tag Lawful>> targets.
If you are lawful, you are [[Enfeebled]] 2 while carrying or wielding this weapon.
When you critically succeed at a [[Strike]] with this weapon against a lawful creature, roll 1d6. On a 1 or 2, you deal double minimum damage; on a 3 or 4, double your damage normally; on a 5 or 6, you deal double maximum damage.
The magic in your blood is unpredictable.
When you make your daily preparations, roll 1d12 twice and consult the following list.
|1 |[[Acid Arrow]] |
|2 |[[Blur]] |
|3 |[[Hideous Laughter]] |
|4 |[[Humanoid Form]] |
|5 |[[Illusory Object]] |
|6 |[[Mirror Image]] |
|7 |[[Resist Energy]] |
|8 |[[See Invisibility]] |
|9 |[[Shatter]] |
|10 |[[Sound Burst]] |
|11 |[[Spider Climb]] |
|12 |[[Telekinetic Maneuver]] |
You can cast each of those two spells once during the following day (or one spell twice if you rolled doubles) as 2nd-level divine innate spells.
{{||SpellSummaryTable}}
You punish a creature that transgresses against your deity, drawing upon the anguish you feel upon seeing one of your deity’s anathema committed.
You can cast this spell only when a creature actively commits a unique act of anathema. For example, if creating undead were anathema to your deity, you could use anathematic reprisal on a necromancer who had just created undead in
front of you, but not on an undead creature just for existing.
You deal 4d6 mental damage to the target, but a basic Will save can reduce this damage. If it fails, it is also stupefied 1 for 1 round.
The creature is then temporarily immune for 1 minute.
''Heightened (+1)'' The damage increases by 1d6.
You can commune with ancestor spirits to assume the form of an enormous primeval strix.
You can cast 5th-level [[Aerial Form]] as a primal innate spell once per day, but you take the form of a primeval strix, using the statistics for a bird form.
{{||MysterySummary}}
You gain an additional ancestry feat at 1st level and another additional ancestry feat at 11th level. These feats can’t be ones that grant physiological effects, such as additional senses or unarmed attacks.
!!! Curse of Ancestral Meddling
''Minor Curse'' The first time you gain this effect each day, roll 1d4 the table below to determine which type of ancestor becomes predominant. This predominant ancestor guides you to use their preferred type of action. When you try to use one of the types of actions listed for the other ancestors, you must succeed at a DC 4 flat check. On a failure, you spend the action but gain no effect (though you don’t lose the spell if you were Casting a Spell).
If your action would take 1 minute or longer, it’s long enough that you can overcome the meddling, and you don’t need to attempt a flat check.
During combat or another tense, round-by-round encounter, other ancestors wrestle for control of your actions. When you roll initiative, and then at the end of each of your turns during the encounter, roll 1d4 and change your predominant ancestor appropriately. Once the encounter ends, you return to the influence of the ancestor you first rolled for the day.
''Moderate Curse'' The flat check DC to use other actions is 6, and you get the moderate curse benefit listed for your predominant ancestor.
''Major Curse'' The flat check DC is 8, and you get the major curse benefit listed for your predominant ancestor instead of the moderate curse benefit.
| !Roll | !Ancestor | !Preferred Action | !Moderate | !Major |
| 1 | Martial | [[Strike]] | Your Strikes gain +1 status to attack rolls and +2 status to damage. | Your Strikes gain +1 status to attack rolls and +6 status to damage. |
| 2 | Skillful | [[Perception]] and Skill Actions | +1 status to skill and Perception checks. | +2 status to skill and perception checks. |
| 3 | Spellcasting | [[Cast a Spell]] | Non-cantrips without a duration gain a status bonus to their damage and healing equal to the spell's level. | Non-cantrip spells without a duration gain a status bonus to their damage and healing equal to the spell's level + 3. |
| 4 | You choose which ancestor guides your actions. |<|<|<|
The magic of your bloodline mixes with that of your ancestry.
You gain your blood magic effect when you cast a non-cantrip spell you gained from a heritage or an ancestry feat, in addition to the normal circumstances that trigger your blood magic.
{{||SpellSummaryTable}}
''Trigger'' You are about to attempt a [[Will]] save.
Your ancestor protects you against those who would bend your will.
You roll the triggering save twice and use the better result.
If you’re in an encounter when you cast this spell, you immediately roll to change your predominant ancestor.
''Usage'' etched onto a weapon.
{{AoA4Rune}}
The wisdom of this weapon’s past owners flows into your mind, amplifying your own abilities with the weapon.
Your proficiency rank with this weapon is one step higher than normal, to a maximum of the highest proficiency rank you have in any weapon. For instance, if you had master proficieny with martial weapons and expert proficiency with advanced weapons, you would have master proficiency with an advanced weapon that had this rune.
In addition, while wielding the ancestral echoing weapon, you have expert proficiency in one [[Lore]] skill relevant to one or more of the weapon’s previous owners. This is typically Dwarven Lore but is ultimately determined by the GM depending on the weapon’s history.
{{||SpellSummaryTable}}
You take the form of your ancestral spirits, becoming [[Invisible]] and quasi‑corporeal.
You gain resistance 10 to all damage (except <<tag Force>> and damage from Strikes with the [[Ghost Touch]] property rune), and this resistance is doubled against non‑magical and precision damage.
You gain a fly Speed equal to your land Speed; when Flying, moving upward isn’t difficult terrain for you.
You can’t move through solid objects, but you can float through tiny gaps.
You can’t Cast Spells (but you can [[Sustain a Spell]]), activate items, or use actions that have the <<tag Attack>> or <<tag Manipulate>> trait.
''Heightened (+2)'' The resistance increases by 5.
You have extensive knowledge of your ancestors’ ancient origins.
You gain the trained proficiency rank in Alghollthu [[Lore]] and Azlanti Lore. If you roll a critical failure on an Alghollthu Lore or Azlanti Lore check to [[Recall Knowledge]], you get a failure instead.
''Prerequisites'' At least 100 years old.
Over your extensive lifespan, you’ve studied many languages.
During your [[daily preparations|Rest]], you can recede into old memories to become fluent in one common language or one other language you have access to. You know this language until you prepare again.
Since this knowledge is temporary, you can’t use it as a prerequisite for a permanent character option.
''Prerequisites'' at least 100 years old.
You have accumulated a vast array of lived knowledge over the years.
During your daily preparations, you can reflect upon your life experiences to gain the trained proficiency rank in one skill of your choice.
This proficiency lasts until you prepare again.
Since this proficiency is temporary, you can’t use it as a prerequisite for a skill increase or a permanent character option like a feat.
The magic of your ancestry and bloodline are one and the same.
Add any innate spells you have from a heritage or an ancestry feat to your spell repertoire, meaning you can cast them using your spell slots.
{{||SpellSummaryTable}}
The memories of long-dead spellcasters grant you knowledge in a specific skill.
Choose any non-Lore skill, or a Lore skill related to the ancient empire from which your bloodline sprang. You temporarily become trained in that skill and might gain other memories associated with an ancestor who was trained in that skill.
If you attempt a task or activity that lasts beyond this spell’s duration, use the lower proficiency modifier.
''Heightened (6th)'' You temporarily become an expert in the skill you choose.
Whether through instinct, study, or magic, you feel a deeper connection to your ancestry.
You gain a 1st-level [[Ancestry Feat]].
Long-lived elves have seen civilizations rise and fall, often at the hands of outside forces. As a result, they have developed a wariness of others who might seek to influence or control them.
You’ve been trained to resist such manipulation, gaining a +2 circumstance bonus to saving throws against effects that would make you [[Controlled]], such as [[Dominate]], and to [[Perception]] checks to [[Sense Motive]] when trying to determine if a creature is under the influence of such an effect.
When you roll a success on a saving throw against such an effect, you get a critical success instead.
{{||SpellSummaryTable}}
You touch a creature and force them to see and feel the ancestors surrounding you.
The target takes 1d4 <<tag Mental>> damage, with results depending on a [[Will]] save.
''Heightened (+1)'' The mental damage increases by 1d4.
{{||SaveSuccessTable}}
''Prerequisites'' A feat granting access to all weapons with an ancestry trait (such as elf or orc)
You blend monastic techniques with the ancestral fighting styles of your people.
Choose an ancestry for which you have access to all weapons with that trait.
For you, melee weapons with that ancestry trait and either the [[Agile]] or [[Finesse]] trait gain the <<tag Monk>> trait.
The following base Ancestries are available:
<table>
<tr><th>Ancestry</th><th>Str</th><th>Dex</th><th>Con</th><th>Int</th><th>Wis</th><th>Cha</th></tr>
<$list filter="[tag[Ancestry]!tag[Feat]sort[]]" variable="anc">
<tr><th><$link to=<<anc>> /></th>
<$list filter="Strength Dexterity Constitution Intelligence Wisdom Charisma">
<td>
<$list filter="[all[current]listed[anc-boosts]field:title<anc>]">+</$list>
<$list filter="[all[current]listed[anc-flaws]field:title<anc>]">-</$list>
</td>
</$list>
</tr>
</$list>
</table>
These can be (optionally) combined with the following Versatile Heritages:
<<bulletlist "[tag[Heritage]tag[Versatile]sort[]]">>
| !Base HP |{{!!anc-hp}}|
| !Size |{{!!anc-size}}|
| !Speed |{{!!anc-speed}}|
| !Boosts |<<spacedlist "[list[!!anc-boosts]]">>|
| !Flaws |<<spacedlist "[list[!!anc-flaws]]">>|
| !Languages |<<spacedlist "[list[!!anc-langs]]">>|
!!! Special Abilities
<<bulletlist "[list[!!anc-special]]">>
!!! Heritages
<table>
<$list filter="[tag<currentTiddler>tag[Heritage]sort[]]">
<tr><th><$link /></th><td>{{!!text}}</td></tr>
</$list>
</table>
<$set name="inner" value={{!!title}}>
<$macrocall $name="levelfeatlist" levels="1 5 9 13 17" filter="[tag[Feat]field:feat-anc<inner>]"/>
</$set>
You send your roots deeper into the ground, making it harder for you to stumble.
Until you move, you gain a +2 circumstance bonus to your [[Fortitude]] or [[Reflex]] DC against attempts to [[Shove]] or [[Trip]] you (or a +4 circumstance bonus if you’re a root leshy). This bonus also applies to saving throws against spells or effects that attempt to move you or knock you prone.
If an effect forces you to move, you move only half the normal distance, as some of the effort goes to tearing out the roots.
At the GM’s discretion, this ability might not work on ground that’s more resilient than stone, such as metal flooring or magically-reinforced masonry.
Your aura hampers fiends’ teleportation.
Your aura attempts to [[Counteract]] <<tag Teleportation>> spells cast by fiends within 15 feet, using the spell level and DC of your devotion spells.
Small roots sprout from your feet, steadying you as you move.
You gain the [[Steady Balance]] skill feat, even if you aren’t trained in [[Acrobatics]], and you can use the [[Anchor]] action.
Choose a class other than your own. You gain the multiclass dedication feat for that class, even though you don’t meet its level prerequisite. You must still meet its other prerequisites to gain the feat.
You gain [[Darkvision]]. Your body is dotted with phosphorescent spots that emit a guiding light and help you communicate. The spots—located primarily on your face, arms, and hands —illuminate a 10-foot radius around you with [[Dim Light]]. You can activate, deactivate, or change the arrangement of lights as an action, which has the <<tag Concentrate>> trait.
You gain [[Call on Ancient Blood]].
You can use [[Crystalline Dust]] one more time per day.
''Special'' You can take this feat more than once, gaining one more use of Crystalline Dust per day each time.
You have a keen interest in the origins of your people.
You gain the trained proficiency rank in [[Crafting]] and [[Thievery]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Android [[Lore]].
This family of celestials is native to the plane of Nirvana.
Most angels are neutral good, have [[Darkvision]], and have a weakness to <<tag Evil>> damage.
All your Strikes against a creature you have [[Marked for Death|Mark for Death]] have the <<tag Death>> trait, causing the mark to be instantly killed when reduced to 0 Hit Points.
When killed in this way, attempts to communicate with it, return it to life, turn it into an undead, or otherwise disturb its afterlife fail unless the effect’s [[Counteract]] level is higher than half your level when you killed the creature (rounded up), or originates from an artifact or a deity.
{{||SpellSummaryTable}}
You gain an angelic halo with an aura that increases allies’ healing from the heal spell.
[[Heal]] spells gain a +2 status bonus to Hit Points healed to your allies in the area.
''Heightened (+1)'' The status bonus increases by 2.
You can tap into the magic of angels that runs through your blood.
You can cast [[Humanoid Form]] and [[Remove Fear]] each once per day as 2nd-level divine innate spells.
{{||SpellSummaryTable}}
Wings of pure light spread out from your back, granting you a fly Speed equal to your Speed.
Your wings cast [[Bright Light]] in a 30-foot radius.
When this spell’s duration would end, if you’re still flying, you float to the ground, as [[Feather Fall]].
''Heightened (5th)'' The duration increases to 1 minute.
You descend from an angel—a winged messenger from Nirvana or one of the other celestial realms—which gives you a knack for cultures and languages.
You gain the trained proficiency rank in [[Society]]. If you would automatically become trained in Society (from your background or class, for example), you instead become trained in a skill of your choice.
You know the [[Celestial]] language, and you gain the [[Multilingual]] skill feat.
{{||RitualSummaryTable}}
//This ritual is indexed here for completeness but is a part of the plot of the Age of Ashes Adventure Path and is likely inappropriate outside of it. The description can be found in Age Of Ashes 6: Broken Promises.//
An animal is a creature with a relatively low intelligence.
It typically doesn’t have an Intelligence modifier above –4, can’t speak languages, and can’t be trained in Intelligence-based skills.
You build a rapport with an animal, which becomes magically bonded to you. You gain a [[Familiar]]. The type of animal is up to you, but most gnomes choose animals with a burrow Speed.
''Prerequisite'' //If you are a [[Druid]], you must be part of the [[Animal Order]]. A [[Ranger]] does not have this requirement.//
You gain the service of a young [[animal companion|Animal Companions]] that travels with you on your adventures and obeys any simple commands you give it to the best of its abilities.
An animal companion is a loyal comrade who follows your orders without you needing to use [[Handle an Animal]] on it.
Your animal companion has the <<tag Minion>> trait, and it gains 2 actions during your turn if you use the [[Command an Animal]] action to command it; this is in place of the usual effects of Command an Animal, __and you don’t need to attempt a Nature check__.
If your companion dies, you can spend a week of downtime to replace it at no cost.
You can have only one animal companion at a time.
You or an ally can ride your animal companion as long as it is at least one size larger than the rider. If it is carrying a rider, the animal companion can use only its land Speed, and it can’t move and Support you on the same turn. However, if your companion has the [[Mount]] special ability, it’s especially suited for riding and ignores both of these restrictions.
Animal companions calculate their modifiers and DCs just as you do with one difference: the only item bonuses they can benefit from are to speed and AC (their maximum item bonus to AC is +__3__).
__An animal companion has the same level as you do.__
Your animal companion uses your level to determine its proficiency bonuses. It’s trained in its unarmed attacks, unarmored defense, barding, all saving throws, [[Perception]], [[Acrobatics]], and [[Athletics]].
Animal companions can’t use abilities that require greater Intelligence, such as [[Coerce]] or [[Decipher Writing]], even if trained in the appropriate skill, unless they have a specialization that allows it.
Your animal companion has ancestry Hit Points from its type, plus a number of Hit Points equal to 6 plus its Constitution modifier for each level you have.
| !Trait | !Young | !Mature | !Nimble | !Savage | !Specialized |
| !Strength | As Listed | +1 | +3 | +3 | +3 |
| !Dexterity | As Listed | +1 | +2 | +2 | +3 |
| !Constitution | As Listed | +1 | +2 | +2 | +2 |
| !Intelligence | As Listed | As Listed | As Listed | As Listed | +2 |
| !Wisdom | As Listed | +1 | +2 | +2 | +2 |
| !Unarmed Proficiency | Trained | Trained | Trained | Trained | Expert |
| !Unarmed Damage Dice | 1 | 2 | 2 | 2 | 3 |
| !Unarmed Extra Damage | 0 | 0 | +2 | +3 | 4/6 |
| !Unarmed Traits | As Listed | As Listed | Add Magical | Add Magical | Add Magical |
| !Perception/Saves | Trained | Expert | Expert | Expert | Master |
| !Acrobatics | Trained | Trained | Expert | Trained | As last |
| !Athletics | Trained | Trained | Trained | Expert | As last |
| !Intimidation | As Listed | Trained/Expert | Trained/Expert | Trained/Expert | Trained/Expert |
| !Stealth | As Listed | Trained/Expert | Trained/Expert | Trained/Expert | Trained/Expert |
| !Survival | As Listed | Trained/Expert | Trained/Expert | Trained/Expert | Trained/Expert |
| !Size | As Listed | +1 max Large | +1 max Large | +1 max Large | +1 max Large |
| !Advanced Maneuver | No | No | Yes | Yes | Yes |
You hear animal sounds as conversations instead of unintelligent noise, and can respond in turn.
You can speak to all animals, not just animals with a burrow Speed. You gain a +1 circumstance bonus to [[Make an Impression]] on animals (which usually uses the [[Diplomacy]] skill).
{{||SpellSummaryTable}}
Without fully transforming your body, you gain one animalistic feature, which you select from the list below each time you Cast the Spell.
* ''Cat Eyes'' You gain [[Low-Light Vision]].
* ''Claws'' You gain a claw attack that deals 1d6 slashing damage and has the [[Agile]], [[Finesse]], and [[Unarmed]] traits.
* ''Jaws'' You gain a jaws attack that deals 1d8 piercing damage and has the [[Unarmed]] trait.
''Heightened (4th)'' Add the following options to the list you can choose from.
* ''Fish Tail'' You gain a swim Speed equal to your land Speed.
* ''Owl Eyes'' You gain [[Darkvision]].
* ''Wings'' You gain a fly Speed equal to your land Speed.
You call upon primal energy to transform yourself into a Medium animal battle form.
When you first cast this spell, choose ape, bear, bull, canine, cat, deer, frog, shark, or snake. You can decide the specific type of animal (such as lion or snow leopard for cat), but this has no effect on the form’s Size or statistics.
While in this form, you gain the [[Animal]] trait.
You can Dismiss the spell.
You gain the following statistics and abilities regardless of which battle form you choose:
* AC = 16 + your level. Ignore your armor’s check penalty and Speed reduction.
* 5 temporary Hit Points.
* [[Low-Light Vision]] and imprecise scent 30 feet.
* One or more unarmed melee attacks specific to the battle form you choose, which are the only attacks you can use. You’re trained with them. Your attack modifier is +9, and your damage bonus is +1. These attacks are [[Strength]] based (for the purpose of the [[Enfeebled]] condition, for example). If your unarmed attack bonus is higher, you can use it instead.
* Athletics modifier of +9, unless your own modifier is higher.
You also gain specific abilities based on the type of animal you choose:
* ''Ape'' Speed 25 feet, climb Speed 20 feet; Melee [one-action] fist, Damage 2d6 bludgeoning.
* ''Bear'' Speed 30 feet; Melee [one-action] jaws, Damage 2d8 piercing; Melee [one-action] claw (agile), Damage 1d8 slashing.
* ''Bull'' Speed 30 feet; Melee [one-action] horn, Damage 2d8 piercing.
* ''Canine'' Speed 40 feet; Melee [one-action] jaws, Damage 2d8 piercing.
* ''Cat'' Speed 40 feet; Melee [one-action] jaws, Damage 2d6 piercing; Melee [one-action] claw (agile), Damage 1d10 slashing.
* ''Deer'' Speed 50 feet; Melee [one-action] antler, Damage 2d6 piercing.
* ''Frog'' Speed 25 feet, swim Speed 25 feet; Melee [one-action] jaws, Damage 2d6 bludgeoning; Melee [one-action] tongue (reach 15 feet), Damage 2d4 bludgeoning.
* ''Shark'' swim Speed 35 feet; Melee [one-action] jaws, Damage 2d8 piercing; breathe underwater but not in air.
* ''Snake'' Speed 20 feet, climb Speed 20 feet, swim Speed 20 feet; Melee [one-action] fangs, Damage 2d4 piercing plus 1d6 poison.
''Heightened (3rd)'' You instead gain 10 temporary HP, AC = 17 + your level, attack modifier +14, damage bonus +5, and Athletics +14.
''Heightened (4th)'' Your battle form is Large and your attacks have 10-foot reach. You must have enough space to expand into or the spell is lost. You instead gain 15 temporary HP, AC = 18 + your level, attack modifier +16, damage bonus +9, and Athletics +16.
''Heightened (5th)'' Your battle form is Huge and your attacks have 15-foot reach. You must have enough space to expand into or the spell is lost. You instead gain 20 temporary HP, AC = 18 + your level, attack modifier +18, damage bonus +7 and double the number of damage dice, and Athletics +20.
The fury of a wild predator fills you when you Rage, granting you ferocious unarmed attacks. Cultures that revere vicious animals (such as apes or bears) give rise to barbarians with this instinct. You might also be at war with an uncontrollable, animalistic side of your personality, or you might be a descendant of a werewolf or another werecreature.
''Anathema'': Flagrantly disrespecting an animal of your chosen kind is anathema to your instinct, as is using weapons while raging.
| !Animal | !Attack | !Damage | !Traits |
|Ape |Fist |1d10 B |Grapple, unarmed |
|Bear |Jaws |1d10 P |Unarmed |
| |Claw |1d6 S |Agile, unarmed |
|Bull |Horn |1d10 P |Shove, unarmed |
|Cat |Jaws |1d10 P |Unarmed |
| |Claw |1d6 S |Agile, unarmed |
|Deer |Antler |__1d10__ P |__Grapple__, unarmed |
|Frog |Jaws |1d10 B |Unarmed |
| |Tongue |1d4 B |Agile, unarmed |
|Shark |Jaws |1d10 P |Grapple, unarmed |
|Snake |Fangs |1d10 P |Grapple, unarmed |
|Wolf |Jaws |1d10 P |Trip, unarmed |
''Bestial Rage (Instinct Ability)'' When you Rage, you gain your chosen animal’s unarmed attack (or attacks). These attacks are in the brawling group. Your Rage action gains the <<tag Morph>>, <<tag Primal>>, and <<tag Transmutation>> traits. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
''Specialization Ability'' Increase the damage die size for the unarmed attacks granted by your chosen animal by one step, and increase the additional damage from Rage from 2 to 5 for your chosen animal’s unarmed attacks. The frog’s tongue attack and deer’s antler attack gain reach 10 feet. If you have [[Greater Weapon Specialization]], increase the damage from Rage from 5 to 12 for your chosen animal’s unarmed attacks. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
''Raging Resistance'' You resist piercing and slashing damage. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
Your shapeshifting grants you a magical connection to the animal world.
You can cast [[Animal Messenger]], [[Calm Emotions]] (animals only), and [[Speak With Animals]] as 2nd-level primal innate spells once per day each.
These spells use your class DC or spell DC, whichever is higher.
{{||SpellSummaryTable}}
You offer a gift of food, and an ordinary Tiny wild animal within range approaches to eat it.
You imprint the image, direction, and distance of an obvious place or landmark well known to you within the animal.
Optionally, you can attach a small object or note up to light Bulk to it.
The animal does its best to reach the destination; if it makes it there, it waits nearby until the duration expires, allowing other nonhostile creatures to approach it and remove the attached object.
If there are no Tiny wild animals in range, the spell is lost.
__The spell ends after 24 hours or when a creature removes the attached object, whichever happens first.__
You have a strong connection to beasts, and you are allied with a beast companion.
You are trained in [[Athletics]].
You also gain the [[Animal Companion]] druid feat.
You gain the [[Heal Animal]] order spell.
Committing wanton cruelty to animals or killing animals unnecessarily is anathema to your order. (This doesn’t prevent you from defending yourself against animals or killing them cleanly for food.)
''Prerequisites'' [[Animal Instinct]].
You transform into your animal.
You gain the effects of the 3rd-level [[Animal Form]] spell except you use your own statistics, temporary Hit Points, and unarmed attacks instead of those granted by animal form.
You also retain the constant abilities of your gear.
If your animal is a frog, your tongue’s reach increases to 15 feet.
Dismissing the transformation gains the [[Rage]] trait.
You gain one of the following senses available to your inherent animal: [[Darkvision]], [[Low-Light Vision]], or [[Scent]] ([[Imprecise]]) 30 feet.
You must have [[Low-Light Vision]] before you can gain darkvision with this feat.
If your inherent animal doesn’t typically have a specific type of sense, you can’t gain that sense with this feat.
''Special'' You can select this feat multiple times, choosing a different sense each time.
You have full control over your shape and can transform into your inherent animal.
You can use [[Change Shape]] to enter an animal shape.
When you gain this feat, choose either [[Aerial Form]], [[Animal Form]], or [[Dinosaur Form]]; after you choose a form, you can’t change the form.
While in animal shape, you gain the effects of a 5th‑level casting of your chosen form spell, except you always transform into an animal matching your inherent animal and can use your humanoid form’s AC if it’s higher than what the animal form grants.
If your inherent animal isn’t among the animals listed in the form, you default to the statistics and abilities of the bird battle form, cat battle form, or deinonychus battle form for aerial form, animal form, and dinosaur form, respectively (at the GM’s discretion, you instead default to a different form that is closest to your inherent animal).
You can remain in animal shape indefinitely and can use Change Shape to return to your humanoid or hybrid shape at any time.
If you have the [[Critter Shape]] feat, you can choose to gain the effects of a 4th-level [[Pest Form]], can remain in critter shape indefinitely, and can return to your critter shape at any time after leaving the shape, just as you can with Animal Shape.
''Prerequisites'' [[Animal Instinct]].
Your proficiency in unarmored defense increases to expert.
While you are raging and unarmored, your skin transforms into a thick hide resembling your animal’s skin. You gain a +1 status bonus to [[AC]] instead of taking a –1 penalty to AC; if you have the [[Greater Juggernaut]] class feature, this status bonus increases to +2.
The thickness of your hide gives you a [[Dexterity]] modifier cap to your AC of +3.
''Prerequisites'' ability to communicate with some type of animals (such as bats or arthropods)
You can speak to all animals, not just a particular subset.
You gain a +1 circumstance bonus to [[Make an Impression]] on animals (which usually uses the [[Diplomacy]] skill).
This staff is topped with carved animal and monster heads. While wielding the staff, you gain a +2 circumstance bonus to Nature checks to identify animals.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 4 | 90 | Cantrip |[[Know Direction]] |
|~|~|~| 1st |[[Magic Fang]], [[Summon Animal]] |
| Greater | 8 | 4600 | 2nd |[[Animal Messenger]], [[Speak With Animals]], [[Summon Animal]] |
|~|~|~| 3rd |[[Animal Form]], [[Summon Animal]] |
| Major | 12 | 19000 | 4th |[[Summon Animal]] |
|~|~|~| 5th |[[Animal Form]], [[Moon Frenzy]], [[Summon Animal]] |
You move like an animal.
Your Speed increases by 5 feet.
In addition, you gain one of the following Speeds available to your inherent animal: climb, fly, or swim. You gain this Speed only while in your hybrid shape.
The new movement is as fast as your standard Speed; for example, if you have a 30-foot Speed, you can gain a 30-foot climb Speed.
If your inherent animal doesn’t typically have a specific type of Speed, you can’t gain it with this feat.
If your inherent animal doesn’t typically have a climb, fly, or swim Speed, your Speed increases by 10 feet instead.
{{||SpellSummaryTable}}
You tap into the target's senses, allowing you to see, hear, and otherwise sense whatever it senses for the spell's duration.
If the target wishes to prevent you from doing so, it can attempt a [[Will]] save, negating the spell on a success, but most animals don't bother to do so.
While tapping into the target's senses, you can't use your own body's senses, but you can change back and forth from your body's senses to the target's senses using a single action, which has the [[Concentrate]] trait.
Your animalistic connections help you resist natural afflictions.
You gain a +2 circumstance bonus to saves to resist <<tag Disease>>s and <<tag Poison>>s.
{{||SpellSummaryTable}}
Your magic dredges up a corpse or skeleton and fills it with necromantic life, and you force the dead to fight at your command.
You summon a common creature that has the <<tag Undead>> trait and whose level is –1; this creature gains the <<tag Summoned>> trait.
Heightening the spell increases the maximum level of creature you can summon.
{{SummonHeightenList}}
{{||RitualSummaryTable}}
''Cost'' Rare oils, based on creature level:
{{CreationRitualCost}}
You transform the target into an animated object with a level up to that allowed by the table above, and of a type corresponding to the object (so a broom would become an animated broom).
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
You cause a length or section of rope or a rope-like object to animate and follow simple commands.
You can give it two commands when you Cast the Spell, and one command each time you Sustain the Spell.
* ''Bind'' <<tag Attack>> The rope attempts to partially bind a creature. Attempt a spell attack roll against the target’s [[Reflex]] DC. If you succeed, the target takes a –10-foot circumstance penalty to its Speed (–20-foot on a critical success). This ends if the target [[Escape]]s against your spell DC or breaks the rope. (A standard adventuring rope has Hardness 2, HP 8, and a Broken Threshold of 4.)
* ''Coil'' The rope forms a tidy, coiled stack.
* ''Crawl'' The rope inches along the ground like a snake, moving one of its ends 10 feet. The rope must move along a surface, but that surface doesn’t need to be horizontal.
* ''Knot'' The rope ties a sturdy knot in itself.
* ''Loop'' The rope forms a simple loop at one or both ends, or straightens itself back out.
* ''Tie'' The rope ties itself around a [[Willing]] creature or an object that’s unattended or attended by a willing creature.
* ''Undo'' The rope undoes one of its knots, ties, or bindings.
''Heightened (+2)'' The range increases by 50 feet, and you can animate 50 more feet of rope.
{{||SpellSummaryTable}}
You use your mind to manipulate unattended objects in the area, temporarily animating them to attack. The objects hover in the air, then hurl themselves at nearby creatures in a chaotic flurry of debris.
This assault deals 2d10 bludgeoning damage (basic [[Reflex]] save) to each creature in the area.
On subsequent rounds, you can [[Sustain this Spell|Sustain a Spell]], dealing 1d10 bludgeoning damage (basic [[Reflex]] save) to each creature in the area.
''Heightened (+2)'' The initial damage increases by 2d10 and the subsequent damage increases by 1d10.
{{||SpellSummaryTable}}
You implant a mental mine within your psyche that detonates against anyone attempting to manipulate your thoughts.
You can use a single action, which has the <<tag Concentrate>> trait, to suppress the effects of the mine for 1 round to allow someone to safely use a <<tag Mental>> effect on you.
You can [[Dismiss]] the spell.
The first creature that uses a mental effect against you triggers the animus mine, causing the spell to end. The animus mine deals 4d8 mental damage to the triggering creature, which must attempt a [[Will]] save.
''Heightened (+1)'' The damage increases by 2d8.
{{||SaveSuccessTable}}
''Trigger'' A foe gives you the [[Grabbed]] or [[Restrained]] condition using a part of its body.
Whenever someone grabs onto you, you instinctively bite down hard. Sometimes that makes them let go, and sometimes it just makes them angrier, but either way, it’s both satisfying and tasty.
Make a jaws [[Strike]] against the triggering foe. On a critical hit, you are no longer [[Grabbed]].
This Strike doesn’t count toward your [[Multiple Attack Penalty]], and your multiple attack penalty doesn’t apply to this Strike.
You have learned from the brute destructive power of //monsters//.
You make a melee [[Strike]] that ignores any resistances the target has.
If you target a solid unattended object or surface with your Strike, you might automatically destroy it without an attack roll. If you target any object or surface with Hardness 20 or less that isn’t a magic item or the effect of a spell, you destroy it.
If the target object or surface is a magic item or the effect of a spell, you attempt to [[Counteract]] it using your attack bonus with the Strike for the counteract check. On a successful counteract check, you destroy the object or surface unless it has Hardness greater than 20, is an artifact, or is similarly difficult to destroy.
You destroy up to a 5-foot cube of an object or surface larger than Medium.
By putting composition to paper, you can create a source of stirring words or song that others can read and understand.
You spend 10 minutes and 1 Focus Point to transpose a composition spell on a special scroll that you or another creature can later activate.
This composition spell must take a single action to cast.
If the chosen composition spell requires a [[Performance]] check as part of the casting, the GM rolls this check as a secret check when you annotate your score.
If you have [[Inspire Heroics]] or [[Lingering Performance]] and the chosen composition spell allows, you can also use one of those spells to modify the annotated composition, with the GM rolling the secret [[Performance]] check. If you do, you spend an additional Focus Point, even if the secret check fails.
Any creature that can read the language you used when annotating your composition can Activate the Item by spending a single action, which has the <<tag Concentrate>> trait.
This produces the effects of the composition as though the activating creature had Cast the Spell.
A composition you create this way loses its power the next time you make your daily preparations.
While the composition is in your possession, you can render it inert using a single action that has the concentrate trait.
You can’t regain the Focus Points you spent to create the annotated composition until it is activated or loses its magic.
You forge a mystical connection with an ally using your body as a focus, allowing them to benefit from your magic.
You place a blood rune on an adjacent ally that lasts for 1 minute.
When you would gain a blood magic effect, you can forgo it, granting it to your ally instead.
You can anoint only one ally at a time; if you place another rune, your previous designation ends.
{{||SpellSummaryTable}}
You reinforce the target's musculoskeletal system to bear more weight.
The target can carry 3 more Bulk than normal before becoming encumbered and up to a maximum of 6 more Bulk.
Using your extensive knowledge of ambush tactics, you keep watch for any hidden creatures or dangerous sites, moving at half your travel speed.
If you’re Anticipating an Ambush at the start of an encounter, you roll a [[Perception]] check for initiative, and all enemies rolling [[Stealth]] for initiative take a –2 circumstance penalty to their Stealth checks.
{{||SpellSummaryTable}}
You grant the target brief foresight.
The target gains a +1 status bonus to its next [[Initiative]] roll //within the duration//, after which the spell ends.
''Heightened (+2)'' The status bonus increases by 1, to a maximum of +4 at 7th level.
An antidote protects you against toxins. Upon drinking an antidote, you gain an item bonus to Fortitude saving throws against poisons for 6 hours.
When you drink a Major antidote, you can immediately attempt a save against one poison of 14th level or lower affecting you. If you succeed, the poison is neutralized.
| !Type | !Level | !Price | !Item Bonus |
| Lesser | 1 | 30 | +2 |
| Moderate | 6 | 350 | +3 |
| Greater | 10 | 1600 | +4 |
| Major | 14 | 6750 | +4 |
''Usage'' etched onto armor.
This intricate rune displaces spell energy, granting you a +1 status bonus to saving throws against magical effects.
{{ReactionIcon}} command. ''Frequency'' once per day. ''Trigger'' when a spell targets you or includes you in its area. ''Effect'' The armor attempts to [[Counteract]] the triggering spell with the effect of a 7th-level [[Dispel Magic]] spell and a counteract modifier of +26.
''Craft Requirements'' Supply one casting of [[Dispel Magic]].
{{||SpellSummaryTable}}
You repel all magic from the target area, preventing spells and other magic from functioning.
Spells can't penetrate the area, magic items cease to function within it, and no one inside can cast spells or use magic abilities.
Likewise, spells such as [[Dispel Magic]] can't affect the field itself unless they are of a higher level.
Magic effects resume the moment they pass outside the field. For example, a ray fired from one side of the field could target a creature on the other side (as long as caster and target are both outside the field). A summoned creature winks out of existence but reappears if the field moves or ends. Invested magic items cease to function, but they remain invested and resume functioning when they exit the field.
The ability boost from an apex item isn't suppressed within the field.
Spells of a higher level than the antimagic field overcome its effects, and can even be cast by a creature within the field.
The field disrupts only magic, so a +3 longsword still functions as a longsword.
Magically created creatures (such as golems) function normally within an antimagic field.
This oil contains energy that repels nearly all types of magic.
When you apply this oil to armor, the creature wearing the armor becomes immune to all spells, effects of magic items (the wearer’s and those of others), and effects with the <<tag Magical>> trait for 1 minute.
The oil affects neither the magic of the armor nor the fundamental runes of weapons attacking the wearer.
Magical effects from a source of 20th level or higher, such as a deity, still function on the armor’s wearer.
You’re dishonorable, dishonest, and committed to breaking the false hopes of kindness.
* You must never perform acts anathema to your deity or willingly commit a purely good act, such as giving something solely out of charity, casting a good spell, or using a good item.
* You must never put another person’s needs before your own, and you must never put your own needs before those of your deity. Though you can perform acts others might consider helpful, it must be done with the expectation that it ultimately furthers your own goals or those of your master.
* You must not bind yourself with any law or oath beyond that of your code (though you can still select a champion feat with the oath trait). Act dishonorably, take advantage of others, lie, cheat, and steal to get what you want.
* You must destroy that which offends you and that which stands in your way, including—and perhaps especially—the forces of good and law that oppose you. (This tenet doesn’t force you to take action immediately if it could mean your destruction, nor does it require you to destroy something that might be useful if corrupted toward your ends.)
You gain the [[Touch of Corruption]] devotion spell. Your champion's reaction is [[Destructive Vengeance]].
Antiplague can fortify the body’s defenses against diseases. Upon drinking an antiplague (as an [[Interact]] action), you gain an item bonus to Fortitude saving throws against diseases for 24 hours; this applies to your daily save against a disease’s progression.
When you drink a Major antiplague, you can immediately attempt a saving throw against one disease of 14th level or lower affecting you. If you succeed, you are cured of the disease.
| !Type | !Level | !Price | !Item Bonus |
| Lesser | 1 | 30 | +2 |
| Moderate | 6 | 350 | +3 |
| Greater | 10 | 1600 | +4 |
| Major | 14 | 6750 | +4 |
You become trained in [[Crafting]] (or another skill if you were already trained in Crafting) and gain the [[Specialty Crafting]] skill feat, but you can pick two different specialties instead of one.
//This feat has special plot requirements that are described in Age of Ashes 3: Tomorrow Must Burn.//
//This spell has special plot requirements that are described in Age of Ashes 3: Tomorrow Must Burn.//
//This is a Saggorak Rune, with plot functions described in Age of Ashes 4. It can only be applied by someone with legendary Crafting, and takes up two property rune slots.//
//This Feat has special plot prerequisites that are described in Age of Ashes 5: Against the Scarlet Triad.//
{{||SpellSummaryTable}}
You focus on the energies of all members of your animal companion’s species, transforming your animal companion into its apex battle form.
Your animal companion gains the following statistics and abilities while in its apex form.
* Your animal companion becomes Huge and its attacks have 15-foot reach. It must have enough space to expand into or the spell is lost.
* 30 temporary Hit Points.
* [[Darkvision]].
* Your animal companion’s attack’s damage dice increase by one step, and its attack gains the [[Deadly]] d12 trait.
* +10-foot status bonus to its Speeds.
* Ignores [[Difficult Terrain]] and greater difficult terrain.
You were born with a connection to the Plane of Law.
You gain the <<tag Aphorite>> trait, in addition to the traits from your ancestry.
You also gain [[Low-Light Vision]], or you gain [[Darkvision]] if your ancestry already has low‑light vision.
You can choose from <<tag Aphorite>> feats and feats from your ancestry whenever you gain an ancestry feat.
{{||VHerFeatList}}
{{||SpellSummaryTable}}
You create a brief vision of immense wealth filling the spell’s area.
Each creature within 20 feet of the area that could be enticed by material wealth must attempt a [[Will]] saving throw.
A creature that enters the area automatically disbelieves the illusion, and disbelieving the illusion ends any fascinated condition imposed by the spell.
As long as you [[Sustain the Spell|Sustain a Spell]], other creatures react to the treasure like they would any other illusion, but they are not at risk of becoming fascinated.
{{||SaveSuccessTable}}
Aquatic creatures are at home underwater.
Their bludgeoning and slashing unarmed Strikes don’t take the usual –2 penalty for being underwater.
Aquatic creatures can breathe water but not air.
''Frequency'' once per day
If you and up to four other creatures are in contact with a body of water deep enough for you to fully submerge, you can spend 10 minutes adapting the creatures to that specific body of water.
This allows them to breathe normally while within that body of water and protects them from deep ocean pressure.
These effects last until the creatures are no longer in contact with that body of water or until you use this ability again, whichever comes first for each creature.
''Requirements'' The monster is [[hiding|Hidden]] in water and a creature that hasn’t detected it is within the listed number of feet.
The monster moves up to its swim Speed + 10 feet toward the triggering creature, traveling on water and on land.
Once the creature is in reach, the monster makes a [[Strike]] against it. The creature is [[Flat-Footed]] against this Strike.
You blend into the waves.
While fully submerged in water, as long as an observer is at least 20 feet away from you, you don’t need cover from that observer to [[Hide]] or [[Sneak]].
Use these rules for battles in water or underwater:
* You’re [[Flat-Footed]] unless you have a swim Speed.
* You gain resistance 5 to <<tag Acid>>and <<tag Fire>>.
* You take a –2 circumstance penalty to melee slashing or bludgeoning attacks that pass through water.
* Ranged attacks that deal bludgeoning or slashing damage automatically miss if the attacker or target is underwater, and piercing ranged attacks made by an underwater creature or against an underwater target have their range increments halved.
* You can’t cast fire spells or use actions with the <<tag Fire>> trait underwater.
* At the GM’s discretion, some ground-based actions might not work underwater or while floating.
* //As written, <<tag Electricity>> effects do not conduct differently through water.//
You can ask questions of, receive answers from, and use the [[Diplomacy]] skill with animals with the amphibious or aquatic traits.
You gain a +1 circumstance bonus to [[Make an Impression]] on such animals.
As your connection to water grows, you can see more easily in places with less light, such as the depths of the ocean.
You gain [[Low-Light Vision]], or you gain [[Darkvision]] if your ancestry already has low-light vision.
''Special'' If your ancestry has neither low-light vision nor darkvision, you can take this ancestry feat a second time to gain darkvision. You can’t retrain out of this feat.
{{||SpellSummaryTable}}
A sphere of water 10 feet in diameter forms in an unoccupied space in range, either on the ground or on the surface of a liquid.
When you Cast the Spell and each time you [[Sustain the Spell|Sustain a Spell]], you can roll the orb, moving it up to 10 feet along the ground or the surface of a liquid. Unlike most spells, you can gain this effect multiple times in the same round by Sustaining the Spell multiple times.
The orb can move through the spaces of any creatures or obstacles that wouldn’t stop the flow of water.
It extinguishes non-magical fires it moves through of its size or smaller, and it attempts to [[Counteract]] any magical fires it moves through. If it fails to counteract a given fire, it can’t counteract that fire for the duration of the spell.
The orb can also collect creatures it moves through. Any Large or smaller creature whose space the orb tries to move through can attempt a Reflex save against your spell DC to avoid being engulfed. If a creature succeeds at this save, it can either let the orb pass (remaining in its space or moving out of the orb’s path into a space of the creature’s choice) or allow itself to be pushed in front of the orb to the end of the orb’s movement.
The orb can try to Engulf the same creature only once per turn, even if you roll it onto a creature’s space more than once.
A creature that fails its save is pulled into the orb. It becomes [[Grabbed]], moves along with the orb, and must hold its breath or begin [[Suffocating]] (unless it can breathe in water).
An engulfed Medium or smaller creature and anyone trying to affect that creature follow the normal rules for [[aquatic battles|Aquatic Combat]].
An engulfed Large creature is usually big enough that parts of it stick out from the water, and it can reach out of the water.
An engulfed creature can get free either by [[Swim]]ming with a successful DC 10 [[Athletics]] check or by [[Escaping|Escape]] against your spell DC. A creature that critically failed its [[Reflex]] save is further stuck and must attempt to [[Escape]] instead of [[Swim]].
A freed creature exits the orb’s space and can immediately breathe.
The orb can contain as many creatures as can fit in its space.
When the spell ends, all creatures the orb has engulfed are automatically released.
''Key Ability'' [[Intelligence]].
Arcana measures how much you know about arcane magic and creatures.
{{||SkillActionList}}
{{||SkillFeatList}}
{{||SkillRitualList}}
Arcane spellcasters use logic and rationality to categorize the magic inherent in the world around them.
Because of its far-reaching approach, the arcane tradition has the broadest spell list, though it’s generally poor at affecting the spirit or the soul.
[[Wizard]]s are the most iconic arcane spellcasters, poring over tomes and grimoires, though arcane [[Sorcerer]]s study the secrets of their blood to unlock the power within themselves.
<<schoolspelllist Arcane>>
You can cast more arcane spells each day.
Increase the spell slots you gain from wizard archetype feats by 1 for each spell level other than your two highest spell levels.
{{||SpellSummaryTable}}
''Trigger'' A creature within range that you can see Casts a Spell.
You undermine the target spell, making it easier to defend against. You reduce the spell’s level by 1, and targets of the spell gain a +2 status bonus to any saving throws, skill checks, AC, or DC against it.
You can’t reduce the spell’s level below its minimum. For example, a 5th-level [[Cone of Cold]] would remain 5th-level, but a 5th-level [[Fireball[[ would become 4th-level. Targets still gain all the other benefits, even if you don’t reduce the spell’s level.
''Prerequisites'' Bloodline that grants arcane spells.
Your arcane legacy grants you an exceptional aptitude for intellectual and academic pursuits.
You become trained in one skill of your choice.
Additionally, you keep a book of arcane spells similar to a wizard’s spellbook. You add all the spells in your spell repertoire to this book for free, and you can add additional arcane spells to the book by paying the appropriate cost and using your [[Arcana]] skill, similarly to how a wizard can [[Learn Spell]]s to add those spells to his spellbook.
During your daily preparations, choose any one spell from your book of arcane spells. If it isn’t in your spell repertoire, add it to your spell repertoire until the next time you prepare. If it’s already in your spell repertoire, add it as an additional signature spell for that day.
Select one arcane school of magic.
You gain the school’s initial school spell:
| !School | !School Spell |
| Abjuration | [[Protective Ward]] |
| Conjuration | [[Augment Summoning]] |
| Divination | [[Diviner's Sight]] |
| Enchantment | [[Charming Words]] |
| Evocation | [[Force Bolt]] |
| Illusion | [[Warped Terrain]] |
| Necromancy | [[Call of the Grave]] |
| Transmutation | [[Physical Boost]] |
If you don’t already have one, you gain a focus pool of 1 Focus Point, which you can [[Refocus]] by studying.
''Prerequisites'' Trained in Arcana.
Your study of magic allows you to instinctively sense its presence.
You can cast 1st-level [[Detect Magic]] at will as an arcane innate spell.
If you’re a master in Arcana, the spell is heightened to 3rd level.
If you’re legendary, it is heightened to 4th level.
{{LOCGFeat}}
You have tattoos on your body corresponding to one of the ancient schools of magic.
Choose one of the following schools of magic: abjuration ([[Shield (Spell)]]), conjuration ([[Tanglefoot]]), enchantment ([[Daze]]), evocation ([[Electric Arc]]), illusion ([[Ghost Sound]]), necromancy ([[Chill Touch]]), or transmutation ([[Sigil]]). You can cast the associated cantrip (listed in parentheses) as an innate arcane spell at will.
You are a student of peoples and their histories, and are in constant pursuit of knowledge and artifacts from the past.
You become an expert in [[Society]] and [[Thievery]], and you gain a +1 circumstance bonus to [[Recall Knowledge]] about ancient history, peoples, and cultures.
<<archetypefeatlist "4 7 8 10" "Archaeologist">>
''Frequency'' once per hour
''Trigger'' You fail a check against a trap, such as a [[Thievery]] check to [[Disable|Disable a Device]] the trap or a [[Reflex]] save to avoid its effects.
You are more than just skillful; your drive to find the secrets of the past manifests as a strange kind of luck.
Reroll the failed check and use the new result.
You become trained in all simple and martial weapons in the bow weapon group.
Whenever you gain a class feature that grants you expert or greater proficiency in certain weapons, you also gain that proficiency rank in all simple and martial weapons in the bow weapon group.
If you are at least an expert in the bow you are using, you gain access to the [[Critical Specialization Effect]] with that bow.
<<archetypefeatlist "4 6 8 10 18" "Archer">>
You slow down, focus, and take a careful shot.
Make a ranged [[Strike]] with a weapon in the bow weapon group.
You gain a +2 circumstance bonus to the attack roll and ignore the target’s [[Concealed]] condition.
If the target is [[Hidden]], reduce the flat check from being hidden from 11 to 5.
<<levelfeatlist "1 2 4 6 8 10 12 14 16 18 20" "[tag[Feat]tag[Dedication]]">>
\define archetypefeatlist(levels:"", archetype:"")
<table>
<tr><th>Level</th><th>Feats</th></tr>
<$list filter=<<__archetype__>> variable="archetype">
<$list filter=<<__levels__>> variable="level">
<tr><th><<level>></th>
<td>
<$list filter="[tag[Feat]contains:feat-arch<archetype>field:feat-level<level>][tag[Feat]contains:feat-archadd<archetype>field:feat-archlevel<level>]+[sort[]]">
{{||NiceFeatDisplay}}<br />
</$list>
</td></tr>
</$list>
</$list>
</table>
\end
Members of this family of celestials are the protectors of Heaven and are lawful good.
They have [[Darkvision]] and a weakness to evil damage.
You can tap into the heavenly magic that is your birthright.
You can cast [[Continual Flame]] and [[Shield Other]] each once per day as 2nd-level divine innate spells.
You have mastered the greatest secrets of arcane magic.
You gain an additional 10th-level spell slot.
You command the most potent arcane magic and can cast a spell of truly incredible power.
You gain a single 10th-level spell slot and can prepare a spell in that slot using arcane spellcasting.
Unlike with other spell slots, you don’t gain more 10th-level spells as you level up, though you can take the [[Archwizard’s Might]] feat to gain a second slot.
__You can’t use this spell slot for abilities that let you cast spells without expending spell slots or that give you more spell slots.__
You gain you cold resistance equal to half your level (minimum 1). You treat environmental cold effects as if they were one step less extreme (incredible cold becomes extreme, extreme cold becomes severe, and so on).
{{LOWGFeat}}
You have been trained to resist the manipulations of fiends, and your Hellknight discipline makes you difficult to influence.
You gain a +1 circumstance bonus to saves against mental effects that specifically improve your attitude and to your [[Will]] DC against someone [[Coercing|Coerce]] you, [[Demoralizing|Demoralize]] you, [[Making an Impression|Make an Impression]] on you, or Making a [[Request]] of you.
If a mental effect would compel you to act in a way that violates your Hellknight order’s tenets (as determined by the GM), you can attempt to break free from the effect as a reaction triggered by receiving the violating order, and you gain a new [[Will]] save against the effect. You can attempt this new save only once for a given effect, even if you are compelled to violate your order’s tenets multiple times..
You are descended from the valkyries who protect worthy souls, and can hold back death’s grasp.
You can cast [[Breath of Life]] as a divine innate spell once per day.
{{LOWGFeat}}
''Prerequisites'' expert in heavy armor.
You’ve learned how best to move in heavy armor.
When wearing heavy armor, if you meet the Strength requirement, instead of reducing the movement penalty by 5 feet, you reduce the penalty by 10 feet (typically reducing the penalty to 0).
If you are a dwarf with the [[Unburdened Iron]] feat, increase your Speed by 5 feet.
After your service aiding armored combatants, you are practiced in helping yourself and others don heavy gear.
You can attempt an [[Athletics]] or Warfare [[Lore]] check with a DC determined by the GM (but usually 15 for common armor, DC 20 for uncommon armor, and DC 25 for rare armor) to halve the time you take to don armor.
You can halve an ally’s time to don armor by working with them to don the armor and succeeding at an Athletics or Warfare Lore check against the same DC.
You have spent so much time in armor that you know how to make the most of its protection.
Your proficiency ranks for light, medium, and heavy armor, as well as for unarmored defense, increase to expert.
You gain the [[Armor Specialization Effects]] of medium and heavy armor.
Your skill with armor improves, helping you avoid more blows.
Your proficiency ranks for light, medium, and heavy armor, as well as for unarmored defense, increase to master.
{{||SpellSummaryTable}}
You ossify your physical form, mimicking the durability of bone.
You gain resistance 3 to <<tag Cold>>, <<tag Electricity>>, <<tag Fire>>, <<tag Piercing>>, and <<tag Slashing>> damage.
''Heightened (+1)'' Increase the resistance by 1.
Your training and rage deepen your connection to your armor.
Your proficiency ranks for light armor, medium armor, and unarmored defense increase to master.
''Usage'' etched onto armor.
Magic wards deflect attacks.
You can upgrade the armor potency rune already etched on a suit of armor to a stronger version, increasing the values of the existing rune to those of the new rune.
You must have the formula of the stronger rune to do so, and the Price of the upgrade is the difference between the two runes’ Prices.
| !Type | !Level | !Price | !Craft Requirement | !AC bonus | !Property Runes Allowed |
| +1 | 5 | 1600 | Expert [[Crafting]] | 1 | 1 |
| +2 | 11 | 10600 | Master [[Crafting]] | 2 | 2 |
| +3 | 18 | 205600 | Legendary [[Crafting]] | 3 | 3 |
You become trained in [[Light Armor]]. If you already were trained in light armor, you gain training in [[Medium Armor]]. If you were trained in both, you become trained in [[Heavy Armor]].
You can select this feat more than once. Each time, you become trained in the next type of armor above.
You learn the secrets of armor runes by viewing them through gems and can alter them at your discretion.
Once per day when you make your daily preparations, you can focus on a rune’s magical energies through a crystal’s facets to alter a single property rune on one suit of armor in your possession to suppress its normal effects and make it function as a different property rune.
You can temporarily alter the rune to function as one of the following runes: [[Energy Resistant]], [[Fortification]], [[Glamered]], [[Invisibility]], [[Shadow]], or [[Slick]].
The property rune remains altered until you make your next daily preparations.
The armor must meet the prerequisites for the temporary rune, and any other runes that required the suppressed rune are also suppressed while the rune is transformed.
The rune is obviously altered, and thus the armor can’t be sold as though it had the temporary rune.
You have trained hard to optimize your armor’s protective qualities.
You gain the armor specialization effects of medium and heavy armor.
''Trigger'' An adjacent foe critically fails an attack roll to Strike you with a melee weapon or unarmed attack.
''Requirements'' You are wearing medium armor or heavier.
You rebuff puny attacks with your armor, knocking back your foe.
Attempt an [[Athletics]] check to [[Shove]] the triggering foe, even if you don’t have a hand free.
If you succeed, you can’t Stride to follow the foe, as you’re knocking the foe back with the rebounded attack, not by physically moving towards them.
You have learned techniques to adjust and modify your armor and movements to reduce the noise you make.
When you wear non-<<tag Noisy>> armor with which you are trained, your penalty to [[Stealth]] checks is reduced by 1 (to a minimum penalty of 0).
If you’re a master in Stealth, reduce the penalty by 2, and if you’re legendary, reduce the penalty by 3.
If your armor has the noisy trait, instead of reducing the penalty to Stealth checks, you ignore the effects of the noisy trait, enabling you to remove the penalty with a sufficient Strength score as normal.
{{||SpellSummaryTable}}
You override a target’s olfactory senses, luring them to a specific location through tantalizing false scents.
Select a single square within range that is not hazardous or occupied by a creature.
The target is drawn to the selected location, becoming euphoric upon arrival.
The target must attempt a [[Will]] save.
''Heightened (+2)'' You target 1 additional creature, selecting a different square within range as their destination.
{{||SaveSuccessTable}}
''Trigger'' You fall.
''Requirements'' You have a fly Speed.
You attempt an [[Acrobatics]] check to slow your fall. The DC is typically 15, but it might be higher due to air turbulence or other circumstances.
{{||ActionSuccessTable}}
''Frequency'' once per day
You modify an arrow or bolt to bring death to your target in a single potent hit.
Make a bow [[Strike]].
On a hit, you deal an additional 10d10 precision damage.
On a critical hit, the target must also succeed at a [[Fortitude]] saving throw against your class DC or spell DC, whichever is higher, or be immediately slain; this save has the <<tag Death>> and <<tag Incapacitation>> traits. //(This means that creatures of higher level promote their saves and thus must critically fail to be slain.)//
You pluck missiles from the air and hurl them back at their source.
When you successfully deflect an attack with [[Deflect Arrow]], as part of that reaction, you can immediately make a ranged [[Strike]] against the attacker using the projectile you deflected.
This is a thrown weapon with the same range increment and effect on a hit as the triggering attack.
This toxin is a compound of arsenic and other substances.
You can’t reduce your [[Sickened]] condition while affected.
| !Saving Throw |DC 18 [[Fortitude]] |
| !Onset |10 minutes |
| !Maximum Duration |5 minutes |
| !Stage 1 |1d4 poison damage and [[Sickened]] 1 (1 minute) |
| !Stage 2 |1d6 poison damage and [[Sickened]] 2 (1 minute) |
| !Stage 3 |2d6 poison damage and [[Sickened]] 3 (1 minute) |
You become trained in [[Crafting]] (or another skill if you’re already trained in Crafting), and you gain the [[Specialty Crafting]] skill feat in a specialty of your choice.
{{||SpellSummaryTable}}
You transform the target to make it match your artisanal and artistic vision.
If you have expert proficiency in [[Craftin]]g, the item grants a +1 item bonus to attack rolls if it’s a weapon or skill checks if it’s a skill tool.
The target is a beautiful and impressive piece for its new quality, but the effect is obviously temporary, so its monetary value doesn’t change.
When you cast this spell, any previous artistic flourish you had cast ends.
''Heightened (7th)'' If you have master proficiency in Crafting, the item grants a +2 item bonus instead.
''Heightened (10th)'' If you have legendary proficiency in Crafting, the item grants a +3 item bonus instead.
''Additive'' 2.
''Frequency'' once per round.
''Trigger'' You use [[Quick Alchemy]] to craft an [[Alchemist’s Fire]], and that bomb’s level is at least 2 levels lower than your [[Advanced Alchemy]] level.
The alchemist’s fire deals 1d4 persistent fire damage in addition to what the alchemist fire would normally cause (for instance, a moderate alchemist’s fire deals 1d4+2 persistent fire damage).
A creature taking persistent fire damage from the alchemist’s fire requires two successful flat checks to end the persistent damage, or one check if the creature had an assisted recovery that reduces the flat check to DC 10.
The enhanced alchemist’s fire burns even underwater, and any attempts to end the persistent damage by using water have no effect.
You’ve trained to assassinate your foes, and you do so with tenacity and precision.
You gain the [[Mark for Death]] activity.
<<archetypefeatlist "4 6 10 12" "Assassin">>
''Requirements'' You have designated a mark using [[Mark for Death]] and are completely [[Unnoticed]] by your mark.
You strike with one swift movement, trying to instantly slay your mark.
Make a [[Strike]] against your mark.
If you hit, your mark takes 6d6 extra precision damage with a basic [[Fortitude]] save against your class DC or spell DC, whichever is higher. If the mark critically fails, they die.
This is an <<tag Incapacitation>> effect ''(so creatures of higher level promote their saves by one step)''..
The creature then becomes temporarily immune to your Assassinate for 1 day.
You can take steps to help yourself recover from [[Persistent Damage]], or an ally can help you, allowing you to attempt an additional flat check before the end of your turn.
This is usually an activity requiring 2 actions, and it must be something that would reasonably improve your chances (as determined by the GM). For example, you might try to smother a flame, wash off acid, or use [[Medicine]] to [[Administer First Aid]] to stanch bleeding. This
allows you to attempt an extra flat check immediately.
The GM decides how your help works, using the following examples as guidelines.
* Reduce the DC of the flat check to 10 for a particularly appropriate type of help, such as dousing you in water to put out flames.
* Automatically end the condition due to the type of help, such as healing that restores you to your maximum HP to end persistent bleed damage, or submerging yourself in a lake to end persistent fire damage.
* Alter the number of actions required to help you if the means the helper uses are especially efficient or remarkably inefficient.
With a quick shot, you interfere with a foe in combat.
__Make a [[Strike]] with a ranged weapon.__
__If the strike hits, the next creature other than you to attack the same target before the start of your next turn gains a +1 circumstance bonus on their roll, or a +2 circumstance bonus if your Strike was a critical hit.__
''Prerequisite'' Trained in at least one skill.
Even in the worst circumstances, you can perform basic tasks.
Choose a skill you’re trained in.
You can forgo rolling a skill check for that skill to instead receive a result of 10 + your proficiency bonus (do not apply any other bonuses, penalties, or modifiers).
//This includes not applying situational circumstance, status, and item modifiers.//
You can select this feat multiple times. Each time, choose a different skill and gain the benefits for that skill.
You rarely misidentify an item.
When using [[Arcana]], [[Nature]], [[Occultism]], or [[Religion]] checks to [[Identify Magic]], if you roll a critical failure, you get a failure instead.
If you would misidentify a cursed item because you roll a success but not a critical success, you simply can’t identify it instead.
You can procure information with confidence.
Whenever you [[Recall Knowledge]] using any skill (including Bardic [[Lore]]), you can forgo rolling your check to instead receive a result of 10 + your proficiency bonus (don’t apply any other bonuses, penalties, or modifiers).
As long as you are an expert in a skill, you meet the prerequisites for the [[Automatic Knowledge]] skill feat in that skill, even if you don’t have [[Assurance]] in that skill.
You can cover for a secondary caster’s error.
If you are the primary caster, after rolling all the secondary checks, choose one check on which the secondary caster rolled a failure or critical failure, and treat the result as one degree of success better.
{{||SpellSummaryTable}}
Lines of burning starlight form a constellation around you.
Draw five [[Line]]s, one at a time; each line must anchor at you or a creature or object already connected to a previous line, and it must end at a creature or object within 30 feet of its anchor (possibly allowing the asterism to extend to its full 150‑foot range).
A creature that begins its turn in one of these lines or enters one of these lines on its turn takes 4d6 <<tag Fire>> damage (basic [[Reflex]] save). A creature can take this damage only once per turn, even if it moves through several lines. Targets that are part of the asterism do not take damage from it.
If the distance between two targets (or you and a target) ever exceeds 30 feet, the line of starlight between the two breaks, and any lines that now no longer have a direct path back to you also break.
You can [[Dismiss]] the spell.
''Heightened (+1)'' The damage increases by 1d6.
''Additive 2''.
''Frequency'' once per minute.
''Trigger'' You use [[Quick Alchemy]] to craft an alchemical bomb that deals splash damage and is at least 2 levels lower than your [[Advanced Alchemy]] level.
Your bomb incorporates an explosive spark of wonder that leaves witnesses dumbfounded.
Any target hit by your Strike with the bomb is [[Fascinated]] by you for 1 round. On a critical success, the target is also [[Stunned]] 1.
Astral creatures are native of the Astral Plane.
They can survive the basic environmental effects of the Astral Plane.
{{||SpellSummaryTable}}
You connect the entire area with an invisible maze of astral energy that interferes with dimensional and mental magic.
Choose a point in the area that you can see when you cast this spell. Objects other than force effects and rare metals can’t block this spell’s area.
Astral labyrinth attempts to [[Counteract]] magical <<tag Mental>> effects targeting or including anyone other than the caster in the area, though it has no effect on mental effects that began outside the area or before the spell was cast.
In addition, any creature that tries to depart or arrive in a location in the area by <<tag Teleportation>> or extradimensional travel (including extradimensional spaces) must attempt a Will saving throw. Summoned creatures must attempt the save when they are summoned, but not when the summoning ends.
''Heightened (10th)'' You and creatures transported by your spells can’t get a result worse than success on the saving throw to teleport into or out of the area.
{{||SaveSuccessTable}}
{{||RitualSummaryTable}}
''Cost'' one jacinth worth a total value of the target’s level (minimum 1) × 5 gp, for each target.
Secondary casters can't use the same skill as is used for the primacy check.
You project the targets’ spiritual essences into the Astral Plane, leaving their inanimate physical forms behind. These astral forms can be used to explore the Astral Plane indefinitely, while the targets’ bodies remain safely in stasis on the plane where the ritual was cast (where they remain unconscious and can’t be awoken normally).
The casters must be in physical contact with one another in a circle for the duration of the casting, and all targets must be selected from these casters.
A target’s astral form is a duplicate of the target and everything they’re carrying; anything that happens to a duplicate item happens to the original as well. For instance, if you use, spend, destroy, lose, or give away an item’s duplicate, the original vanishes from your possession.
For the duration of the ritual, any of the targets can spend a single action to [[Dismiss]] their astral form and immediately return to their physical body. As the primary caster, when you Dismiss your astral form, you can also Dismiss all the other targets’ astral forms as part of the same action, returning all targets to their physical forms simultaneously.
While in the Astral Plane, the other targets are unable to navigate without you, and if they become separated from you, they must wait for your return or Dismiss their own astral forms.
When the ritual ends, the targets’ astral forms vanish.
A target’s astral form and corresponding physical form are linked by an incorporeal silver cord, which is visible only in the Astral Plane. This nearly unbreakable cord serves as a conduit and safety line; if it is severed, the target’s astral and physical forms are both immediately slain.
If the ritual is interrupted by an external force, such as [[Dispel Magic]] being cast on a target’s physical or astral form, the target is immediately and harmlessly returned to their physical body.
If a target’s astral form is slain, the silver cord immediately rips them back to their physical body; the strain requires them to attempt a [[Fortitude]] save with the same DC as the ritual’s primary check. On a failure, the creature dies; on a success, they become [[Clumsy]] 2, [[Drained]] 2, [[Doomed]] 2, and [[Enfeebled]] 2 for 1 week; these conditions can’t be removed or reduced by any means until the week has passed.
A target’s physical body remains in suspended animation for the duration of the ritual, but if it is destroyed, they die and their astral form also vanishes.
This ritual only projects a portion of the targets’ consciousnesses onto the Astral Plane. To travel physically to the Astral Plane (to reach the Outer Planes, for example) requires spells such as [[Plane Shift]].
{{||ActionSuccessTable}}
Surviving in hostile terrain has given you a great talent for mobility.
Whenever you roll a success on an [[Athletics]] check to [[Climb]] or [[Swim]], you get a critical success instead.
{{||SpellSummaryTable}}
Your body fills with physical power and skill.
You gain a +10-foot status bonus to [[Speed]] and a +2 status bonus to [[Athletics]] checks.
As a part of Casting this Spell, you can use a [[Stride]], [[Leap]], [[Climb]], or [[Swim]] action. The spell’s bonuses apply during that action.
You know how to calculatedly manipulate joints and body weight.
In addition to using [[Devise a Stratagem]] to modify a [[Strike]], you can use it to modify a [[Disarm]], [[Grapple]], [[Shove]], or [[Trip]] attempt, substituting your Devise a Stratagem roll for the [[Athletics]] check.
You must apply the substitution to the first eligible attack you make, whether it’s a Strike or one of the Athletics actions.
You can also use your [[Intelligence]] modifier instead of [[Strength]] for the [[Athletics]] check when you substitute your Devise a Stratagem roll, unless you’re using a weapon for the maneuver and the weapon doesn’t fit the restrictions for using Intelligence with a stratagem.
''Key Ability'' [[Strength]].
Athletics allows you to perform deeds of physical prowess. When you use the [[Escape]] basic action, you can use your Athletics modifier instead of your unarmed attack modifier.
{{||SkillActionList}}
{{||SkillFeatList}}
{{||RitualSummaryTable}}
''Cost'' Rare incense and offerings worth a total value of 20 gp times the target's level.
''Restrictions'' Any secondary caster must be the target, and must use the same skill as used by the primary caster.
This ritual uses [[Nature]] if the target is a druid, and [[Religion]] in all other cases.
You attempt to help a truly penitent creature atone for its misdeeds, typically actions contrary to your deity’s alignment or anathema to your deity. If the creature isn’t truly penitent, the outcome is always a critical failure.
{{||ActionSuccessTable}}
''Heightened (5th)'' Increase the maximum target level by 2 and the base cost by 20 gp.
An attached weapon can be affixed to an item with 10 minutes of work and a successful DC 10 Crafting check; this includes the time needed to remove the weapon from a previous item, if necessary.
An attached weapon must be combined with another piece of gear to be used. The trait lists what type of item the weapon must be attached to.
You must be wielding or wearing the item the weapon is attached to in order to attack with it.
For example, shield spikes are attached to a shield, allowing you to attack with the spikes instead of a shield bash, but only if you’re wielding the shield.
An attached weapon is usually bolted onto or built into the item it’s attached to, and typically an item can have only one weapon attached to it.
An attached weapon can be affixed to an item with 10 minutes of work and a successful DC 10 [[Crafting]] check; this includes the time needed to remove the weapon from a previous item, if necessary.
If an item is destroyed, its attached weapon can usually be salvaged.
Actions with the Attack trait can affect and be affected by your [[Multiple Attack Penalty]].
//You can't use an [[Open]] action after an [[Attack]] action in the same turn.//
''Trigger'' A creature within the monster’s reach uses a <<tag Manipulate>>action or a <<tag Move>>action, makes a ranged attack, or leaves a square during a move action it’s using.
The creature attempts a melee [[Strike]] against the triggering creature.
If the attack is a critical hit and the trigger was a <<tag Manipulate>>action, the creature disrupts that action.
This Strike doesn’t count toward the user’s [[Multiple Attack Penalty]], and its multiple attack penalty doesn’t apply to this Strike.
You gain [[Attack of Opportunity]].
{{LOWGFeat}}
You become attuned to the stone around you.
When in contact with a stone surface, you gain [[Tremorsense]] ([[Imprecise]]) 5 feet along that surface, and you can activate your ka stone to cast [[Meld into Stone]].
Auditory spells rely on sound.
A spell with the auditory trait has its effect only if the target can hear it.
This is different from a sonic effect, which still affects targets who can’t hear it (such as deaf targets) as long as the effect makes sound.
//Being [[Deafened]] grants immunity to Auditory effects.//
You open vestigial eyes, unfurl tympanic flaps of skin, or otherwise enhance your senses.
Until the start of your next turn, you gain the following benefits: you can’t be flanked; when you [[Seek]] for creatures, you can scan a 60-foot cone or a 30-foot burst instead of the normal area; and when you [[Seek]] for hidden objects, you can search a 15-foot square instead of the normal area.
{{||SpellSummaryTable}}
You augment the abilities of a summoned creature.
The target gains a +1 status bonus to all checks (this also applies to the creature’s DCs, including its AC) for the duration of its summoning, up to 1 minute.
{{||SpellSummaryTable}}
You gain a vague glimpse of the future.
During the casting of this spell, ask about the results of a particular course of action.
The spell can predict results up to 30 minutes into the future and reveals the GM’s best guess among the following outcomes:
* ''Weal'' The results will be good.
* ''Woe'' The results will be bad.
* ''Weal and Woe'' The results will be a mix of good and bad.
* ''Nothing'' There won’t be particularly good or bad results.
The GM rolls a secret DC 6 flat check. On a failure, the result is always “nothing.” This makes it impossible to tell whether a “nothing” result is accurate.
If anyone asks about the same topic as the first casting of augury during an additional casting, the GM uses the secret roll result from the first casting. If circumstances change, though, it’s possible to get a different result.
An aura automatically affects everything within a specified [[Emanation]] around the user.
The user doesn’t need to spend actions on the aura.
The aura’s effects are applied at specific times, such as when a creature ends its turn in the aura or when creatures enter the aura.
If an aura does nothing but deal damage, its entry lists only the radius, damage, and saving throw. Such auras deal this damage to a creature when the creature enters the aura and when a creature starts its turn in the aura. A creature can take damage from the aura only once per round.
The GM might determine that a monster’s aura doesn’t affect its own allies. For example, a creature might be immune to a monster’ [[Frightful Presence]] if they have been around each other for a long time.
''Prerequisites'' Tenets of Good.
You stand strong in the face of danger and inspire your allies to do the same.
Whenever you become [[Frightened]], reduce the condition value by 1 (to a minimum of 0).
At the end of your turn when you would reduce your frightened condition value by 1, you also reduce the value by 1 for all allies within 15 feet.
''Prerequisites'' tenets of evil.
Your presence as an avatar of evil makes your foes more susceptible to terror and makes it almost impossible for them to shake off fear when you are near.
Enemies within 15 feet of you take a –1 circumstance penalty to saving throws against <<tag Fear>>.
In addition, an enemy that ends its turn within 15 feet of you can’t reduce the value of its [[Frightened]] condition below 1.
''Prerequisites'' tenets of good
You radiate an aura of pure belief that imbues your attacks and those of nearby allies with holy power.
Your [[Strike]]s deal an extra 1 good damage against evil creatures.
Also, each good-aligned ally within 15 feet gains this benefit on their first Strike that hits an evil creature each round.
Your aura protects against necromantic effects.
You and all allies within 15 feet gain resistance 5 to <<tag Negative>> energy and a +1 status bonus to saves against <<tag Necromancy>> effects.
Your aura protects against the twisting powers of aberrations.
You and all allies within 15 feet gain a +1 status bonus to [[Fortitude]] and [[Will]] saves against effects from aberrations.
You also gain a +1 status bonus to [[Fortitude]] saves against <<tag Morph>> or <<tag Polymorph>> effects and [[Will]] saves against <<tag Mental>> effects; this bonus increases to +2 against aberrations’ morph, polymorph, or mental effects.
''Prerequisites'' tenets of good.
Your righteous aura dampens evil’s might.
You and all allies within 15 feet gain <<tag Evil>> resistance 5.
You are a paragon of all that is good, your overwhelming aura causing evildoers to cower.
All <<tag Evil>> creatures within 15 feet of you take a –1 status penalty to checks and DCs that target you or your allies. This penalty is –2 against creatures you have taken an oath against (such as dragons if you have the [[Dragonslayer Oath]] feat).
You can choose to suppress or resume this aura as an action, which has the <<tag Concentrate>> trait.
''Requirements'' exalt.
When you call upon others to take retribution, you also guide their aim.
When you use [[Retributive Strike]], your allies who make [[Strike]]s take only a –2 penalty, instead of a –5 penalty.
''Prerequisites'' [[Divine Ally]] (steed).
Guided by your ongoing care, your steed has developed incredible intelligence and skill.
The mount you gained through the [[Divine Ally]] class feature is now a specialized animal companion.
You can select one of the usual specializations or the auspice specialization.
Auspice mounts gain the following benefits:
* Your companion is marked by your deity’s religious symbol as a sacred creature of your deity.
* Its proficiency rank in [[Religion]] increases to expert.
* It can speak the language associated with your deity’s servitors (Celestial for champions who follow the tenets of good).
* Its [[Intelligence]] modifier increases by 2 and its [[Wisdom]] modifier by 1.
''Prerequisites'' Expert in a skill with the [[Recall Knowledge]] action, [[Assurance]] in that skill.
You know basic facts off the top of your head.
Choose a skill you’re an expert in that has the Recall Knowledge action and for which you have the Assurance feat.
You can use the Recall Knowledge action with that skill as a free action once per round.
If you do, you must use Assurance on the skill check.
You can select this feat multiple times, choosing a different skill each time.
You can use Automatic Knowledge with any skills you have chosen, but you can still use Automatic Knowledge only once per round.
''Requirements'' You are wielding a melee weapon in two hands.
You attack all nearby adversaries.
Make a melee [[Strike]] with the required weapon against each enemy within your melee reach.
Each attack counts toward your [[Multiple Attack Penalty]], but don’t increase your penalty until you have made all your attacks.
{{||SpellSummaryTable}}
You transform into an avatar of your deity, assuming a [[Huge]] battle form. You must have space to expand or the spell is lost.
You have hands in this battle form and can take [[Manipulate]] actions.
You can Dismiss this spell.
You gain the following statistics and abilities regardless of which deity’s battle form you assume:
* AC = 25 + your level. Ignore your armor’s check penalty and Speed reduction.
* 30 temporary Hit Points.
* [[Darkvision]].
* One or more attacks specific to your deity’s battle form, which are the only attacks you can use. You’re trained with them. Your attack modifier is +33, and you use the listed damage. Melee attacks are [[Strength]] based (for the purposes of the [[Enfeebled]] condition, for example) unless they have the [[Finesse]] trait, and all ranged attacks are [[Dexterity]] based. Attacks that deal positive or negative damage don’t heal creatures.
* [[Athletics]] modifier of +35, unless your own is higher.
You also gain the specific abilities listed for your deity below:
* ''Abadar'' Speed 50 feet, burrow Speed 30 feet, immune to immobilized; Ranged {{OneAction}} crossbow (range increment 120 feet, reload 1), Damage 6d10+3 piercing.
* ''Achaekek'' Speed 70 feet, climb Speed 50 feet, ignore difficult terrain and greater difficult terrain; Melee {{OneAction}} mantis claw (agile, backswing, finesse, reach 15 feet, versatile P), Damage 6d8+6 slashing; Ranged {{OneAction}} spine volley (range 60 feet), Damage 6d6+3 piercing.
* ''Alseta'' Speed 40 feet, dimensional Speed 60 feet; Melee {{OneAction}} dagger (agile, finesse, reach 15 feet, thrown 40 feet, versatile P), Damage 6d6+6 piercing; Ranged {{OneAction}} portal toss (range 60 feet), Damage 6d6+3 bludgeoning. Can cast [[Dimension Door]] at will, with a range of 60 foot as a {{OneAction}} divine innate spell.
* ''Arazni'' Speed 70 feet, [[Air Walk]], immune to immobilized; Melee {{OneAction}} rapier (deadly 3d8, reach 15 feet), Damage 6d8+6 piercing; Ranged {{OneAction}} call blood (range 120 feet), Damage 6d6 persistent bleed damage.
* ''Asmodeus'' Speed 70 feet, air walk; Melee {{OneAction}} mace (reach 15 feet), Damage 6d10+6 bludgeoning; Ranged {{OneAction}} hellfire (range 120 feet), Damage 6d6+3 fire.
* ''Besmara'' Speed 40 feet, swim Speed 70 feet, immune to immobilized; Melee {{OneAction}} rapier (deadly 3d8, disarm, finesse, reach 15 feet), Damage 6d6+6 piercing; Ranged {{OneAction}} ship’s cannon (range 120 feet), Damage 6d6+3 bludgeoning.
* ''Brigh'' Speed 60 feet, immune to immobilized, [[Air Walk]]; Melee {{OneAction}} light hammer (agile, reach 15 feet, thrown 40 feet), Damage 6d6+6 bludgeoning; Ranged {{OneAction}} bolt of molten bronze (range 120 feet), Damage 6d8+3 fire.
* ''Calistria'' Speed 30 feet, fly Speed 70 feet; Melee {{OneAction}} whip (disarm, finesse, nonlethal, reach 20 feet), Damage 6d4+6 slashing; Ranged {{OneAction}} savored sting (range 60 feet), Damage 6d6+3 poison.
* ''Casandalee'' Speed 70 feet, [[Air Walk]], ignore difficult terrain and greater difficult terrain; Melee {{OneAction}} polytool (reach 15 feet), Damage 6d6+6 slashing; Ranged {{OneAction}} logic blast (range 120 feet), Damage 6d6+3 mental.
* ''Cayden Cailean'' Speed 70 feet, air walk, ignore difficult terrain and greater difficult terrain; Melee {{OneAction}} rapier (deadly, reach 15 feet), Damage 6d6+6 piercing; Ranged {{OneAction}} ale splash (range 120 feet), Damage 6d6+3 poison.
* ''Chaldira'' Speed 70 feet, [[Air Walk]], immune to immobilized; Melee {{OneAction}} shortsword (agile, finesse, reach 15 feet, versatile S), Damage 6d6+6 piercing; Ranged {{OneAction}} fistful of buttons (nonlethal, range 120 feet), Damage 6d6+3 bludgeoning.
* ''Desna'' Speed 30 feet, fly Speed 70 feet; Melee {{OneAction}} starknife (agile, deadly, finesse, reach 15 feet, silver, thrown 60 feet), Damage 6d4+6 piercing; Ranged {{OneAction}} moonbeam (range 120 feet, silver), Damage 6d6+3 fire.
* ''Erastil'' Speed 70 feet, air walk, ignore difficult terrain and greater difficult terrain; Ranged {{OneAction}} longbow (deadly d8, range increment 150 feet), Damage 6d8+3 piercing.
* ''Ghlaunder'' Speed 30 feet, fly Speed 70 feet; Melee {{OneAction}} proboscis (agile, reach 20 feet), Damage 6d6+6 piercing plus 3d6 persistent bleed.
* ''Gorum'' Speed 70 feet, immune to immobilized; Melee {{OneAction}} greatsword (versatile P, reach 15 feet), Damage 6d12+6 slashing.
* ''Gozreh'' no land Speed, fly Speed 70 feet, swim Speed 70 feet; ignore difficult terrain and greater difficult terrain; Melee {{OneAction}} waves (bull rush, reach 15 feet, thrown 20 feet), Damage 6d8+6 bludgeoning; Ranged {{OneAction}} wind (versatile electricity, range 120 feet), Damage 6d6+3 bludgeoning.
* ''Grandmother Spider'' Speed 70 feet, climb Speed 70 feet, immune to immobilized; Melee {{OneAction}} leg (deadly 3d8, finesse, reach 15 feet, versatile P), Damage 6d6+6 bludgeoning; Ranged {{OneAction}} venom web (range 120 feet), Damage 6d6+3 poison.
* ''Groetus'' Speed 70 feet, [[Air Walk]], ignore difficult terrain and greater difficult terrain; Melee {{OneAction}} war flail (disarm, reach 15 feet, sweep, trip), Damage 6d10+6 bludgeoning; Ranged {{OneAction}} dreadful thought (range 120 feet), Damage 6d6+3 mental.
* ''Gruhastha'' Speed 50 feet, fly Speed 70 feet; Melee {{OneAction}} fist (agile, finesse, nonlethal, reach 15 feet), Damage 6d6+6 bludgeoning; Ranged {{OneAction}} arrow of enlightenment (deadly 3d10, range increment 120 feet), Damage 6d6+3 piercing.
* ''Hei Feng'' Speed 70 feet, [[Air Walk]], ignore difficult terrain and greater difficult terrain; Melee {{OneAction}} drunken sword (forceful, reach 15 feet), Damage 4d6+6 slashing plus 1d6 electricity splash damage; Ranged {{OneAction}} storm surge (range 120 feet, air, water), Damage 4d6+3 bludgeoning plus 1d6 electricity splash damage. The caster is immune to this splash damage.
* ''Iomedae'' Speed 70 feet, air walk; shield (15 Hardness, can’t be damaged); Melee {{OneAction}} longsword (versatile P, reach 15 feet), Damage 6d8+6 slashing.
* ''Irori'' Speed 80 feet, air walk; Melee {{OneAction}} unfettered strike (agile, versatile P or S, finesse, reach 15 feet), Damage 6d8+6 bludgeoning; Ranged {{OneAction}} wind strike (range 60 feet), Damage 6d4+6 bludgeoning.
* ''Kazutal'' Speed 60 feet, ignore difficult terrain; Melee {{OneAction}} machete (agile, reach 15 feet), Damage 6d6+6 slashing; Ranged {{OneAction}} jaguar pounce (range 60 feet); Damage 5d6+3 piercing plus 1d6 persistent bleed.
* ''Kurgess'' Speed 70 feet, climb Speed 50 feet, swim Speed 50 feet, immune to immobilized; Melee {{OneAction}} lashing chain (disarm, reach 20 feet, trip), Damage 6d6+6 bludgeoning; Ranged {{OneAction}} javelin (range increment 60 feet, thrown), Damage 6d6+3 piercing.
* ''Lamashtu'' Speed 30 feet, fly Speed 70 feet; Melee {{OneAction}} falchion (forceful, reach 15 feet), Damage 6d10+6 slashing; Ranged {{OneAction}} waters of Lamashtu (range 120 feet), Damage 6d6+3 poison.
* ''Milani'' Speed 50 feet, fly Speed 70 feet; shield (15 Hardness, can’t be damaged); Melee {{OneAction}} morningstar (versatile P, reach 15 feet), Damage 6d8+6 bludgeoning.
* ''Nethys'' Speed 70 feet, air walk; Ranged {{OneAction}} raw magic (range 120 feet; versatile cold, electricity, or fire), Damage 6d6 force.
* ''Nivi Rhombodazzle'' Speed 50 feet, burrow Speed 30 feet, immune to immobilized; Melee {{OneAction}} returning light hammer (agile, thrown 40 feet), Damage 6d6+6 bludgeoning.
* ''Nocticula'' Speed 70 feet, fly Speed 70 feet; Melee {{OneAction}} tail stinger (agile, finesse, reach 15 feet, trip), Damage 6d6+6 slashing; Ranged {{OneAction}} magnanimous smile (nonlethal, range 120 feet, visual), Damage 6d6+3 mental.
* ''Norgorber'' Speed 70 feet, air walk, ignore difficult terrain and greater difficult terrain; Melee {{OneAction}} shortsword (agile, finesse, versatile S, reach 15 feet), Damage 6d6+6 piercing; Ranged {{OneAction}} blackfinger toss (range 120 feet), Damage 6d6+3 poison.
* ''Pharasma'' Speed 70 feet, air walk; Melee {{OneAction}} dagger (agile, finesse, reach 15 feet, thrown 40 feet), Damage 6d6+6 slashing; Ranged {{OneAction}} spiral blast (range 120 feet, damages only undead), Damage 6d8+3 positive.
* ''Rovagug'' Speed 50 feet, burrow Speed 30 feet, immune to immobilized; Melee {{OneAction}} jaws (reach 15 feet), Damage 6d12+6 piercing; Melee {{OneAction}} leg (agile, versatile P, reach 15 feet), Damage 6d8+6 bludgeoning.
* ''Sarenrae'' Speed 30 feet, fly Speed 70 feet; Melee {{OneAction}} scimitar (forceful, nonlethal, reach 15 feet), Damage 6d6+6 slashing; Ranged {{OneAction}} everflame (nonlethal, range 120 feet), Damage 6d6+3 fire.
* ''Shelyn'' Speed 70 feet, air walk, ignore difficult terrain and greater difficult terrain; Melee {{OneAction}} glaive (deadly d8, nonlethal, reach 20 feet), Damage 6d8+6 slashing; Ranged {{OneAction}} melody of inner beauty, (nonlethal, range 120 feet), Damage 6d6+3 sonic.
* ''Shizuru'' Speed 70 feet, air walk, ignore difficult terrain and greater difficult terrain; Melee {{OneAction}} katana (deadly 3d8, two-hand d10, reach 15 feet, versatile P), Damage 6d6+6 slashing; Ranged {{OneAction}} sunbolt arrow (range 120 feet), Damage 6d6+3 fire.
* ''Sivanah'' Speed 70 feet, air walk, ignore difficult terrain and greater difficult terrain; Melee {{OneAction}} bladed scarf (disarm, finesse, reach 15 feet, trip), Damage 6d8+6 slashing; Ranged {{OneAction}} illusory assault (range 120 feet), Damage 6d6+3 mental.
* ''Torag'' Speed 50 feet, burrow Speed 30 feet, immune to immobilized; shield (15 Hardness, can’t be damaged); Melee {{OneAction}} warhammer (bull rush, reach 15 feet), Damage 6d8+6 bludgeoning.
* ''Tsukiyo'' Speed 70 feet, air walk, ignore difficult terrain and greater difficult terrain; Melee {{OneAction}} longspear (reach 20 feet), Damage 6d10+6 piercing; Ranged {{OneAction}} moonbeam (nonlethal, range 120 feet, silver), Damage 6d6+3 mental.
* ''Urgathoa'' Speed 70 feet, air walk; Melee {{OneAction}} scythe (deadly d10, trip, reach 15 feet), Damage 6d10+6 slashing; Ranged {{OneAction}} pallid plague (range 120 feet), Damage 6d6+3 negative.
* ''Zon-Kuthon'' Speed 70 feet, air walk, ignore difficult terrain and greater difficult terrain; Melee {{OneAction}} spiked chain (disarm, trip, reach 15 feet), Damage 6d8+6 slashing; Ranged {{OneAction}} midnight pain (mental, nonlethal, range 120 feet), Damage 6d6+3 mental.
{{BattleFormWithHands}}
Your extensive service has made you a lesser herald of your deity, which affords you certain privileges.
First, any creature you encounter knows instinctively that you speak for your deity.
Second, if you conduct the [[Commune]] ritual to contact your deity, you don’t have to pay any cost and you automatically get a critical success.
Third, once per day, you can cast [[Plane Shift]] as a divine innate spell, but only to travel to the realm of your deity. When you cast it this way, its casting time is 1 minute, your religious symbol is a sufficient tuning fork for this spell, and you appear exactly where you want to be.
If you’re in your deity’s realm due to this spell, you can return to the point you left when you cast it by spending a single action, which has the <<tag Concentrate>> and <<tag Divine>> traits..
''Frequency'' once every 10 minutes.
''Requirements'' You are adjacent to an ally with the [[Dying]] condition.
Though you know that you will eventually outlive your companions, seeing them at death's door brings clarity to your attacks.
Make a [[Strike]]. Roll twice on the attack roll and use the higher result.
{{LOCGFeat}}
''Frequency'' once per day
''Trigger'' An ally within 30 feet gains the [[Dying]] condition.
You honor your ally’s life, gaining temporary Hit Points equal to your level for 1 minute.
As long as you have these temporary Hit Points, you gain a +1 circumstance bonus to attack and damage rolls.
You avert your gaze from danger.
You gain a +2 circumstance bonus to saves against [[Visual]] abilities that require you to look
at a creature or object, such as a [[Medusa]]’s petrifying gaze.
Your gaze remains averted until the start of your next turn.
You attempt a [[Stealth]] check to avoid notice while traveling at half speed.
If you have the [[Swift Sneak]] feat, you can move at full Speed rather than half, but you still can’t use another exploration activity while you do so.
If you have the [[Legendary Sneak]] feat, you can move at full Speed and use a second exploration activity.
If you’re Avoiding Notice at the start of an encounter, you usually roll a Stealth check instead of a Perception check both to determine your initiative and to see if the enemies notice you (based on their Perception DCs, as normal for Sneak, regardless of their initiative check results).
{{||RitualSummaryTable}}
''Cost'' Herbs based on the level of the animal:
| !Creature Level | !Spell Level | !Cost (gp) |
|-1 or 0 |2 |3 |
|1 |2 |12 |
|2 |3 |21 |
|3 |3 |36 |
|4 |4 |60 |
|5 |4 |96 |
|6 |5 |150 |
|7 |5 |216 |
|8 |6 |300 |
|9 |6 |420 |
|10 |7 |600 |
|11 |7 |840 |
|12 |8 |1200 |
|13 |8 |1800 |
|14 |9 |2700 |
|15 |9 |3400 |
|16 |10 |6000 |
|17 |10 |9000 |
You grant intelligence to the target, transforming it into a <<tag Beast>>.
If it was previously an animal companion or minion, it can no longer serve as one.
{{||ActionSuccessTable}}
Your attacks are so powerful, they can flatten your opponents.
When you use [[Knockback]], you can attempt an [[Athletics]] check against your target’s [[Fortitude]] DC.
{{||ActionSuccessTable}}
When you are climbing a wooden surface and have a hatchet or battle axe in each hand, you have a climb Speed equal to half your normal Speed.
You must still have both legs available to climb and can’t use either of the axes in combat while climbing.
This feat can also be used to climb a surface of ice if you have a light pick in each hand.
You have mastered the weight and balance of a variety of axes and can lob them with ease.
Any one-handed axe weapon you wield has the thrown trait with a range of 10 feet. For axes that already have the thrown trait, the range increases by 10 feet.
When you critically succeed at an attack roll with a thrown axe weapon, you apply the axe’s critical specialization effect.
''Usage'' etched onto a weapon without an [[Anarchic]] rune.
''Craft Requirements'' You are lawful.
Complex and symmetrical, an axiomatic rune imbues a weapon with lawful energy.
A weapon with this rune deals an additional 1d6 <<tag Lawful>> damage against <<tag Chaotic>> targets.
If you are chaotic, you are enfeebled 2 while carrying or wielding this weapon.
When you critically succeed at an attack roll with this weapon against a chaotic creature, instead of rolling, count each weapon damage die as average damage rounded up (3 for d4, 4 for d6, 5 for d8, 6 for d10, 7 for d12).
You possess a strong understanding of process among mortals and lawful outsiders alike. The source of this knowledge might be intuition, study, or a childhood spent among other aphorites.
You gain the trained proficiency rank in [[Diplomacy]] and [[Society]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Axis [[Lore]].
You gain [[Plane Shift]] as a primal innate spell.
You can cast it twice per week.
This can be used only to travel back and forth between the Plane of Earth and the Material Plane.
You can act as the spell focus, and you do not require a tuning fork.
You have learned the history and origins of your people and how to connect to both your land and sea heritage.
You become trained in [[Athletics]] and [[Nature]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Azarketi [[Lore]].
You can cast [[Purify Food and Drink]] as a primal innate spell, but only on liquids.
You can cast this spell once every 10 minutes.
You can also use your innate purify food and drink on a touched creature instead of a liquid to purify their blood, giving that creature a +2 status bonus for 1 minute on their ongoing saves against poisons already present in their body when you cast the spell.
You gain a 30 foot [[Swim]] speed.
You become familiar with using your weapons both in and out of water.
Whenever you critically hit using an azarketi weapon or one of the weapons listed in [[Azarketi Weapon Familiarity]], you apply the weapon’s critical specialization effect.
Your mastery with weapons both above and below water is unmatched.
Whenever you gain a class feature that grants you expert or greater proficiency in certain weapons, you also gain that proficiency in crossbows, hand crossbows, longspears, spears, tridents, and all azarketi weapons in which you are trained.
You are familiar with weapons that excel underwater.
You are trained with [[Crossbows]], hand crossbows, [[Longspear]]s, [[Spear]]s, and [[Trident]]s.
In addition, you gain access to all uncommon azarketi weapons.
For the purpose of determining your proficiency, martial azarketi weapons are simple weapons and advanced azarketi weapons are martial weapons.
This family of celestials is native to Elysium.
They are chaotic good and have [[Darkvision]] and a weakness to evil and cold iron.
Your lineage traces back to the realm of Elysium, and you can harness its magic using this connection.
You can cast [[Glitterdust]] and [[Remove Paralysis]] each once per day as 2nd-level divine innate spells.
You excel at watching your allies’ backs and helping them watch yours.
As long as you and an ally are adjacent to each other, neither of you can become [[Flat-Footed]] due to [[Flanking]] unless both of you are flanked.
If you’re adjacent to more than one ally, all eligible allies can benefit at a given time.
The benefit is negated for everyone if at least you and any one eligible ally are flanked, but not if your allies are flanked and you aren’t.
//Backgrounds describe your character's origin before adventuring.//
//Backgrounds contain setting material which is not OGL or usable under community use. Thus, they are listed here by name only.//
//Each Background usually offers a free stat boost; a boost of one other stat from a choice of two; Trained level in a regular skill and a [[Lore]] subskill; and a skill feat.//
Sort by: <$button set="!!sort-type" setTo="title">Name</$button>
<$button set="!!sort-type" setTo="bg-skill">Skill</$button>
<$button set="!!sort-type" setTo="bg-lore">Lore</$button>
<$button set="!!sort-type" setTo="bg-feat">Feat</$button>
<table>
<tr><th>Background</th><th>Stat 1</th><th>Stat 2</th><th>Skill</th><th>Lore</th><th>Feat</th></tr>
<$list filter="[tag[Background]sort{!!sort-type}]">
<tr><th><$link/></th>
<td><$link to={{!!bg-stata}}/></td>
<td><$link to={{!!bg-statb}}/></td>
<td><$list filter="[list[!!bg-skill]]"><$link/> </$list></td>
<td>{{!!bg-lore}}</td>
<td><$link to={{!!bg-feat}}/></td>
</tr>
</$list>
</table>
//The descriptions of backgrounds frequently contain non-OGL setting material and are not included here. This background is found in {{!!bg-src}}.//
| !Stat Choices | {{!!bg-stata}} {{!!bg-statb}} |
| !Skill | {{!!bg-skill}} |
| !Lore | {{!!bg-lore}} |
| !Feat | <$link to={{!!bg-feat}} /> |
When you hit a [[Flat-Footed]] creature, this weapon deals 1 precision damage in addition to its normal damage.
The precision damage increases to 2 if the weapon is a +3 weapon.
You can use the momentum from a missed attack with this weapon to lead into your next attack.
After missing with this weapon on your turn, you gain a +1 circumstance bonus to your next attack with this weapon before the end of your turn.
{{LOCGFeat}}
You have a specific disguise that you keep at the ready, worn underneath your outer garment.
You can change into this disguise to [[Impersonate]] as a 3-action activity. If you have master proficiency in [[Deception]], it is instead a 2-action activity, and if you have legendary proficiency, it is a single action.
You can create a new backup disguise by spending the normal amount of time it takes you to Impersonate, but you can have only one backup disguise at a time.
Having a backup disguise doesn’t allow you to remove your armor or any other complex piece of clothing any more quickly, but once you have those off, the disguise is readily available.
Because you have the backup disguise at the ready, it’s possible that a thorough search might reveal some elements of the disguise (see [[Conceal an Object]] in the [[Stealth]] skill).
''Size'' Small
''Melee'' {{OneAction}} jaws, damage 1d8 piercing
''Melee'' {{OneAction}} claw ([[Agile]]), Damage 1d6 slashing
''Str'' +2, ''Dex'' +2, ''Con'' +2, ''Int'' –4, ''Wis'' +2, ''Cha'' +0
''Hit Points'' 8
''Skill'' [[Survival]]
''Senses'' [[Low-Light Vision]], [[Scent]] (imprecise, 30 feet)
''Speed'' 25 feet, burrow 10 feet, climb 10 feet
''Support Benefit'' Your badger digs around your foe’s position, interfering with its footing. Until the start of your next turn, if you hit and deal damage to a creature your badger threatens, the target can’t use a Step action (unless it can Step through difficult terrain) until it moves from its current position.
''Advanced Maneuver'' [[Badger Rage]]
The badger enters a state of pure rage that lasts for 1 minute, until there are no enemies it can perceive, or until it falls [[Unconscious]], whichever comes first.
It can’t voluntarily stop raging.
While raging, the badger is affected in the following ways.
* It deals 4 additional damage with its bite attacks and 2 additional damage with its claw attacks.
* It takes a –1 penalty to AC.
* It can’t use actions that have the <<tag Concentrate>> trait unless they also have the <<tag Rage>> trait. The animal companion can [[Seek]] even while raging.
After it has stopped raging, it can’t use Badger Rage again for 1 minute.
You can [[Hustle]] twice as long while exploring before you have to stop, and you treat environmental heat effects as if they were one step less extreme (incredible heat becomes extreme, extreme heat becomes severe, and so on).
Though it appears to be a cloth sack decorated with panels of richly colored silk or stylish embroidery, a bag of holding opens into an extradimensional space larger than its outside dimensions.
The Bulk held inside the bag doesn’t change the Bulk of the bag of holding itself.
The amount of Bulk the bag’s extradimensional space can hold depends on its type.
You can [[Interact]] with the bag of holding to stow items in it or remove them just like a mundane sack.
Though the bag can hold a great amount of material, an object still needs to be able to fit through the opening of the sack to be stored inside.
If the bag is overloaded or broken, it ruptures and is ruined, causing the items inside to be lost forever.
If it’s turned inside out, the items inside spill out unharmed, but the bag must be put right before it can be used again.
A living creature placed inside the bag has enough air for 10 minutes before it begins to suffocate, and it can attempt to [[Escape]] against a DC of 13.
An item inside the bag provides no benefits unless it’s retrieved first.
An item in the bag can’t be detected by magic that detects only things on the same plane.
| !Type | !Level | !Price | !Capacity |
| I | 4 | 750 | 25 Bulk |
| II | 7 | 3000 | 50 Bulk |
| III | 11 | 12000 | 100 Bulk |
| IV | 13 | 24000 | 150 Bulk |
''Requirements'' You are in a square that contains a narrow surface, uneven ground, or another similar feature.
You move across a narrow surface or uneven ground, attempting an [[Acrobatics]] check against its Balance DC.
You are [[Flat-Footed]] while on a narrow surface or uneven ground //unless you have [[Steady Balance]]//.
{{||ActionSuccessTable}}
//If you have [[Steady Balance]], then whenever you roll a success using the Balance action, you get a critical success instead.//
{{||SpellSummaryTable}}
You transform the target creature into a harmless animal appropriate to the area, with effects based on its [[Fortitude]] save.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You fill the minds of your enemies with doubt.
Targets that fail their [[Will]] saves take a –1 status penalty to attack rolls as long as they are in the area.
Once per turn, starting the turn after you cast bane, you can use a single action, which has the [[Concentrate]] trait, to increase the emanation’s radius by 5 feet and force enemies in the area that weren’t yet affected to attempt another saving throw.
Bane can counteract [[Bless]].
''Trigger'' You use your champion’s reaction, triggered by a fiend within your reach.
The erratic teleportation magic you //have// experienced in the has taught you a few tricks.
You attempt an [[Athletics]] check to [[Shove]] the fiend that triggered your champion’s reaction; on a success, the target can’t teleport or summon creatures for 1 minute.
On a critical success, the target is also [[Stunned]] 1 and can’t teleport or summon creatures for 1 hour, and if you are on your home plane and the target is a <<tag Fiend>> of level 18 or lower from another plane, it is also banished to its home plane.
Your [[Multiple Attack Penalty]] doesn’t apply to this attack.
{{||SpellSummaryTable}}
You send the target back to its home plane.
The target must attempt a [[Will]] save.
You can spend an extra action while [[Casting this Spell|Cast a Spell]] and add a material component to give the creature a –2 circumstance penalty to its save. The component must be a specially gathered object that is anathema to the creature, and not from a spell component pouch.
This spell fails if you aren’t on your home plane when you cast it.
''Heightened (9th)'' You can target up to 10 creatures. The extra material component affects targets to which it is anathema.
{{||SaveSuccessTable}}
!! Splats
<$list filter="[tag<currentTiddler>tag[Splat]]" />
!! Class Features
| !Level | !Features |
| 1 | [[Rage]], Instinct |
| 2 | |
| 3 | [[Deny Advantage]] |
| 4 | |
| 5 | [[Brutality]] |
| 6 | |
| 7 | [[Juggernaut]], [[Weapon Specialization]] |
| 8 | |
| 9 | [[Lightning Reflexes]], [[Raging Resistance]] |
| 10 | |
| 11 | [[Mighty Rage]] |
| 12 | |
| 13 | [[Greater Juggernaut]], [[Medium Armor Expertise]], [[Weapon Fury]] |
| 14 | |
| 15 | [[Greater Weapon Specialization]], [[Indomitable Will]] |
| 16 | |
| 17 | [[Heightened Senses]], [[Quick Rage]] |
| 18 | |
| 19 | [[Armor of Fury]], [[Devastator]] |
| 20 | |
!! Class Feats
{{||ClassFeatList}}
You become trained in [[Athletics]]; if you were already trained in Athletics, you instead become trained in a skill of your choice.
You become trained in barbarian class DC.
You can use the [[Rage]] action.
Choose an Instinct as you would if you were a barbarian. You have that instinct for all purposes and become bound by its anathema, but you don’t gain any of the other abilities it grants.
!! Instincts
<$list filter="[tag[Barbarian]tag[Splat]]" />
<<levelfeatlist "4 6 12" "[tag[Archetype]field:feat-arch[Barbarian]]">>
''Prerequisites'' Class granting no more Hit Points per level than 10 + your Constitution modifier.
You gain 3 additional Hit Points for each barbarian archetype class feat you have.
As you continue selecting barbarian archetype class feats, you continue to gain additional Hit Points in this way.
!! Splats
<$list filter="[tag<currentTiddler>tag[Splat]]" />
!! Class Features
| !Level | !Features |
| 1 | [[Occult Spellcasting]], [[Composition Spells]], [[Inspire Courage]], [[Counter Performance]], Muse, 5 cantrips, 2 1st level slots and spells |
| 2 | +1 1st level slot and spell |
| 3 | 2 2nd level slots and spells, [[Lightning Reflexes]], [[Signature Spells]] |
| 4 | +1 2nd level slot and spell |
| 5 | 2 3rd level slots and spells |
| 6 | +1 3rd level slot and spell |
| 7 | 2 4th level slots and spells, [[Expert Spellcaster]] |
| 8 | +1 4th level slot and spell |
| 9 | 2 5th level slots and spells, [[Great Fortitude]], [[Resolve]] |
| 10 | +1 5th level slot and spell |
| 11 | 2 6th level slots and spells, [[Bard Weapon Expertise]], [[Vigilant Senses]] |
| 12 | +1 6th level slot and spell |
| 13 | 2 7th level slots and spells, [[Light Armor Expertise]], [[Weapon Specialization]] |
| 14 | +1 7th level slot and spell |
| 15 | 2 8th level slots and spells, [[Master Spellcaster]] |
| 16 | +1 8th level slot and spell |
| 17 | 2 9th level slots and spells, [[Greater Resolve]] |
| 18 | +1 9th level slot and spell |
| 19 | [[Legendary Spellcaster]], [[Magnum Opus]] |
| 20 | |
!! Class Feats
{{||ClassFeatList}}
You cast spells like a bard and gain the [[Cast a Spell]] activity.
You gain a spell repertoire with two common cantrips from the occult spell list, or any other cantrips you learn or discover.
You’re trained in spell attack rolls and spell DCs for occult spells.
Your key spellcasting ability for bard archetype spells is [[Charisma]], and they are occult bard spells.
You become trained in [[Occultism]] and [[Performance]]; for each of these skills in which you were already trained, you instead become trained in a skill of your choice.
Choose a muse as you would if you were a bard. You have that muse for all purposes, allowing you to take that muse’s feats, but you don’t gain any of the other abilities it grants.
!! Muses
<$list filter="[tag[Bard]tag[Splat]]" />
<<levelfeatlist "4 6 8 12 18" "[tag[Archetype]field:feat-arch[Bard]]">>
You have become thoroughly adept with bardic weapons.
You gain expert proficiency in simple weapons, plus the [[Longsword]], [[Rapier]], [[Sap]], [[Shortbow]], [[Shortsword]], and [[Whip]].
When you critically succeed at an attack roll using one of these weapons while one of your compositions is active, you apply the [[Critical Specialization Effect]] for that weapon.
If you’re a [[Bard]] Casting a Spell from the [[Occult]] tradition while holding a musical instrument, you can __can usually play an instrument for spells requiring somatic or material components, as long as it takes at least one of your hands to do so. If you use an instrument, you don’t need a spell component pouch or another hand free. You can usually also play an instrument for spells requiring verbal components, instead of speaking.__
Your studies make you informed on every subject.
You are trained in Bardic [[Lore]], a special Lore skill that can be used only to [[Recall Knowledge]], but on any topic.
If you have legendary proficiency in [[Occultism]], you gain expert proficiency in Bardic Lore, but you can’t increase your proficiency rank in Bardic Lore by any other means.
''Prerequisites'' Trained in [[Diplomacy]].
You can [[Earn Income]] using Diplomacy, spending your days hunting for bargains and reselling at a profit.
You can also spend time specifically sniffing out a great bargain on an item; this works as if you were using Earn Income with Diplomacy, except instead of gaining money, you purchase the item at a discount equal to the money you would have gained, gaining the item for free if your earned income equals or exceeds its cost.
If you select Bargain Hunter during character creation at 1st level, you start play with an additional 2 gp.
You wield primal magic.
You can cast [[Barkskin]] and [[Entangle]] as 2nd-level primal innate spells once per day each.
{{||SpellSummaryTable}}
The target’s skin becomes covered in bark.
The target gains resistance 2 to bludgeoning and piercing damage and weakness 3 to fire.
After the target takes fire damage, it can [[Dismiss]] the spell as a free action triggered by taking the damage; doing so doesn’t reduce the fire damage the target was dealt.
''Heightened (+2)'' The resistances increase by 2, and the weakness increases by 3.
After you drink this bitter draft, your skin thickens like bark.
You gain the effects of a 2nd-level [[Barkskin]] spell for 10 minutes.
You rush forward, moving enemies aside to reach your foe.
You [[Stride]], attempting to move through your enemies’ spaces and make a melee [[Strike]].
Roll an [[Athletics]] check and compare the result to the [[Fortitude]] DC of each creature whose space you attempt to move through during your [[Stride]], moving through its space on a success but ending your movement before entering its space on a failure.
You can use Barreling Charge to Burrow, Climb, Fly, or Swim instead of Stride, as long as you have the corresponding movement type.
You smash, bust, and charge through solid obstacles without hesitation.
[[Stride]] twice.
Once during your movement, if your movement passes through or ends adjacent to a door, window, fence, wall, or similar obstacle, you can attempt an [[Athletics]] check to [[Force Open]] the obstacle with a +1 circumstance bonus to the roll; on a failure, your movement ends at that obstacle.
You gain a 1st- or 2nd- level Wizard feat.
<<levelfeatlist "1 2" "[tag[Class]tag[Wizard]]">>
{{MulticlassBasicSpellcasting}}
Each time you gain a spell slot of a new level from the bard archetype, add a common occult spell or another spell you learned or discovered to your repertoire, of the appropriate spell level.
You gain a 1st- or 2nd- level Sorcerer feat.
<<levelfeatlist "1 2" "[tag[Class]tag[Sorcerer]]">>
You gain your bloodline’s initial bloodline spell.
If you don’t already have one, you also gain a focus pool of 1 Focus Point, which you can [[Refocus]] without any special effort.
{{MulticlassBasicSpellcasting}}
You can prepare your deity's spells in your spell slots of the appropriate level from the cleric archetype.
You gain a 1st- or 2nd- level alchemist feat.
<<levelfeatlist "1 2" "[tag[Class]tag[Alchemist]]">>
You gain a 1st- or 2nd- level champion feat.
<<levelfeatlist "1 2" "[tag[Class]tag[Champion]]">>
You gain a 1st- or 2nd- level cleric feat.
<<levelfeatlist "1 2" "[tag[Class]tag[Cleric]]">>
{{MulticlassBasicSpellcasting}}
{{MulticlassBasicSpellcasting}}
Each time you gain a spell slot of a new level from this archetype, add a spell of the appropriate spell level to your repertoire, either a common spell of your chosen tradition or another spell of that tradition you have learned or discovered.
You gain a 1st- or 2nd- level barbarian feat.
<<levelfeatlist "1 2" "[tag[Class]tag[Barbarian]]">>
You gain a 1st- or 2nd- level Ranger feat.
<<levelfeatlist "1 2" "[tag[Class]tag[Ranger]]">>
You gain a 1st- or 2nd- level Monk feat.
<<levelfeatlist "1 2" "[tag[Class]tag[Monk]]">>
Your patron grants you a special lesson, revealing a hidden facet of its nature.
Choose a basic lesson from the list. You gain its associated hex, and your familiar learns the associated spell.
Increase the number of Focus Points in your focus pool by 1.
You gain a 1st- or 2nd- level Fighter feat.
<<levelfeatlist "1 2" "[tag[Class]tag[Fighter]]">>
You gain a 1st- or 2nd- level bard feat.
<<levelfeatlist "1 2" "[tag[Class]tag[Bard]]">>
{{LOWGFeat}}
You have learned limited divine magic from your Red Mantis training.
You gain the [[Cast a Spell]] activity.
You’re a prepared spellcaster,able to prepare two cantrips and one 1st-level spell each day. You prepare these spells from a Red Mantis assassin spellbook, similar to a wizard’s, containing three cantrips and two 1st-level spells.
All the spells in your Red Mantis assassin spellbook, from this and later feats, must be either <<tag Transmutation>> or <<tag Illusion>> spells from the arcane spell list or a spell from the following list: [[Clairaudience]], [[Clairvoyance]], [[Darkness]], [[Dimension Door]], [[Modify Memory]], [[Obscuring Mist]], [[Paralyze]], [[See Invisibility]], [[True Strike]].
Regardless of their usual magical tradition, your Red Mantis assassin spells are divine spells, as are any Red Mantis focus spells you gain.
You can prepare two cantrips and one 1st-level spell each day from those found in your Red Mantis assassin spellbook.
You’re trained in spell attack rolls and spell DCs for casting divine spells.
Your key spellcasting ability for these spells is [[Charisma]].
You have a vast and overflowing collection of scroll scraps, riddled with errors and misspellings and leaking energy like a sieve. With enough care, you can coax these scroll scraps into functioning—briefly.
Each day during your daily preparations, you can create a single temporary scroll containing a 1st-level spell. The spell must be a common spell from the Core Rulebook, or another spell you learned via [[Learn a Spell]], and it must come from a tradition in which you have the corresponding skill trained.
This scroll is an unstable, temporary item and loses its magic the next time you make your daily preparations if you haven’t already used it.
It can’t be used to Learn the Spell.
At 8th level, add a second temporary scroll containing a 2nd-level spell.
{{MulticlassBasicSpellcasting}}
Each time you gain a spell slot of a new level from the sorcerer archetype, add a spell of the appropriate spell level to your repertoire: a common spell of your bloodline’s tradition, one of your bloodline’s granted spells, or another spell you have learned or discovered.
You gain a 1st- or 2nd- level Rogue feat.
<<levelfeatlist "1 2" "[tag[Class]tag[Rogue]]">>
You gain a 1st- or 2nd- level Druid feat.
<<levelfeatlist "1 2" "[tag[Class]tag[Druid]]">>
{{MulticlassBasicSpellcasting}}
Each time you gain a spell slot of a new level from the wizard archetype, add two common spells of that level to your spellbook.
You are particularly skilled at using a shield in combat.
You gain the [[Reactive Shield]] fighter feat. This fulfills any prerequisites requiring Reactive Shield as normal.
<<archetypefeatlist "4 6 8 10 12" "Bastion">>
{{||MysterySummary}}
You are no stranger to the trappings of warfare. You are trained in medium and heavy armor. At 13th level, if you gain the [[Light Armor Expertise]] class feature, you also gain expert proficiency in these armors.
Choose one weapon group that embodies your mystery. You are trained in all martial weapons of that group. At 11th level, if you gain the [[Weapon Expertise]] class feature, you also gain expert proficiency for martial weapons in your chosen group, and you become trained in advanced weapons in that group..
!!! Curse of the Hero's Burden
''Minor Curse'' Your body languishes when you aren’t bringing harm to your foes. You take a –2 status penalty to AC and saving throws, but each time you make a Strike, you can suspend these penalties until the start of your next turn.
''Moderate Curse'' Making a Strike reduces the penalty from your minor curse to –1 rather than suspending it entirely. You gain a +2 status bonus to weapon and unarmed damage rolls. You also gain [[Fast Healing]] equal to half your level while in a non-trivial combat encounter.
''Major Curse'' Your body proves capable of truly heroic feats, but doing so interferes with your mental focus. Your moderate curse’s fast healing is equal to your level, and its damage bonus is +6. You gain a +1 status bonus to weapon and unarmed attack rolls, but you are [[Stupefied]] 2.
With careful observation during battle, you identify an enemy’s strengths and weaknesses.
The GM rolls a secret [[Perception]] check for you against the [[Deception]] or [[Stealth]] DC (whichever is higher) of an enemy of your choice who is not [[Concealed]] from you, [[Hidden]] from you, or [[Undetected]] by you, and who is engaged in combat.
The GM might apply a penalty for the distance between you and the enemy.
The enemy is then temporarily immune to your Battle Assessment for 1 day.
{{||ActionSuccessTable}}
''Prerequisites'' Master in [[Intimidation]]
When you roll [[Initiative]], you can yell a mighty battle cry and [[Demoralize]] an observed foe as a free action.
If you’re legendary in Intimidation, you can use a reaction to Demoralize your foe when you critically succeed at an attack roll.
''Prerequisites'' Trained in [[Medicine]]. __You are holding or wearing healer's tools.__
You can patch up yourself or an adjacent ally, even in combat.
Attempt a Medicine check with the same DC as for [[Treat Wounds]] and __restore a corresponding amount of Hit Points; this does not remove the [[Wounded]] condition.__
As with Treat Wounds, you can attempt checks against higher DCs if you have the minimum proficiency rank.
The target is then temporarily immune to your Battle Medicine for 1 day.
You are constantly drawing up plans and battle scenarios, assembling strategies and gathered intelligence for later use.
When you scout an enemy’s position or receive a detailed report from an ally who scouted the enemy’s position, if you have a clear indication of the number, position, and identities of your potential foes, you can spend 1 minute to come up with a battle plan that takes such potential factors into account and reduces the role luck plays in the equation.
Roll a [[Lore]] check. As long as the information was accurate and remains accurate when you roll [[Initiative]] against those enemies, you can use the Warfare Lore result you previously rolled for your initiative roll; if you do, this is a [[Fortune]] effect.
''Prerequisite'' You follow a deity.
Calling out to your deity, you recite scripture to harm a foe.
When you select this feat, choose <<tag Chaos>>, <<tag Evil>>, <<tag Good>>, or <<tag Law>>. Your choice must match one of your deity’s alignment components. This action has the trait corresponding to the chosen alignment.
Attempt a [[Religion]] check against the [[Will]] DC of a foe within 30 feet.
The foe is then temporarily immune to Battle Prayers from your deity for 1 day.
{{||ActionSuccessTable}}
You become trained in [[Intimidation]], and you gain the [[Intimidating Glare]] skill feat.
To you, a fight is a kind of performance art, and you command your foes’ attention with mesmerizing motions.
You are trained in [[Performance]] and gain the [[Fascinating Performance]] skill feat.
You gain panache during an encounter when the result of your Performance check to [[Perform]] exceeds the Will DC of an observing foe, even if the foe isn’t fascinated.
{{||SpellSummaryTable}}
''Trigger'' You are about to attempt a saving throw, but you haven’t rolled yet.
You’re difficult to remove from battle.
You gain a +2 status bonus to the triggering save, and if the triggering save is against an <<tag Incapacitation>> effect, it treats you as if you were 2 levels higher.
Whether taking stock of an enemy army or simply standing guard, you excel at observing your foes.
Your proficiency rank for [[Perception]] increases to master.
In addition, you gain a +2 circumstance bonus to [[Perception]] checks for [[Initiative]], making you faster to react during combat.
''Prerequisite'' Master in [[Crafting]].
You can sharpen weapons, polish armor, and apply special techniques to temporarily gain better effects from your armaments.
By spending 1 hour working on a weapon or armor, you can grant it the effects of a +1 potency rune until your next daily preparations, gaining a +1 item bonus to attack rolls for a weapon or increasing armor’s item bonus to AC by 1.
This has no effect if the weapon or armor already had a potency rune.
//The special statistics of a battle form can be adjusted only by circumstance bonuses, status bonuses, and penalties.//
//You can't cast spells, speak, or use Manipulate actions that require hands in your battle form.//
//Your gear is absorbed into you; the constant abilities of your gear still function, but you can’t activate any items.//
//The special statistics of a battle form can be adjusted only by circumstance bonuses, status bonuses, and penalties.//
//You can't cast spells, or speak in your battle form.//
//Your gear is absorbed into you; the constant abilities of your gear still function, but you can’t activate any items.//
Arrow or Bolt.
The shaft of a beacon shot is studded with tiny flecks of glimmering gemstones.
When an activated ({{OneAction}} Interact) beacon shot hits a target, it embeds itself into that target and spews sparks for 1 minute.
If the target is [[Invisible]], it becomes merely [[Hidden]] to creatures who would otherwise be unable to see it.
The sparks also negate the [[Concealed]] condition if the target was otherwise [[Concealed]].
A creature can remove the arrow or bolt by using an [[Interact]] basic action and succeeding at a DC 20 [[Athletics]] check.
''Size'' Small
''Melee'' {{OneAction}} jaws, damage 1d8 piercing
''Melee'' {{OneAction}} claw ([[Agile]]), Damage 1d6 slashing
''Str'' +3, ''Dex'' +2, ''Con'' +2, ''Int'' –4, ''Wis'' +1, ''Cha'' +0
''Hit Points'' 8
''Skill'' [[Intimidation]]
''Senses'' [[Low-Light Vision]], [[Scent]] (imprecise, 30 feet)
''Speed'' 35 feet
''Support Benefit'' Your bear mauls your enemies when you create an opening. Until the start of your next turn, each time you hit a creature in the bear’s reach with a [[Strike]], the creature takes 1d8 slashing damage from the bear. If your bear is nimble or savage, the slashing damage increases to 2d8.
''Advanced Maneuver'' [[Bear Hug]]
''Requirements'' The bear’s last action was a successful claw Strike.
The bear makes another claw [[Strike]] against the same target.
If this Strike hits, the target is also [[Grabbed]], as if the bear had successfully [[Grapple]]d the target.
A creature similar to an [[Animal]] but with an Intelligence modifier of –3 or higher is usually a beast.
Unlike an animal, a beast might be able to speak and reason.
You have an impressive innate ability to tame and command ferocious beasts.
You become trained in the [[Nature]] skill and gain the [[Train Animal]] skill feat.
One of your ancestors was a rakshasa, the corrupt and aristocratic reincarnated souls that call Golarion home. You have some dim echo of your ancestor’s memories—enough to play the role of noble as needed, no matter your origins.
You’re trained in [[Society]]. If you’re already trained in Society (from your background or class, for example), you instead become trained in a skill of your choice.
You also gain the [[Courtly Graces]] skill feat.
The blood of a beast flows through your veins, granting you the ferocity and might of animals.
Only creatures with the humanoid trait can take the <<tag Beastkin>> versatile heritage.
Choose a type of animal such as bat, eagle, shark, spider, tyrannosaurus, wasp, or wolf. This is the type of animal tied to your heritage and is known as your inherent animal.
You gain the <<tag Beast>> and <<Beastkin>> traits, in addition to the traits from your ancestry.
You gain the [[Change Shape]] ability.
You can choose from beastkin feats and feats from your ancestry whenever you gain an ancestry feat.
{{||VHerFeatList}}
You can communicate telepathically with your animal companions within 100 feet.
If you’re legendary in [[Nature]], you can communicate telepathically with your animal companions anywhere on the planet.
You gain the service of a young [[Animal Companion]] that travels with you and obeys your commands.
Contrary to the usual rules for animal companions, this feat can grant you a second animal companion. If you ever have more than one animal companion, you gain the [[Call Companion]] action.
As a beastmaster, it’s possible for you to have more than one animal companion at one time up to four companions—but only one of those companions, your “active companion,” follows you during exploration and in encounters; the rest are nearby, usually foraging or hunting for food. These rules apply to all your companions, regardless of whether you got the animal companion from the beastmaster archetype or from another source.
When you gain your first beastmaster focus spell, you become trained in primal spell attack rolls and spell DCs, and your spellcasting ability for these spells is Charisma.
Feats that grant beastmaster focus spells tell you to increase the number of Focus Points in your pool, but if you don’t already have a focus pool, you instead get a focus pool with 1 Focus Point.
You can [[Refocus]] by grooming, feeding, playing with, or otherwise tending to an animal companion.
Feats below that require or grant [[Warden Spells]] instead refer to Beastmaster Focus Spells.
<<archetypefeatlist "4 6 8 10 12 14 16" "Beastmaster">>
{{||SpellSummaryTable}}
You enter a magical trance that allows you to perceive through the senses of the target companion.
You attempt [[Perception]] checks using your own Perception, but you have any special senses the target has, such as [[Low-Light Vision]] or [[Darkvision]].
This spell grants no special method of communication with the chosen animal, so it follows any instructions you gave it before you entered the trance and, failing that, it does as it wishes.
For the duration of the trance, your own senses are muted, though you can still communicate.
This lack of awareness makes you [[Flat-Footed]].
You can’t take actions with the <<tag Attack>> or <<tag Move>> traits.
''Heightened (6th)'' Increase the range to 100 miles and the duration to sustained up to 10 minutes. The target can hear you through the spell, allowing you to [[Command the Animal|Command an Animal]] or use other actions that have the <<tag Auditory>> trait.
''Heightened (8th)'' Increase the range to planetary and the duration to sustained up to 1 hour. You can communicate telepathically with the target for the duration of the trance.
''Frequency'' once per turn
You quickly call in a primal projection of a non-active companion to provide the companion’s support benefit.
The projection arrives in an unoccupied square of your choice within 30 feet of you, grants you its support benefit, and then disappears on your next turn.
The projection has the same AC and saving throw modifiers as the real companion, and if it would take any damage before your next turn, it disappears and the support benefit ends immediately.
{{||SpellSummaryTable}}
You sow seeds of confusion in your target’s mind, causing their actions and thoughts to become clumsy.
//The book does not list what saving throw is made against this spell. It is generally assumed to be [[Will]] because of the theme of the effect.//
{{||SaveSuccessTable}}
Sometimes called “deadly nightshade,” belladonna is a widely available toxin produced from a plant similar to a tomato.
| !Saving Throw |DC 19 [[Fortitude]] |
| !Onset |10 minutes |
| !Maximum Duration |30 minutes |
| !Stage 1 |[[Dazzled]] (10 minutes) |
| !Stage 2 |1d6 poison damage and [[Sickened]] (10 minutes) |
| !Stage 3 |1d6 poison damage, [[Confused]] and [[Sickened]] (1 minute) |
You gain a +5-foot status bonus to your Speed.
Choose up to six other people to be your “crop.” Members of your crop can use your Speed for overland travel if it’s higher than their own.
Members more than 60 feet from you lose all benefits (from this or other Bellflower tiller feats) of being part of your crop, but they regain those benefits immediately when they return.
You can add or remove someone from your crop by spending 10 minutes in conversation with them.
<<archetypefeatlist "8 10 12" "[[Bellflower Tiller]]">>
You gain resistance to cold equal to half your level, and you don’t treat environmental cold as one degree more severe when you are wet. You adapt to pressure changes from being deep underwater automatically without ill effect.
''Frequency'' once per turn
''Requirements'' Your most recent action was to cast a non‑cantrip spell.
You siphon spell energy into one weapon you’re wielding.
Until the end of your turn, the weapon deals an extra 1d6 damage of a type depending on the school of the spell you just cast.
* ''Abjuration'' force damage
* ''Conjuration'' or ''Transmutation'' the same type as the weapon
* ''Divination'', ''Enchantment'', or ''Illusion'' mental damage
* ''Evocation'' a type the spell dealt, or force damage if the spell didn’t deal damage
* ''Necromancy'' negative damage
{{||SpellSummaryTable}}
You tap into the target’s inner being and curse it to become a bestial version of itself.
The effect is based on its [[Fortitude]] save.
{{||SaveSuccessTable}}
Your features transform into something bestial and you take on muscle mass, but your lumbering form is clumsy.
''Benefit'' You gain an item bonus to [[Athletics]] checks and unarmed attack rolls. You gain a claw unarmed attack with the [[Agile]] trait and a jaws unarmed attack.
''Drawback'' You take a –1 penalty to AC and a –2 penalty to [[Reflex]] saves.
If you drink a Major Bestial Mutagen, you gain [[Weapon Specialization]] with your claws and jaws. If you already have Weapon Specialization with them, you gain [[Greater Weapon Specialization]].
| !Type | !Level | !Price | !Item bonus to Athletics and unarmed attacks | !Claw damage | !Jaws damage | !Duration |
| Lesser | 1 | 40 | +1 | 1d4 S | 1d6 P | 1 minute |
| Moderate | 3 | 120 | +2 | 1d6 S | 1d8 P | 10 minutes |
| Greater | 11 | 3000 | +3 | 1d8 S | 1d10 P | 1 hour |
| Major | 17 | 30000 | +4 | 1d8 S | 1d10 P | 1 hour |
Underestimating you is a grave mistake, but it’s one others keep making. You’ve learned to take advantage of slips in your foes’ defenses.
When you [[Strike]] a [[Flat-Footed]] creature using a melee weapon or unarmed attack that has the [[Agile]] and [[Finesse]] traits, it gains the [[Backstabber]] trait //(presumably for that attack only)//.
Your cheek pouches are especially stretchy. Instead of storing up to four items of Light Bulk in your cheek pouches, you can store up to 1 Bulk worth of items.
The maximum size of a given item is unchanged.
{{||SpellSummaryTable}}
''Cost'' Black sapphire with a GP value of at least the target's level * 100.
You wrench the target’s soul away before it can pass on to the afterlife and imprison it in a black sapphire.
While the soul is in the gem, the target can’t be returned to life through any means, even powerful magic such as [[Wish]].
If the gem is destroyed or bind soul is [[Counteract]]ed on the gem, the soul is freed.
The gem has AC 16 and Hardness 10.
A gem can’t hold more than one soul, and any attempt wastes the spell.
{{||SpellSummaryTable}}
With a word of necromantic power, you seize control of the target.
It gains the [[Minion]] trait.
If you or an ally uses any hostile actions against the target, the spell ends.
In even a brief conversation or social interaction, you pick up on subtle social and visual cues to learn a great deal about a person’s origin and history. You might notice bits of green under the person’s fingernails and determine they’re an herbalist, a pin indicating their membership in a secret society, or something similar.
You pick up on only details that have to do with their societal role, so you might learn the city district where a vampire lives, but wouldn’t learn any of their weaknesses, nor necessarily even that they are a vampire.
Spend 1 minute in the presence of someone you haven’t met before, or haven’t met since you first gained Biographical Eye, then attempt a DC 30 [[Society]] check. You gain a +1 circumstance bonus to the check if you engaged the person in conversation during this time.
{{||ActionSuccessTable}}
If the person is deliberately trying to conceal their nature or present a false identity, you learn about their false biography rather than their true one unless the result of your Society check exceeds their Will DC.
''Size'' Small
''Melee'' {{OneAction}} jaws [[Finesse]], damage 1d6 piercing
''Melee'' {{OneAction}} talon ([[Agile]], [[Finesse]]), Damage 1d4 slashing
''Str'' +2, ''Dex'' +3, ''Con'' +1, ''Int'' –4, ''Wis'' +2, ''Cha'' +0
''Hit Points'' 4
''Skill'' [[Stealth]]
''Senses'' [[Low-Light Vision]]
''Speed'' 10 feet, fly 60 feet
''Support Benefit'' The bird pecks at your foes’ eyes when you create an opening. Until the start of your next turn, your Strikes that damage a creature that your bird threatens also deal 1d4 persistent bleed damage, and the target is [[Dazzled]] until it removes the bleed damage. If your bird is nimble or savage, the persistent bleed damage increases to 2d4.
''Advanced Maneuver'' [[Flyby Attack]]
{{||SpellSummaryTable}}
You tilt the scales of luck slightly to protect a creature from disaster.
When the target would attempt a saving throw, it can roll twice and use the better result.
Once it does this, the spell ends.
If you cast bit of luck again, any previous bit of luck you cast that’s still in effect ends.
After a creature has been targeted with bit of luck, it becomes temporarily immune for 24 hours.
''Prerequisites'' Master in [[Occultism]].
You can draw upon strange variations in your spellcasting, whether or not you can cast occult spells.
The DCs to [[Recognize Spell]]s you cast and [[Identify Magic]] you use increase by 5.
Adder venom is a simple but effective way to enhance a weapon.
| !Saving Throw |DC 18 [[Fortitude]] |
| !Onset |Immediate |
| !Maximum Duration |3 rounds |
| !Stage 1 |1d8 poison damage (1 round) |
| !Stage 2 |1d10 poison damage (1 round) |
| !Stage 3 |2d6 poison damage (1 round) |
''Frequency'' once per day
''Trigger'' A creature within 30 feet you can see would succeed at a save.
You hiss a spiteful curse at the creature.
The target must reroll the triggering saving throw and use the worse result.
Black lotus extract causes severe internal bleeding.
| !Saving Throw |DC 42 [[Fortitude]] |
| !Onset |1 minute |
| !Maximum Duration |6 rounds |
| !Stage 1 |15d6 poison damage and [[Drained]] 1 (1 round) |
| !Stage 2 |17d6 poison damage and [[Drained]] 1 (1 round) |
| !Stage 3 |20d6 poison damage and [[Drained]] 2 (1 round) |
{{||SpellSummaryTable}}
Oily black tentacles rise up and attempt to Grapple each creature in the area.
Make spell attack rolls against the [[Fortitude]] DC of each creature.
Any creature you succeed against is [[Grabbed]] and takes 3d6 bludgeoning damage.
Whenever a creature ends its turn in the area, the tentacles attempt to grab that creature if they haven’t already and they deal 1d6 bludgeoning damage to any creature already grabbed.
The tentacles’ [[Escape]] DC is equal to your spell DC.
A creature can attack a tentacle in an attempt to release its grip. Its AC is equal to your spell DC, and it is destroyed if it takes 12 or more damage.
Even if destroyed, additional tentacles continue to grow in the area until the duration ends.
You can Dismiss the spell.
{{||SpellSummaryTable}}
Blades of force form a churning wall.
The wall is a straight line 20 feet high, 120 feet long, and 2 inches thick, and it provides cover.
The wall deals 7d8 force damage to each creature that’s in the wall’s space when it is created, that attempts to pass through the wall, or that ends its turn inside the wall. A basic Reflex save reduces the damage.
A creature that succeeds at this save when the wall is created is pushed to the nearest space on the side of its choice.
Creatures trying to move through the wall fail to do so if they critically fail the save, ending their movement adjacent to the wall.
''Heightened (+1)'' The damage increases by 1d8.
{{||SaveSuccessTable}}
You call upon divine power and make a weapon or unarmed [[Strike]] against a foe you have witnessed harming an ally or innocent.
The Strike deals two extra weapon damage dice if the target of your Strike is evil.
Whether or not the target is evil, you can convert all the physical damage from the attack into good damage, __and if you are a paladin__, the Strike applies all effects that normally apply on a [[Retributive Strike]] (such as Divine Smite).
{{LOCGFeat}}
You call upon the power of law and make a weapon or unarmed [[Strike]] against a foe you have witnessed breaking or disrespecting the law or otherwise acting disorderly.
The Strike deals two extra weapon damage dice if the target of your Strike is chaotic.
Whether or not the target is chaotic, you can convert the physical damage from the attack into lawful damage.
{{LOCGFeat}}
You call upon the Crimson Oath to smite undead and then make a weapon or unarmed [[Strike]] against an undead foe.
The Strike deals two extra weapon damage dice, and you can convert all the physical damage from the attack into positive damage.
Your deceptions confound even the most powerful mortal divinations.
<<tag Detection>>, <<tag Revelation>>, and <<tag Scrying>> effects pass right over you, your possessions, and your auras, detecting nothing unless the detecting effect has a counteract level of __10__ or higher.
For example, [[Detect Magic]] would still detect other magic in the area but not any magic on you, [[True Seeing]] wouldn’t reveal you, [[Locate]] or [[Scrying]] wouldn’t find you, and so on.
{{||SpellSummaryTable}}
A flowing cloak of utter darkness drapes over you, filled with pinpricks of light like distant stars.
It imparts the stillness of the cosmos to you, granting you a +2 status bonus to [[Stealth]] checks to [[Hide]] and [[Sneak]].
While outside under a starry night sky, you’re also [[Invisible]] as long as you remain still. When
moving under a starry night sky, you are [[Concealed]] instead.
Gazing too closely into the stars is disorienting. Any creature that ends its turn adjacent to you must attempt a [[Will]] save; this is a <<tag Mental>><<tag Visual>> effect.
{{||SaveSuccessTable}}
Your mind and body can, for a short time, withstand the devastation of overdrawing your curse.
When you would become overwhelmed by your curse, you can forestall the effects for up to 1 minute.
On each of your turns during that time, you can cast one revelation spell granted by your mystery (but not domain spells, spells from [[Diverse Mystery]], or other revelation spells you gained from other abilities) without spending Focus Points or taking any further negative effects.
At the end of the minute, the durations of any revelation spells you cast during that time end, you take the normal effects from being overwhelmed by your curse, and you must attempt a DC 40 [[Fortitude]] save.
{{||SaveSuccessTable}}
''Frequency'' once per day
''Trigger'' Your turn begins.
You explode in flame.
Enemies in a 20-foot [[Emanation]] take 7d6 fire damage (basic [[Reflex]] save using your class DC or spell DC, whichever is higher).
Allies in the area are [[Quickened]] for 1 round and can use the additional action to [[Strike]] or [[Stride]].
{{||SpellSummaryTable}}
Blessings from beyond help your companions strike true.
You and your allies in the area gain a +1 status bonus to attack rolls.
Once per turn, starting the turn after you cast bless, you can use [[a single action|Expand Emanation]], which has the [[Concentrate]] trait, to increase the emanation’s radius by 5 feet.
Bless can [[Counteract]] [[Bane]].
''Prerequisites'' Deity who grants [[Heal]] [[Divine Font]].
You channel positive energy into restoratives that ward against harm.
When you [[Craft]] an alchemical item that restores Hit Points (rather than create it with advanced alchemy, Quick Alchemy, or another means), it becomes a blessed alchemical item and gains the <<tag Positive>>trait. For example, an elixir of life would become a blessed elixir of life.
When a creature regains Hit Points using a blessed alchemical item, the overflowing energy grants them negative resistance 5 for 1 round, or negative resistance 10 if you are legendary in Crafting.
''Prerequisites'' Deity who grants [[Harm]] [[Divine Font]].
You pour negative energy into toxins you create to further debilitate your targets.
When you [[Craft]] an alchemical poison (rather than create it with advanced alchemy, Quick Alchemy, or another means), it becomes a blessed alchemical poison and gains the <<tag Negative>>trait.
When a creature is afflicted with a blessed alchemical poison, for 1 round, any Hit Points it would regain from a <<tag Positive>>effect are reduced by 5, or by 10 if you are legendary in Crafting.
Your freshly spilled blood is sanctified, and ingesting it causes effects similar to those of [[Holy Water]].
Whenever a <<fag Fiend>>, <<tag Undead>>, or creature with a weakness to <<tag Good>> damage drinks your blood or deals piercing or slashing damage to you with jaws, fangs, or a similar attack, that creature takes 1d6 good damage.
You gain a +4 circumstance bonus to [[Crafting]] checks to [[Craft]] [[Holy Water]] using your own blood as one of the ingredients.
''Prerequisites'' Bloodline that grants divine spells, you follow a deity.
Your deity’s blessings manifest in your blood-borne power.
Add up to three of your deity’s spells (spells your deity grants to clerics) to your spell list.
They are not automatically added to your repertoire, but you can select them just as you would spells normally on the divine spell list.
''Trigger'' An ally within 30 feet would become [[Frightened]], [[Drained]], [[Enfeebled]], [[Sickened]], or [[Stupefied]].
You exude peace and protection, lessening a harmful condition as it falls upon an ally.
Reduce the value of the condition your ally would take by 1 (to a minimum of 0).
If the ally takes more than one condition at the same time, choose one to reduce.
You are touched by a deity and gifted with the ability to alleviate the suffering of others.
You gain the [[Lay on Hands]] devotion spell. It costs 1 Focus Point to cast a focus spell.
This feat grants a focus pool of 1 Focus Point that you can recover using the [[Refocus]] activity. You can Refocus by meditating, whether you reflect on the deity granting the blessing or not, allowing your blessing to refill your focus pool.
Your devotion spells from the blessed one archetype are divine spells.
<<archetypefeatlist "4 6 8 10 12 14 20" "[[Blessed One]]">>
When you focus your magic on an ally, you can remove harmful conditions.
If your next action is to [[Cast a Spell]] from a spell slot, and that spell targets only a single ally, you can also attempt to remove a harmful condition from that ally.
The condition must be one that could be removed by your [[Mercy]] feat, including those granted by later feats such as [[Greater Mercy]].
Attempt a [[Counteract]] check based on the spell’s DC and level.
This effect is in addition to the normal effects of your spell.
''Frequency'' once per day
You call out to the Godclaw to heal your allies.
You cast the 3-action version of [[Heal]], heightened to a level 1 lower than half your level rounded up.
You can select up to four creatures in the area to remain unaffected by the spell.
You can instead use this ability to bring a creature within 30 feet that has died within the last round back from the dead. If you do, the creature is restored to 1 Hit Point and is [[Doomed]] 1 for 24 hours.
{{||RitualSummaryTable}}
You twist and stunt plants in the area, causing them to wither. In addition to other dangers from failing plant life, this decreases the crop yield for farms.
If you cast this ritual in an area affected by [[Plant Growth]], blight attempts to [[Counteract]] plant growth instead of producing its usual effect.
{{||ActionSuccessTable}}
Blight bombs contain volatile toxic chemicals that rot flesh.
A blight bomb deals the listed poison damage, persistent poison damage, and splash damage. Many types grant an item bonus to attack rolls.
| !Type | !Level | !Price | !Poison Damage | !Persistent Poison Damage | !Poison Splash Damage | !Item bonus to attack |
| Lesser | 1 | 30 | 1d6 | 1d4 | 1 | None |
| Moderate | 3 | 100 | 2d6 | 2d4 | 2 | +1 |
| Greater | 11 | 2500 | 3d6 | 3d4 | 3 | +2 |
| Major | 17 | 25000 | 4d6 | 4d4 | 4 | +3 |
{{||SpellSummaryTable}}
You channel a blast of powerful blightburn radiation from your hands.
You deal 4d6 poison damage to creatures in the area. Creatures who fail their save are afflicted with stage 1 of [[Blightburn Sickness]] (on a critical failure, the creature moves immediately to stage 2).
The level of blightburn sickness caused by this spell is equal to twice the spell’s level, and the disease’s save DC uses the caster’s DC.
This tacky, hardened sap is harvested from trees infected by fungal blights and exposed to open flames.
| !Saving Throw |DC 31 [[Fortitude]] |
| !Onset |1 minute |
| !Maximum Duration |6 rounds |
| !Stage 1 |8d6 poison damage (1 round) |
| !Stage 2 |10d6 poison damage (1 round) |
| !Stage 3 |15d6 poison damage (1 round) |
{{||SpellSummaryTable}}
You strengthen a target’s ambition, increase its resentment of allies, and make its allegiances more susceptible to change.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
Your battle insights make you more aware of concealed and invisible opponents.
You don’t need to succeed at a flat check to target [[Concealed]] creatures.
You’re not [[Flat-Footed]] to creatures that are [[Hidden]] from you (unless you’re flat-footed to them for reasons other than the hidden condition), and you need only a successful DC 5 flat check to target a hidden creature.
While you’re adjacent to an [[Undetected]] creature of your level or lower, it is instead only hidden from you.
You can’t see.
All normal terrain is [[Difficult Terrain]] to you.
You can’t detect anything using vision.
You automatically critically fail [[Perception]] checks that require you to be able to see, and if vision is your only precise sense, you take a –4 status penalty to [[Perception]] checks.
You are immune to <<tag Visual>>effects.
Blinded overrides [[Dazzled]].
{{||SpellSummaryTable}}
You channel the allure of your nymph bloodline into a terribly beautiful glance.
Each enemy in the area must attempt a [[Will]] saving throw.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
''Trigger'' A creature damages you.
You curse the target with your outrage at being attacked.
The effect is determined by the target’s [[Will]] save.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You blind the target.
The effect is determined by the target’s [[Fortitude]] save.
The target then becomes temporarily immune for 1 minute.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You blink quickly between the Material Plane and the Ethereal Plane.
You gain resistance 5 to all damage (except force).
You can [[Sustain the Spell|Sustain a Spell]] to vanish and reappear 10 feet away in a random direction determined by the GM; the movement doesn’t trigger reactions.
At the end of your turn, you vanish and reappear as above.
''Heightened (+2)'' The resistance increases by 3.
{{||SpellSummaryTable}}
You point at a target in range, and its skin grows searing blisters filled with caustic fluid. The target must attempt a [[Fortitude]] save.
''Heightened (+1)'' The damage of a popped blister increases by 1d6.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
A heap of insults and invectives spew from your mouth— words so devastating your foes burn from the intensity of your diatribe.
Your words deal 2d6 [[persistent|Persistent Damage]] fire damage, and the target must attempt a [[Will]] save.
If the target doesn’t understand the language or you’re not speaking a language, it gains a +4 circumstance bonus to its save.
''Heightened (+2)'' You can target two additional creatures, and the persistent damage increases by 2d6.
You can bypass the need for incantations and gestures by drawing energy directly from your blood, causing you to visibly glow the color of your blood and crackle with magical energy.
When you [[Cast a Spell]], you can replace all verbal, material, or somatic spellcasting components with a blood component.
To use a blood component, you lose Hit Points equal to twice the spell’s level as the energy in your blood is depleted, and you can’t decrease the Hit Points lost in any way.
As usual for altering components, this has no effect on the number of actions required to Cast the Spell, and your Cast a Spell activity gains the <<tag Concentrate>> trait but not the <<tag Manipulate>> trait.
You can’t use blood components to replace any required part of a spell’s cost.
{{||SpellSummaryTable}}
Your head splits vertically into an enormous maw, which feasts upon the target's blood, dealing 12d6 piercing damage, depending on your spell attack roll.
After the spell, your head sews back together as if it had never split apart.
You gain temporary Hit Points for 1 minute equal to half the piercing damage the target takes.
If you are a gug, increase the piercing damage by 2d6 and increase the persistent bleed damage you deal on a critical hit by 1d8. This spell doesn’t alter a gug’s appearance.
''Heightened (+1)'' The piercing damage increases by 2d6, and the persistent bleed damage on a critical increases by 1.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You consolidate warding energies with a gesture, guarding a creature against attacks from a certain type of foe.
Designate one of the following creature traits: <<tag Aberration>>, <<tag Animal>>, <<tag Beast>>, <<tag Celestial>>, <<tag Construct>>, <<tag Dragon>>, <<tag Elemental>>, <<tag Fey>>, <<tag Fiend>>, <<tag Fungus>>, <<tag Monitor>>, <<tag Ooze>>, <<tag Plant>>, or <<tag Undead>>.
The target gains a +1 status bonus to its saving throws and AC against creatures with that trait.
The target is temporarily immune for 10 minutes.
''Heightened (5th)'' The status bonus increases to +2.
''Usage'' etched onto a clan dagger.
A bloodbane clan dagger is especially vicious against the ancestral enemies of the clan.
When you damage an appropriate type of creature with the weapon, that creature takes 1 persistent bleed damage. The type of creature depends on the clan that made the dagger, but is typically drow, duergar, giant, or orc.
In addition, whenever you inflict persistent bleed damage with a bloodbane weapon (whether from its innate ability or in some other way), the weapon leaves ragged wounds. The bleeding creature must succeed at a DC 25 Fortitude save or become [[Sickened]] 1. The creature is then temporarily immune for 1 hour.
''Greater Bloodbane'': The weapon deals 1d4 bleed damage to creatures designated as the clan’s enemy, and the DC of the Fortitude save to avoid becoming sickened is 30.
You gain a special sense: [[Imprecise]] [[Scent]] with a range of 30 feet. You gain a +2 circumstance bonus to [[Survival]] checks to [[Track]] creatures that you have previously sensed with your scent.
You emulate your vampiric parent’s techniques for drawing blood from a victim.
Your fangs [[Strike]]s deal an additional 1d4 persistent bleed damage on a critical hit.
//This feat doesn't give you fangs if you don't have them. Just being a Dhampir doesn't give you fangs unless you take the [[Fangs]] feat.//
This [[+1|Weapon Potency]] [[Striking]] kukri has a crimson blade that shimmers eerily in bright light.
On a critical hit, the kukri deals 1d8 persistent bleed damage.
If the target didn’t already have persistent bleed damage when you scored the critical hit, you also gain 1d8 temporary Hit Points.
Your repertoire expands, and you can cast more spells of your bloodline’s tradition each day.
Increase the number of spells in your repertoire and number of spell slots you gain from sorcerer archetype feats by 1 for each spell level other than your two highest spell levels.
''Frequency'' once per minute.
Your inborn magical nature lets you redirect ambient energies to fuel your spells.
If your next action is to [[Cast a Spell]] of 5th level or lower that has no duration, you don’t expend the spell’s slot when you cast it.
Your focus recovers faster.
If you have spent at least 2 Focus Points since the last time you [[Refocus]]ed, you recover 2 Focus Points when you Refocus instead of 1.
You have learned to manipulate the innate power of your bloodline and adapt it to your needs.
When making your [[daily preparations|Rest]], you can swap out a single spell of 9th level or lower for another spell of the same level.
You can’t swap out spells granted specifically by your bloodline.
''Prerequisites'' a bloodline based on a specific type of creature.
You permanently mutate to become more like the creatures of your bloodline.
You gain the appropriate trait or traits for those types of creatures (aberration for aberrant, angel and celestial for angelic, psychopomp and monitor for psychopomp, and so on).
You gain [[Low-Light Vision]] or [[Darkvision]], if one is appropriate for creatures with those traits.
Choose one of the following.
* If the creatures associated with your bloodline have the ability to fly, you gain a fly Speed equal to your land Speed.
* If the creatures associated with your bloodline are aquatic or amphibious, you become amphibious, able to breathe water and air equally well, and you gain a swim Speed equal to your Speed.
* If creatures associated with your bloodline have a resistance or immunity to acid, cold, electricity, fire, negative, or sonic, choose an energy type your bloodline is immune or resistant to and gain resistance 20 against that energy type.
You have perfected the magic in your bloodline.
Add two common 10th-level spells of your tradition to your repertoire.
You gain a single 10th-level spell slot you can use to cast these spells, using sorcerer spellcasting.
Unlike other spell slots, you don’t gain more 10th-level spells as you level up, and they can’t be used for abilities that let you cast spells without expending spell slots or abilities that give you more spell slots.
You can take the [[Bloodline Perfection]] sorcerer feat to gain a second slot.
You command the ultimate powers of your bloodline and tradition.
You gain an additional 10th-level spell slot.
Your magical blood makes you more resistant to magic.
You gain a +1 status bonus to saving throws against spells and magical effects.
Your blood’s power replenishes your focus.
If you have spent at least 3 Focus Points since the last time you [[Refocus]]ed, you recover 3 Focus Points when you Refocus instead of 1.
{{!!bl-desc}}
Spell Category: {{!!bl-list}}
!! Skills
<$list filter="[all[current]list[!!bl-skill]]" />
!! Granted Spells
<table>
<tr><th>Level</th><th>Spell</th></tr>
<$list filter="1 2 3 4 5 6 7 8 9" variable="level">
<tr><th><<level>></th>
<td>
<$list filter="[all[current]list[!!bl-granted]field:m-level<level>]">
<$link/>
<$list filter="[all[current]tag[Cantrip]]">
(Cantrip)
</$list>
<br/>
</$list>
</td></tr>
</$list>
</table>
!! Bloodline Spells
| !Level | !Spell |
|!Initial |<$list filter="[tag[Spell]field:m-bloodline<currentTiddler>field:m-level[1]]"><$link /></$list> |
|!Advanced |<$list filter="[tag[Spell]field:m-bloodline<currentTiddler>field:m-level[3]]"><$link /></$list>|
|!Greater |<$list filter="[tag[Spell]field:m-bloodline<currentTiddler>field:m-level[5]]"><$link /></$list> |
!! Blood Magic
{{!!bl-magic}}
Affix to a weapon.
This long, hollow proboscis is harvested from the notorious bloodseeker beast and drips a trickle of blood.
''Trigger'' You hit a [[Flat-Footed]] creature with the affixed weapon.
''Activate'' {{FreeAction}} Envision: you deal an extra 1d4 precision damage on your damage roll. If you deal [[Sneak Attack]] damage to the creature, you also deal 1d4 persistent bleed damage.
Your lethal unarmed attacks leave bloody gouges or cause severe internal bleeding.
When you critically hit with a [[Strike]] using an unarmed attack that isn’t [[Nonlethal]], the target takes 1d4 persistent bleed damage.
This can be because you’re taking the penalty to use a fist for a lethal attack or because you have an unarmed attack without the nonlethal trait due to [[Iron Fists]], [[Tusks]], or a similar ability.
Your small, blunt snout and labyrinthine sinus system make you resistant to phenomena that assail the nose.
When you roll a saving throw against inhaled threats (such as inhaled poisons) and olfactory effects (such as xulgath stench), you get the outcome one degree of success better than the result of your roll.
{{||SpellSummaryTable}}
The target’s form appears blurry.
It becomes [[Concealed]].
As the nature of this effect still leaves the target’s location obvious, the target can’t use this concealment to [[Hide]] or [[Sneak]].
Either Stride twice or attempt an [[Acrobatics]] check (DC determined by the GM, but usually DC 20) to swing on a rope up to twice your Speed.
If you boarded or disembarked from a boat or similar vehicle during this movement, you can make a melee Strike that deals one additional weapon damage die.
If you have the [[Panache]] class feature and your Acrobatics check for a Boarding Assault exceeds the very hard DC for your level, you would gain panache.
You declare a boast about a particular skill action, such as [[Balance]], [[Demoralize]], or [[Recall Knowledge]].
The first time you attempt this action within the next minute in a context the GM deems both suitably challenging and meaningful, you must roll twice and use the lower result.
If you succeed at this check, you gain a +1 circumstance bonus to checks to attempt the same action for 10 minutes.
If you fail this check or don’t attempt the action within 1 minute, you instead take a –1
circumstance penalty on checks to attempt the same action for 1 hour.
If the chosen action can be used with multiple skills, such as [[Identify Magic]] or [[Recall Knowledge]], you must specify which skill you are using for that particular action, such as
using [[Arcana]] to Identify Magic, and your bonus or penalty after the boast applies only to checks using that skill for that action.
Once you declare a boast about a particular action, you cannot declare a boast about the same action until the next time you make daily preparations, regardless of whether you succeed or fail at the check.
Typically a challenging task is one with at least a standard DC for your level, though the difficulty may be higher depending on the situation.
A meaningful context is one where the action’s success or failure is relevant to the pursuit of your goals, rather than a boast you made simply to gain a bonus later.
You call out a foe, causing them to become flustered and easier to defeat.
Select one creature you can see and declare a challenge. For your challenge, attempt a [[Deception]], [[Diplomacy]], or [[Intimidation]] check against that creature’s [[Will]] DC.
Your challenge must include a <<tag Linguistic>>, <<tag Auditory>>, or <<tag Visual>> component and gains the corresponding trait.
If you succeed, you gain a +2 status bonus to damage rolls with your weapon or unarmed Strikes against that foe until the end of your next turn; if you have master proficiency in the skill you used, you gain a +4 status bonus instead, and if you’re legendary, you gain a +6 status bonus.
On a critical success, the status bonus lasts for 3 rounds instead.
Whether you succeed or fail, creatures who witnessed your challenge gain a +4 circumstance bonus to their Will DCs against your attempts to challenge for 1 minute.
Boggards are frog-like humanoids.
They typically have [[Darkvision]].
You specialize in explosions and other violent alchemical reactions.
''Level 1'': You start with the formulas for two 1st-level alchemical bombs in your formula book, in addition to your other formulas.
''Level 1'': When throwing an alchemical bomb with the <<tag Splash>> trait, you can deal splash damage to only your primary target instead of the usual splash area.
''Level 5'': When using advanced alchemy to make bombs during your daily preparations, you can use a batch of reagents to create any three bombs instead of just two of the same bomb.
''Level 13'': You can increase the splash on your bombs to damage creatures within 10 feet, or 15 feet if you have Expanded Splash.
This tincture lets you pinpoint your foes.
For the next 5 minutes, your alchemical bomb Strikes reduce the circumstance bonus to AC your targets gain from cover.
| !Type | !Level | !Price | !Reduction to cover AC bonus |
| Lesser | 4 | 140 | -1 |
| Greater | 14 | 7000 | -2 |
You launch an insightful quip at a foe, distracting them.
Choose a foe within 30 feet and roll a [[Diplomacy]] check against the target’s [[Will]] DC.
{{||ActionSuccessTable}}
''Requirements'' The last action you used was Drain Bonded Item.
By carefully manipulating the arcane energies stored in your bonded item as you drain it, you
can conserve just enough power to cast another, slightly weaker spell.
If the next action you use is to [[Cast a Spell]] using the energy from Drain Bonded Item, you gain an extra use of Drain Bonded Item.
You must use this extra use of Drain Bonded Item before the end of your next turn or you lose it, and you can use this additional use only to cast a spell 2 or more levels lower than the first spell cast with Drain Bonded Item.
''Prerequisites'' Expert in [[Nature]].
You forge strong connections with animals.
You can spend 7 days of downtime __regularly interacting__ with a normal animal (not a companion or other special animal) __that is friendly or helpful to you__.
After this duration, attempt a DC 20 [[Nature]] check. If successful, you bond with the animal.
The animal is permanently [[Helpful]] to you, unless you do something egregious to break your bond. A helpful animal is easier to direct, as described under [[Command an Animal]].
Bonding with a new animal ends any previous bond you had.
You can’t have both a bonded animal and an animal companion (though you can have both a bonded animal and a familiar).
Your connection to your bonded item increases your focus pool.
If you have spent at least 2 Focus Points since the last time you Refocused and your bonded item is in your possession, you recover 2 Focus Points when you [[Refocus]] instead of 1.
Using a mixture of dinosaur bones and the bones of your ancestors to focus your magic, you animate lizards and dinosaurs to carry messages or serve as mounts.
You can cast [[Animal Messenger]] and [[Phantom Steed]] as primal innate spells once per day each. The animal messenger is always a Tiny dinosaur or lizard, and your innate spell transforms it from bones to flesh, even if there are no dinosaurs or lizards nearby. The phantom steed looks like a dinosaur rather than a horse but functions identically.
You encase yourself in spiritual dinosaur bones to become a Huge dinosaur.
You can cast [[Dinosaur Form]] on yourself as a 5th-level primal innate spell once per day.
Your connection to your iruxi ancestors manifests as a simple primal spell that you cast using a fragment of an ancestor’s bones.
Choose one cantrip from the primal spell list.
You can cast this cantrip as a primal innate spell at will, and it’s heightened to a spell level equal to half your level rounded up.
{{||MysterySummary}}
Each day during your preparations, you can choose to align yourself in the confluence of positive and negative energy so as to gain negative healing, which means you are harmed by positive damage and healed by negative effects as if you were undead. If you already have negative healing, instead the DC of your recovery checks is equal to 9 + your current dying value.
!!! Curse of Living Death
''Minor Curse'' Non-magical effects that would restore your Hit Points only grant you half as many HP as normal.
''Moderate Curse'' You become [[Drained]] 1, and this drained condition is cumulative with any other drained conditions you gain. This drained condition is removed only when you Refocus; effects that normally remove the drained condition reduce your drained condition to drained 1 instead. In addition, you gain resistance to poison equal to half your level. You gain a +4 status bonus to saves against diseases, poisons, and death effects, and if you roll a success on such a save, you get a critical success instead.
''Major Curse'' You become [[Wounded]] 1. This wounded condition is removed only when you Refocus; effects that normally remove the wounded condition reduce your wounded condition to wounded 1 instead. When you would attempt a recovery check, you can choose to get an automatic success instead of rolling, and if you roll a critical failure on a save against a disease, poison, or death effect, you get a failure instead.
You have a powerful connection to the Boneyard and its courts, granting you the ability to travel to and from the Boneyard.
You gain [[Plane Shift]] as a divine innate spell. You can cast it twice per week.
This can be used only to travel to the Boneyard or from the Boneyard to the Material Plane. Due to your unique connection to the Boneyard, your body serves as the focus, and you don’t require a tuning fork.
If you’re an arcane spellcaster who prepares from a spellbook, you can attempt to prepare a spell from someone else’s spellbook.
The GM sets the DC for the check based on the spell’s level and rarity; it’s typically a bit easier than [[Learning the Spell|Learn a Spell]].
{{||ActionSuccessTable}}
This ornate copper band has a small ruby set in the center, flanked by a pair of dwarven runes.
The wearer of this ring gains the ability to understand, read, and speak one common language of their choice, selected each morning as part of their daily preparations.
In addition, the wearer receives a +1 item bonus to [[Diplomacy]] checks to [[Make an Impression]].
{{||SpellSummaryTable}}
''Trigger'' You would take <<tag Electricity>> damage.
When lightning is turned at you, you store the charge safely within yourself, unleashing it when the time is right.
You gain electricity resistance 10 against the triggering effect.
If you successfully prevent damage in this way, at any time during the spell’s duration, you can spend a single action, which has the <<tag Attack>> trait, to expend the charge and make a melee spell attack at an adjacent target or a ranged spell attack at a target within 60 feet.
This attack deals electricity damage equal to the damage prevented by bottle the storm.
If you cast bottle the storm a second time before the original duration elapses, or if you do not make this attack, the stored charge dissipates harmlessly.
''Heightened (7th)'' The resistance increases to 15, and you can immediately make the spell attack roll granted by bottle the storm as part of the reaction used to cast the spell.
''Heightened (10th)'' The resistance increases to 20, and you can immediately make the spell attack roll granted by bottle the storm as part of the reaction used to cast the spell.
Appearing to be an ordinary corked glass bottle, this item contains a limitless supply of fresh air.
You must uncork the bottle with an [[Interact]] action before you can activate it.
Air doesn’t escape the mouth of the bottle, so leaving the open bottle in an airless environment doesn’t change the environment.
''Activate'' {{OneAction}} Interact; ''Effect'' You draw a breath of air from the bottle. This allows you to breathe even in an airless or toxic environment.
Bottled lightning is packed with volatile reagents that create a blast of electricity when they are exposed to air. Bottled lightning deals the listed electricity damage and electricity splash damage.
On a hit, the target becomes [[Flat-Footed]] until the start of your next turn.
Many types grant an item bonus to attack rolls.
| !Type | !Level | !Price | !Electricity Damage | !Electricity Splash Damage | !Item bonus to attack |
| Lesser | 1 | 30 | 1d6 | 1 | None |
| Moderate | 3 | 100 | 2d6 | 2 | +1 |
| Greater | 11 | 2500 | 3d6 | 3 | +2 |
| Major | 17 | 25000 | 4d6 | 4 | +3 |
Your dwarven build allows you to push foes around, just a mighty boulder tumbles through a subterranean cavern.
Take a [[Step]] into the square of a foe that is your size or smaller, and the foe must move into the empty space directly behind it. The foe must move even if doing so places it in harm’s way.
The foe can attempt a [[Fortitude]] saving throw against your [[Athletics]] DC to block your Step. If the foe attempts this saving throw, unless it critically succeeds, it takes bludgeoning damage equal to your level plus your [[Strength]] modifier.
If the foe can’t move into an empty space (if it is surrounded by solid objects or other creatures, for example), your Boulder Roll has no effect.
''Frequency'' once per day
''Trigger'' You lose the [[Dying]] condition.
You recover from near-death experiences with astounding resilience. Don’t increase the value of your wounded condition due to losing the dying condition.
You have a particular elasticity that makes it easy for you to bounce and squish.
You gain the trained proficiency rank in [[Acrobatics]] (or another skill of your choice, if you were already trained in Acrobatics).
You also gain a +2 circumstance bonus to Acrobatics checks to [[Tumble Through]] a foe’s space.
With a sixth sense for the flow of combat, you can quickly react to any situation as required.
At the start of each enemy’s turn, you gain a reaction you can use only during that turn.
When focused on finding your quarry, you’re relentless.
You gain the [[Hunt Prey]] action.
You can use Hunt Prey to designate only a creature that you’ve seen, heard about, or learned about through some other means, such as a bounty board or wanted poster.
In addition to the other benefits of Hunt Prey, you gain a +2 circumstance bonus to checks to [[Gather Information]] regarding your prey.
If you already have Hunt Prey, you become an expert in [[Survival]] and gain the circumstance bonus to [[Gather Information]] about your prey; you can still designate a creature you’re tracking during exploration, in addition to the conditions above.
<<archetypefeatlist "4 6 8 14" "[[Bounty Hunter]]">>
You boast, taunt, and psychologically needle your foes.
You are trained in [[Intimidation]].
You gain panache during an encounter whenever you successfully [[Demoralize]] a foe.
{{||SpellSummaryTable}}
You probe the target’s mind to glean knowledge.
This deals 1d8 <<tag Mental>> damage with a basic [[Will]] save.
If the target fails the save, you sort through the stolen memories to attempt a single check to [[Recall Knowledge]]. Choose a skill that has the Recall Knowledge action, and use the target’s skill modifier for the check.
''Heightened (+1)'' The mental damage increases by 1d8.
{{||SpellSummaryTable}}
You brand the target with an ethereal copy of your deity’s religious symbol.
This brand can’t be hidden, but it is visible only to followers of your faith, who see it as clearly as a lit torch. //(It does not actually emit light like a torch.)//
Followers of your faith ignore the target’s [[Concealed]] condition, if any, and the target gains a –1 status penalty to [[AC]] against attacks by followers of your faith.
If the target is a follower of your deity in good standing, the spell fails.
{{||SaveSuccessTable}}
Having faced countless foes and the chaos of battle, you have learned how to stand strong in the face of fear and keep on fighting.
Your proficiency rank for [[Will]] saves increases to expert.
When you roll a success at a [[Will]] save against a <<tag Fear>> effect, you get a critical success instead.
In addition, anytime you gain the [[Frightened]] condition, reduce its value by 1.
This flask of foaming beer grants courage. For the next hour
after drinking this elixir, you gain an item bonus to Will saves,
which is greater when attempting Will saves against fear.
| !Type | !Level | !Price | !Item Bonus | !Item bonus vs Fear |
| Lesser | 2 | 70 | +1 | +2 |
| Moderate | 10 | 1500 | +2 | +3 |
| Greater | 15 | 7000 | +3 | +4 and promote successes |
''Trigger'' A foe’s Strike reduces you to 0 Hit Points; you were not at 1 Hit Point and you would not be killed.
Your confidence borders on self-delusion, but it keeps you going against overwhelming odds.
Attempt a [[Deception]] check against the attack DC of the triggering Strike.
You take a penalty to this check equal to twice your [[Wounded]] value, if any.
If the triggering attack was a critical hit, use the result one degree of success worse than what you rolled.
//On a succeess,// you avoid being knocked out and remain at 1 Hit Point.
//If you didn't get a critical success,// you increase your wounded value by 1.
You know how to make the most of your attacks when fighting hand-to-hand.
You gain access to the [[Critical Specialization Effects]] of unarmed strikes in the brawling group and weapons in the brawling group.
If you have [[Monastic Weaponry]], you also gain the critical specialization effects of all monk weapons in which you are trained.
This [[+1|Armor Potency]] [[Resilient]] Breastplate is made from shining bronze overlaid with reinforcing golden panels in the shape of lion’s heads. Wearing this breastplate grants you a commanding aura.
You gain a +2 item bonus to [[Diplomacy]] checks, but you take a –2 item penalty to [[Stealth]] checks to [[Hide]] and [[Sneak]] and [[Deception]] checks to [[Impersonate]].
''Activate'' {{OneAction}} Command; ''Frequency'' once per day; ''Effect'' You grant allies within 100 feet a +2 status bonus to saves against <<tag Fear>> effects for 1 minute. When you activate this ability, each affected ally who’s frightened reduces their frightened value by 1.
| !Type | !Level | !Price | !Potency | !Resilience | !Bonus/penalty |
| (standard) | 10 | 10000 | +1 | [[Resilient]] | +2/-2 |
| Greater | 18 | 220000 | +2 | Greater [[Resilient]] | +3/-3 |
You have incredible breath control, which grants you advantages when air is hazardous or sparse.
You can hold your breath for 25 times as long as usual before [[Suffocating]].
You gain a +1 circumstance bonus to saving throws against inhaled threats, such as inhaled poisons, and if you roll a success on such a saving throw, you get a critical success instead.
{{||SpellSummaryTable}}
You fill the area with an oppressive, arid swelter that overwhelms creatures with heat exhaustion. Objects are unaffected.
Each creature in the area when the spell is cast or that ends its turn in the area afterward must attempt a [[Fortitude]] save.
<<tag Water>> creatures and plant creatures use the outcome one degree of success worse than the result of their saving throw. Creatures whose bodies contain no significant moisture (such as fire elementals) are immune to breath of drought.
''Heightened (4th)'' Once per round when you Sustain the Spell, you can move the center of the burst to a new location within range.
''Heightened (7th)'' As the 4th-level version, except the range is 120 feet and the area is a 20-foot burst.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
''Trigger'' A living creature in range would die.
Your blessing revives a creature at the moment of its death.
You prevent the target from dying and restore Hit Points to the target equal to 4d8 plus your spellcasting ability modifier.
You can’t use breath of life if the triggering effect was [[Disintegrate]] or a [[Death]] effect.
You can use a powerful breath weapon, much like the dragon you emulate.
You gain the [[Dragon Breath]] sorcerer bloodline spell and a focus pool of 1 Focus Point. If you already have a focus pool, increase your number of Focus Points by 1.
You’ve learned to use roots, crevices, uneven ground, and dense underbrush to your advantage.
When you’re in [[Difficult Terrain]] from an environmental feature, you can [[Take Cover]], even if the feature wouldn’t ordinarily be large enough for you to [[Take Cover]].
//Implied by [[Impaling Briars]].//
In addition, once per round you can direct the briars to impale any target in the area (or flying up to 20 feet above the area) that you can see by using a single action, which has the Concentrate and Manipulate traits.
Make a spell attack roll. On a success, the target takes 10d6 piercing damage and takes a –10-foot circumstance penalty to all Speeds for 1 round; on a critical success, the target is [[Immobilized]] for 1 round unless it [[Escape]]s.
You emit [[Dim Light]] within 5 feet of you. You can activate or suppress this ability as an action, which has the <<tag Concentrate>> trait. Additionally, you can force fragments of your shadow to glow and cast [[Dancing Lights]] and [[Light]] as occult innate cantrips.
In bright light, such as sunlight, creatures and objects can be observed clearly by anyone with average vision or better.
Some types of creatures are [[Dazzled]] or [[Blinded]] by bright light.
Once per day, you can spend 10 minutes studying your surroundings in search of omens related to a particular course of action to cast [[Augury]] as an innate divine spell.
Unless the result of the augury was “nothing,” you gain the [[Call Upon the Brightness]] reaction for the next 30 minutes.
The fire inside you asserts itself as beaming, radiant light.
Your body is naturally luminescent, glowing with the effects of a primal [[Light]] cantrip. A cantrip is heightened to a spell level equal to half your level rounded up.
The light is involuntary and constant; if counteracted, it returns in 1d4 rounds.
You suffer a –2 circumstance penalty on [[Stealth]] checks to [[Hide]] or [[Sneak]] and gain a +1 circumstance bonus on saves against <<tag Light>> effects and effects that inflict the [[Blinded]] or [[Dazzled]] conditions.
Fumes from the forges of Hell drain health and strength alike.
| !Saving Throw |DC 36 [[Fortitude]] |
| !Onset |1 round |
| !Maximum Duration |6 rounds |
| !Stage 1 |7d6 poison damage and [[Enfeebled]] 1 (1 round) |
| !Stage 2 |8d6 poison damage and [[Enfeebled]] 2 (1 round) |
| !Stage 3 |10d6 poison damage and [[Enfeebled]] 3 (1 round) |
Your mother was a sea hag, granting you one sea-green or blue eye. You find comfort both in the sea and on the shore.
Whenever you roll a success on an Athletics check to [[Swim]], you get a critical success instead.
If you end your turn in water without having succeeded at a [[Swim]] action that round, you don’t sink (but you might still be moved by the current).
Your elemental ancestor’s legacy asserts itself as brackish water, like the seawater of the ocean.
You gain the [[Salt Wound]] reaction.
Broken is a condition that affects objects. An object is broken when damage has reduced its [[Hit Points]] __to equal or less than__ its [[Broken Threshold]]. A broken object can’t be used for its normal function, nor does it grant bonuses—with the exception of armor.
Broken armor still grants its item bonus to [[AC]], but it also imparts a status penalty to AC depending on its category: –1 for broken light armor, –2 for broken medium armor, or –3 for broken heavy armor.
A broken item still imposes penalties and limitations normally incurred by carrying, holding, or wearing it. For example, broken armor would still impose its [[Dexterity]] modifier cap, check penalty, and so forth.
If an effect makes an item broken automatically and the item has more HP than its Broken Threshold, that effect also reduces the item’s current HP to the Broken Threshold.
Affix to armor.
This pendant is forged from grainy steel and depicts a snorting bull’s face. The pendant must be attached to the chest area or on a shoulder guard.
''Requirements'' You are trained in Athletics.
''Trigger'' You attempt an Athletics check to [[Shove]] but you haven't rolled yet.
''Activate'' {{FreeAction}} Envision: you gain a +2 status bonus to the [[Athletics]] check to [[Shove]], and if you roll a critical failure on the check, you get a failure instead.
This broom has a tenuous connection to gravity, and it tends to drift even while stowed.
You can ride on the broom using one hand to guide it, and the broom can carry up to one passenger in addition to you.
The broom moves at a fly Speed of 20 feet.
The broom can carry only so much, taking a –10‑foot penalty to its Speed if laden with more than 20 Bulk, and crashing to the ground if it carries more than 30 Bulk.
''Activate'' {{TwoAction}} Command, Interact; ''Effect'' You name a destination on the same plane, and the broom speeds toward it at a fly Speed of 40 feet. You must either clutch the broom with two hands in order to ride it, or you need to release the broom to send it off with no rider. If you don’t have a good idea of the location, layout, and general direction of the destination, or if your named destination is on another plane, the broom wanders aimlessly, circling back to its starting location after 30 minutes. If the broom carries a rider, this activation lasts until 4 hours pass (typically 16 miles of travel), the broom reaches its destination, or you Dismiss the activation. If the broom doesn’t have a rider, the activation lasts until the broom reaches its destination. When the activation ends, the broom floats to the ground and can’t be activated again for 1 hour.
A ranged attack with this trait uses its [[Strength]] modifier instead of [[Dexterity]] on the attack roll.
The brutality of your critical hits shakes your foes’ confidence.
Whenever your [[Strike]] is a critical hit and deals damage, the target is [[Frightened]] 1.
''Prerequisites'' Expert in [[Athletics]].
You push your foes around and leave bruises.
While raging, when you successfully [[Disarm]], [[Grapple]], [[Shove]], or [[Trip]] a foe, you deal that foe bludgeoning damage equal to your [[Strength]] modifier; add this to the damage from a critical success to Trip.
Your critical hits are particularly devastating.
On a critical hit __with a melee Strike__, add one extra damage die.
This is in addition to any extra dice you gain if the weapon is [[Deadly]] or [[Fatal]].
The target also takes persistent bleed damage equal to two damage dice.
''Requirements'' You are wielding a melee weapon in two hands.
Your final blow can make an impact even if it rebounds off a foe’s defenses.
Make a [[Strike]] with the required weapon.
After the Strike, your turn ends.
The Strike deals one extra weapon damage die, or two extra weapon damage dice if you’re at least 18th level.
The Strike also gains the following failure effect: You deal damage equal to one weapon damage die of the required weapon. Increase this to two dice if you’re at least 18th level.
Your fury makes your weapons lethal.
Your proficiency ranks for simple weapons, martial weapons, and unarmed attacks increase to expert.
While raging, you gain access to the [[Critical Specialization Effect]]s for melee weapons and unarmed attacks.
''Requirements'' You are wielding a two-handed melee weapon.
Throwing your weight behind your attack, you hit your opponent hard enough to make it stumble back.
Make a [[Strike]] with a two-handed melee weapon.
If you hit a target that is your size or smaller, that creature is [[Flat-Footed]] until the end of your current turn, and you can automatically [[Shove]] it, with the same benefits as the Shove action (including the critical success effect, if your Strike was a critical hit).
If you move to follow the target, your movement doesn’t trigger reactions.
This Strike has the following failure effect: on failure, the target becomes [[Flat-Footed]] until the end of your current turn.
Most monsters that serve as mounts can attempt to buck off unwanted or annoying riders, but most mounts will not use this reaction against a trusted creature unless the mounts are spooked or mistreated.
''Trigger'' A creature [[Mount]]s or uses the [[Command an Animal]] action while riding the monster.
The triggering creature must succeed at a [[Reflex]] saving throw against the listed DC or fall off the creature and land prone.
If the save is a critical failure, the triggering creature also takes 1d6 bludgeoning damage in addition to the normal damage for the fall.
Carrying especially heavy or unwieldy items can make it more difficult for you to move, as can overloading yourself with too much gear.
The Bulk value of an item reflects how difficult the item is to handle, representing its size, weight, and general awkwardness.
If you have a high [[Strength]] score, you usually don’t need to worry about Bulk unless you’re carrying numerous substantial items.
You can carry an amount of Bulk equal to 5 plus your Strength modifier without penalty; if you carry more, you gain the [[Encumbered]] condition. You can’t hold or carry more Bulk than 10 plus your Strength modifier.
Items can have a number to indicate their Bulk value, or they can be light (indicated by an L) or negligible (indicated by a —) for the purpose of determining Bulk. For instance, full plate armor is 4 Bulk, a longsword is 1 Bulk, a dagger or scroll is light, and a piece of chalk is negligible.
Ten light items count as 1 Bulk, and you round down fractions (so 9 light items count as 0 Bulk, and 11 light items count as 1 Bulk).
Items of negligible Bulk don’t count toward Bulk unless you try to carry vast numbers of them, as determined by the GM.
As a general rule, an item that weighs 5 to 10 pounds is 1 Bulk, an item weighing less than a few ounces is negligible, and anything in between is light.
Particularly awkward or unwieldy items might have higher Bulk values. For example, a 10-foot pole isn’t heavy, but its length makes it difficult for you to move while you have one on your person, so its Bulk is 1. Items made for larger or smaller creatures have greater or lesser Bulk.
\define bulletlist(filter:"")
<ul>
<$list filter=<<__filter__>> >
<li><$link/></li>
</$list>
</ul>
\end
You carefully take aim before making your attack in order to avoid your foe’s concealment and cover.
On your next [[Strike]] with a thrown weapon before the end of your turn, you gain a +1 circumstance bonus to your attack roll and ignore your target’s [[Concealed]] condition, as well as the target’s lesser [[Cover]] or standard cover; if the target had greater cover, they instead have only standard cover against the [[Strike]].
Your companion terrorizes foes with dominance displays and pushes them around the battlefield.
Its proficiency ranks for [[Athletics]] and [[Intimidation]] increase to expert (or master if it was already expert from its type), its [[Strength]] modifier increases by 1, and its [[Charisma]] modifier increases by 3.
''Requirements'' You are wielding your staff.
You can attempt to [[Shove]] or [[Trip]] creatures up to two sizes larger than you.
If you have master proficiency with your staff, you can attempt to Shove or Trip creatures up to three sizes larger than you.
Fire fascinates you. Your spells and alchemical items that deal fire damage gain a status bonus to damage equal to half the spell’s level or one-quarter the item’s level (minimum 1). You also gain a +1 status bonus to any persistent fire damage you deal.
{{||SpellSummaryTable}}
Gouts of flame rush from your hands.
You deal 2d6 fire damage to creatures in the area.
''Heightened (+1)'' The damage increases by 2d6.
''Requirements'' You have a burrow Speed.
You dig your way through dirt, sand, or a similar loose material at a rate up to your burrow Speed.
You can’t burrow through rock or other substances denser than dirt unless you have an ability that allows you to do so.
You recognize the chittering of ground creatures as its own peculiar language.
You can ask questions of, receive answers from, and use the [[Diplomacy]] skill with animals that have a burrow Speed, such as badgers, ground squirrels, moles, and prairie dogs.
The GM determines which animals count for this ability.
A burst effect issues forth in all directions from a single corner of a square within the range of the effect, spreading in all directions to a specified radius.
For instance, when you cast fireball, it detonates at the corner of a square within 500 feet of you and creates a 20-foot burst, meaning it extends out 20 feet in every direction from the corner of the square you chose, affecting each creature whose space (or even one square of its space) is within the burst.
//Squares should be measured in the standard way, with every other diagonal square measured as 10'. Bursts are approximately circular, not square.//
//The size of a burst mentioned in an effect description is always its radius. Some effects specifically mention "radius". This does not indicate a special case.//
{{||SpellSummaryTable}}
With a quick burst of laughter, you prolong a magical effect you created.
You [[Sustain a Spell]].
You gain a spine unarmed attack that deals 1d6 piercing damage. Your spines are in the brawling group and have the finesse and unarmed traits.
''Frequency'' once per minute.
You call out a quick cadence, guiding your allies into a more efficient rhythm.
Each willing ally within your marshal’s aura is [[Quickened]] until the end of their next turn, and they can use the extra action only to [[Stride]].
At the end of each ally’s turn, if they used the extra action, they then become [[Slowed]] 1 until the end of their following turn.
''Frequency'' once per day
You’ve spent many an evening learning songs and tales featuring calacas, death’s wandering minstrels.
You dramatically unleash a stunning blast of sound by smashing an instrument you hold or belting out a discordant note. //("Smashing" does not imply destroying the instrument.)//
This has the effects of [[Synaptic Pulse]], but the effect is <<tag Auditory>> rather than <<tag Mental>>. The DC is either your class DC or spell DC, whichever is higher.
You have calculated all the angles to maximize a bomb’s splash.
When you throw an alchemical bomb with the <<tag Splash>> trait, you can cause the bomb to deal splash damage equal to your Intelligence modifier (minimum 0) instead of the normal amount.
These subterranean people have [[Darkvision]], and some have powers to create darkness.
Your composition takes the form of a call-and-response chant, which lets your allies continue the effect without you.
If your next action is to cast a composition cantrip with a duration of 1 round, it becomes a call.
While the spell is active, one ally affected by the spell can respond to your call as a single action that has the <<tag Auditory>> and <<tag Concentrate>> traits to extend the spell’s duration by 1 round.
Only one ally can respond to a given call, and responding to the ally’s response has no additional effect.
You’re mystically connected to your bonded item and can call it to your hand.
If your bonded item is 1 Bulk or less, you teleport your bonded item into your hand from up to 1 mile away.
You spend 1 minute calling for a different animal companion, switching your active companion for another of your animal companions.
The wild wonder of Elysium harmonizes within you, and in dire straits, you can share its benefits with your allies.
Your Speed increases by 5 feet; the Speed increase from this feat isn’t cumulative with any Speed increase from your ancestry feats (such as [[Nimble Elf]]).
Allies who begin their turn in combat adjacent to you gain a +5-foot status bonus to their Speed for the round.
{{||SpellSummaryTable}}
You fire a ray of sickening energy. Make a spell attack roll.
{{||ActionSuccessTable}}
You can call forth nearby nature spirits to augment your body.
Once per day, you can cast [[Plant Form]] as a 5th-level primal innate spell.
When you reach 17th level, this spell can be heightened to 6th level.
You call upon the creatures of nature to come to your aid.
You can spend 10 minutes in concert with nature to replace one of the spells you’ve prepared in one of your druid spell slots with a [[Summon Animal]] or [[Summon Plant or Fungus]] spell of the same level.
''Trigger'' You attempt a saving throw against a magical effect, but you haven't rolled yet.
You gain a +1 circumstance bonus to the triggering saving throw and until the end of this turn.
{{||RitualSummaryTable}}
''Cost'' Rare candles and incense worth a total value of 50 gp.
The secondary caster must use a different skill to the primary caster.
You tear the veil to the afterlife and call a spirit from its final resting place.
You must call the spirit by name, and you must provide a connection to the spirit, such as a possession, a garment, or a piece of its corpse.
A spirit unwilling to heed your call can attempt a [[Will]] save to avoid it; on a critical success, a trickster spirit [[Impersonate]]s the spirit you meant to call. The DC of the [[Will]] save is 2 lower if you haven’t met the spirit in life.
Either way, the spirit appears as a wispy form of the creature you meant to call. Each minute of the duration, you can ask the spirit a question. It can answer how it pleases or even refuse to answer.
If the spirit isn’t in the afterlife (such as if it’s an undead), all results other than critical failures use the failure effect.
{{||ActionSuccessTable}}
//Implied by [[Storm Lord]].//
In addition, once per round you can use a single action, which has the <<tag Concentrate>>and <<tag Manipulate>> traits, to call down a bolt of lightning, striking any target in range that you can see.
You deal 10d6 electricity damage to the target; it must attempt a basic [[Reflex]] save. On a failure, it is also [[Deafened]] for 1 round.
{{||SpellSummaryTable}}
''Trigger'' You are about to roll for [[Initiative]].
You cry out a call to arms, inspiring your allies to enter the fray.
Each ally in the area gains a +2 status bonus to their initiative roll and gains temporary Hit Points equal to the spell’s level; these temporary Hit Points last for the spell’s duration.
''Heightened (6th)'' The bonus increases to +3.
''Heightened (9th)'' The bonus increases to +4.
//Part of the text of [[Brightness Seeker]].//
''Trigger'' You attempt an attack roll, skill check, or saving throw while performing the course of action from your [[Augury]], but you haven’t rolled yet.
You gain a +1 status bonus to the triggering check, or a +2 status bonus if the result of the augury was “woe” and you proceeded anyway.
When you successfully [[Play to the Crowd]], add the following to the list of benefits you can choose from:
* Choose a creature within 30 feet that can see you to become [[Frightened]] 1. This effect has the emotion, fear, mental, and visual traits.
You have heard the Call, and in constantly resisting that persistent demand, you’ve developed a mental bulwark against effects that would target your mind.
You gain a +1 circumstance bonus to [[Will]] saving throws against <<tag Mental>> effects. If you roll a success on your saving throw against a mental effect that would make you [[Controlled]], you get a critical success instead.
You are among the most common of changelings—those born to green hags—and a vibrant green eye signifies that parentage. Your mother’s manipulative nature and versatile voice gives you an edge when deceiving others.
You gain the [[Charming Liar]] skill feat.
If you roll [[Deception]] for initiative, foes in that combat encounter that haven’t acted yet are [[Flat-Footed]] against you.
{{||SpellSummaryTable}}
You forcibly calm creatures in the area, soothing them into a nonviolent state; each creature must attempt a [[Will]] save.
{{||SaveSuccessTable}}
You alter your appearance to blend in to the wilderness.
In natural terrain, you can [[Sneak]] even if you’re [[Observed]].
''Frequency'' once per day
''Trigger'' An adjacent and [[Willing]] ally would be reduced to 0 HP but not killed.
You physically help an ally remain standing and encourage them to push through their pain against dire odds.
Your ally doesn’t fall unconscious and remains at 1 Hit Point. The ally also gains a number of temporary Hit Points equal to your level that last for 1 minute.
Fighting onward with such an injury isn’t without consequence; your ally’s [[Wounded]] condition increases by 1.
This tapered candle has a golden wick that burns with white fire.
You activate the candle by lighting it ({{OneAction}} Interact), which causes creatures within 10 feet of the candle to find it difficult to tell falsehoods.
Creatures in the area receive a –4 status penalty to [[Lie]].
In addition, when first entering the affected area, each creature (including you) must succeed at a DC 26 [[Will]] save or be unable to tell any deliberate lies while within 10 feet of the lit candle.
This lasts for as long as the candle is lit.
Once lit, the candle burns for 10 minutes, and it cannot be extinguished.
Your avoidance or observation is beyond the ken of most in your profession.
Choose [[Fortitude]] saves, [[Reflex]] saves, [[Will]] saves, or [[Perception]]. You become an expert in your choice.
At 17th level, you become a master in your choice.
The life energy that helped create the first hobgoblins is particularly potent in you, protecting you from ongoing maladies.
When you succeed at a saving throw against a <<tag Disease>> or <<tag Poison>>, you reduce the stage by 2 (or 1 for a virulent disease or poison), and when you critically succeed, you reduce the stage by 3 (or 2 for a virulent disease or poison).
''Frequency'' once per day
The life-giving energy that flows in your blood revitalizes you.
You recover 4d6 Hit Points and gain 10 temporary Hit Points for 1 minute.
When you reach 15th level, you instead recover 6d6 HP and gain 15 temporary HP.
''Frequency'' once per day
''Trigger'' A living creature within 60 feet would die.
The energy that flows in your blood can save a life in the direst of times.
The triggering creature receives the effects of [[Breath of Life]], except they recover a number of Hit Points equal to 6d8 plus your Constitution modifier.
Dedicated study allows you to prepare a wider range of simple spells.
You can prepare two additional [[Cantrip]]s each day.
{{||SpellSummaryTable}}
You become intensely entrancing, and creatures are distracted by you as long as they remain within the area.
You can exclude any creatures you choose from the effects.
When a creature enters the area for the first time, it must attempt a [[Will]] saving throw. If a creature leaves and reenters, it uses the results of its original save.
''Heightened (+1)'' Increase the size of the emanation by 15 feet.
{{||SaveSuccessTable}}
You can snare the attentions of onlookers with your unique appearance.
You can cast [[Enthrall]] as a 3rd-level occult innate spell once per day.
''Prerequisites'' Con 18, [[Pick Up the Pace]].
You know how to get the most effort out of your allies on the road.
When [[Hustling|Hustle]] in a group during exploration mode, your group can Hustle for as long as the member who could Hustle longest on their own, plus an additional 20 minutes beyond that.
You’ve explored enough dusty tombs and hidden vaults to gain a sixth sense about traps, and you sometimes notice them even when you’re not trying to.
Even if you aren’t [[Search]]ing in exploration mode, you get a check to find traps that normally require you to Search for them.
You still need to meet any other requirements to find the trap.
''Frequency'' once per day
''Requirements'' You haven’t yet acted on your turn.
You call upon your Cascade Bearer training to help you adjust a spell for the current situation.
Until the end of your turn, you gain a single metamagic feat from the druid class or the wizard class that has a level requirement of no more than half your level.
Your Cascade Bearer training allows you to broaden the horizons of your halcyon spells further than most Magaambyans, weaving in spiritual magic.
You can select halcyon spells from the divine or occult spell lists in additional to the arcane or primal spell lists, though they are still halcyon spells (so you choose when casting if they are
arcane or primal spells).
You gain a halcyon cantrip and a halcyon 1st-level spell.
You cast a spell you have prepared or in your repertoire.
Casting a Spell is a special activity that takes a variable number of actions depending on the spell, as listed in each spell’s stat block.
As soon as the spellcasting actions are complete, the spell effect occurs.
Some spells are cast as a reaction or free action. In those cases, you Cast the Spell as a reaction or free action (as appropriate) instead of as an activity. Such cases will be noted
in the spell’s stat block—for example, “[reaction] verbal.”
Some spells take minutes or hours to cast. The Cast a Spell activity for these spells includes a mix of the listed spell components, but it’s not necessary to break down which one you’re providing at a given time. You can’t use other actions or reactions while casting such a spell, though at the GM’s discretion, you might be able to speak a few sentences.
As with other activities that take a long time, these spells have the [[Exploration]] trait, and you can’t cast them in an encounter. If combat breaks out while you’re casting one, your spell is disrupted.
Each spell lists the spell components required to cast it after the action icons or text, such as “[three-actions] material, somatic, verbal." The spell components, described in detail below, add traits and requirements to the Cast a Spell activity. If you can’t provide the components, you fail to Cast the Spell.
* [[Material]] (manipulate)
* [[Somatic]] (manipulate)
* [[Verbal]] (concentrate)
* [[Focus]] (manipulate)
Some abilities and spells can disrupt a spell, causing it to have no effect and be lost.
When you lose a spell, you’ve already expended the spell slot, spent the spell’s costs and actions, and used the Cast a Spell activity.
If a spell is disrupted during a Sustain a Spell action, the spell immediately ends.
''Prerequisites'' harmful font or healing font
The sheer force of your faith can bring a foe crashing down.
If the next action you use is to cast [[Harm]] or [[Heal]] to damage one creature, the target is knocked [[Prone]] if it takes any damage from the spell.
If the target critically fails its save against the spell, it also takes a –10-foot status penalty to its Speed for 1 minute.
The force of your deity’s castigation strengthens your body so you can strike down the wicked.
After you damage a <<tag Fiend>> using a [[Heal]] spell, your weapon or unarmed [[Strike]]s deal extra <<tag Good>> damage to fiends equal to half the level of the heal spell until the end of your next turn.
This is cumulative with any good damage the weapon already deals (such as from a [[Holy]] rune).
''Size'' Small //(but a small tiger/jaguar or "Big cat", not Tiddles)//
''Melee'' {{OneAction}} jaws [[Finesse]], damage 1d6 piercing
''Melee'' {{OneAction}} talon ([[Agile]], [[Finesse]]), Damage 1d4 slashing
''Str'' +2, ''Dex'' +3, ''Con'' +1, ''Int'' –4, ''Wis'' +2, ''Cha'' +0
''Hit Points'' 4
''Skill'' [[Stealth]]
''Senses'' [[Low-Light Vision]], [[Scent]] (Imprecise, 30 feet)
''Speed'' 35 feet
''Support Benefit'' Your cat throws your enemies off-balance when you create an opening. Until the start of your next turn, your [[Strike]]s that deal damage to a creature that your cat threatens make the target [[Flat-Footed]] until the end of your next turn.
''Advanced Maneuver'' [[Cat Pounce]]
''Prerequisites'' Trained in [[Acrobatics]].
Your catlike aerial acrobatics allow you to cushion your falls.
Treat falls as 10 feet shorter. If you’re an expert in Acrobatics, treat falls as 25 feet shorter. If you’re a master in Acrobatics, treat them as 50 feet shorter.
If you’re legendary in Acrobatics, you always land on your feet and don’t take damage, regardless of the distance of the fall.
You can briefly sleep to regain your energy quickly.
Once per hour, by sleeping for 10 minutes, you can gain temporary Hit Points equal to your level that last for 10 minutes.
The cat [[Stride]]s and then [[Strike]]s.
If it was [[Undetected]] at the start of its Cat Pounce, it remains undetected until after the attack.
After you consume this elixir, your vision sharpens and you become sensitive to even the most minute movements.
For the next minute, you reduce the flat check to target [[Hidden]] creatures to 5, and you don’t need to attempt a flat check to target [[Concealed]] creatures.
These benefits apply only against creatures within 30 feet of you.
''Frequency'' once per day
''Trigger'' You fail a [[Reflex]] saving throw.
You instinctively twist away from danger.
You can reroll the triggering saving throw and use the better result.
{{||SpellSummaryTable}}
You call upon the unimaginable power of world-ending cataclysms, ripping a small piece of each cataclysm and combining them together into one horrifically powerful attack.
The following effects come down upon all creatures in the area.
Treat the resistances of creatures in the area as if they were 10 lower for the purpose of determining the cataclysm’s damage.
Each creature attempts one basic Reflex save that applies to all six types of damage.
* Flesh-dissolving acid rain deals 3d10 acid damage.
* A roaring earthquake shakes and bludgeons creatures on the ground, dealing 3d10 bludgeoning damage.
* A blast of freezing wind deals 3d10 cold damage.
* Incredible lightning lashes the area, dealing 3d10 electricity damage.
* Beating winds churn across the sky, dealing 3d10 bludgeoning damage to creatures flying in the area.
* An instant tsunami sweeps over creatures in the area, dealing 3d10 bludgeoning damage with the water trait (doubled for creatures swimming in the area).
* A massive wildfire burns in a sudden inferno, dealing 3d10 fire damage.
''Requirements'' The monster must have a free hand but can [[Release]] anything it’s holding as part of this reaction.
''Trigger'' The monster is targeted with a thrown rock [[Strike]] or a rock would fall on the monster.
The monster gains a +4 circumstance bonus to its [[AC]] against the triggering attack or to any defense against the falling rock. If the attack misses or the monster successfully defends against the falling rock, the monster catches the rock, takes no damage, and is now holding the rock.
You create a tune so catchy, your foes can’t help but dance along.
Attempt a [[Performance]] check against the [[Will]] DCs of all enemies in a 30-foot emanation.
{{||ActionSuccessTable}}
''Frequency'' once per day.
''Trigger'' An ally within 30 feet would be reduced to 0 HP but not immediately killed.
You give a daring yowl in the face of adversity, calling your companion back from the brink of unconsciousness.
Your ally isn’t knocked out and remains at 1 Hit Point. Your ally’s [[Wounded]] condition still increases by 1 as though they had been [[Dying]] and recovered.
Made of shiny brown leather, this +1 striking sling has a single white thread interwoven into its cord.
''Activate'' {{TwoAction}} [[Interact]] <<tag Sonic>>; ''Frequency'' once per day; ''Effect'' You pull the white thread free, then whirl the sling in circles at high speed. It lets out an ear-piercing wave of sound.
Each creature in a 30-foot [[Cone]] takes 4d6 sonic damage (DC 21 basic [[Fortitude]] save). Any creature that fails is [[Deafened]] for 1 round, or 1 hour on a critical failure.
You have a habit of always being in the way when other creatures attempt to move.
Attempt an [[Acrobatics]] check against an adjacent creature’s [[Reflex]] DC.
{{||SaveSuccessTable}}
Growing up among catfolk has taught you the traditional values of freedom to travel, stewardship of the land, and quick reactions when your curiosity lands you in trouble.
You gain the trained proficiency rank in [[Acrobatics]] and [[Survival]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Catfolk [[Lore]].
Whenever you gain a class feature that grants you expert or greater proficiency in certain weapons, you also gain that proficiency rank in all weapons you are trained in from [[Catfolk Weapon Familiarity]].
You favor weapons that you can use with quick, darting slashes like a cat’s claws.
You are trained with the [[Hatchet]], [[Kama]], [[Kukri]], [[Scimitar]], and [[Sickle]].
In addition, you gain access to kama, kukris, and all uncommon catfolk weapons.
For you, martial catfolk weapons are simple weapons and advanced catfolk weapons are martial weapons.
You know how to efficiently use weapons that rake across your enemies.
Whenever you critically hit using a catfolk weapon or one of the weapons listed in [[Catfolk Weapon Familiarity]], you apply the weapon’s [[Critical Specialization Effect]].
You’ve adopted the calming presence of catrinas, the festive dead; you might have even danced with a catrina yourself!
So long as you are visibly carrying fresh flowers or colorful ribbons somewhere on your person, you can cast [[Calm Emotions]] twice per day as a 2nd-level divine innate spell.
You can use the [[Craft]] activity to create oils and potions.
You immediately gain the formulas for four common 1st-level oils or potions. At 4th level and every 2 levels beyond that, you gain the formula for a common oil or potion of that level or lower (a 4th-level potion if you’re 4th level, a 6th-level potion if you’re 6th level, and so on).
If you have a familiar, you can have your familiar learn these formulas rather than storing them in a formula book. Your familiar can learn new formulas in the same way it learns new spells, and these formulas are transferred from a slain familiar to a new familiar in the same way spells are.
You can brew a great deal of magic within your cauldron. When you Craft a batch of oils or
potions, you can make up to six in a batch instead of the usual four per batch.
''Prerequisites'' at least one arcane or occult innate spell gained from a gnome heritage or gnome ancestry feat.
You’ve learned a few magical techniques for getting yourself both into and out of trouble unnoticed.
You gain [[Misdirection]] and [[Silence]] as 2nd-level arcane or occult innate spells. The tradition of these spells must match the tradition you use for your gnome ancestry options.
You can cast each spell once per day and can target only yourself.
You gain a young [[Animal Companion|Animal Companions]] that serves as your mount.
You can choose from animal companions with the mount special ability, as well as any additional options from your pledge, as determined by your GM.
You must choose an animal companion that’s at least one size larger than you, but if the animal usually starts as Small, you can begin with a Medium version of that animal (changing no statistics other than its size).
Many cavaliers pledge themselves in service to a specific organization or individual, such as a noble family or sovereign ruler, a knightly order or another organization, or a particular ideal.
A cavalier pledged to an order or ideal must uphold its edicts and is beholden to any anathema it has; for example, a cavalier pledged to the druid’s animal order would be tied to that anathema, while a cavalier pledged to the church of Abadar would be held to the same standards as a cleric of that god. If you pledge yourself to an entity or cause without a stated anathema, you should work with your GM to determine the edicts and anathema associated with your pledge.
Cavaliers who have pledged themselves can gain access to certain abilities related to that pledge, such as Cavalier’s Banner.
If you violate the anathema of your pledge, you lose access to those feats until you benefit from an atone ritual.
Changing the subject of your pledge is equivalent to retraining a class feature.
''Special'' If you have pledged to the organization associated with another other dedication feat, //you can take that dedication feat without needing to take two feats from this archetype first//. For example, if you are pledged to a knightly order, you could take a dedication feat for that order without needing to gain other feats from the cavalier archetype first.
<<archetypefeatlist "4 6 8 10 14 20" "[[Cavalier]]">>
''Requirements'' You have pledged your service to a specific organization or ideal.
You fly the banner of your pledge from your mount, raising your allies’ spirits.
You and all allies within 30 feet gain a +1 circumstance bonus to [[Will]] saves and DCs against <<tag Fear>> effects.
If your banner is destroyed or removed, allies within 30 feet become [[Frightened]] 1.
''Requirements'' You are riding your mount.
You [[Command an Animal]] to order your mount to [[Stride]] twice.
At any point during this movement, you can [[Strike]] one enemy within reach or within the first range increment of a ranged weapon. You gain a +1 circumstance bonus to your attack roll.
After years of crawling and climbing through caverns, you can climb easily anywhere you go. You gain a climb Speed of 10 feet.
You gain the [[Combat Climber]] skill feat, even if you don’t meet the prerequisites. You can use your clawed feet and tail to [[Climb]], leaving your hands free. Additionally, if you succeed at an Athletics check to Climb, you critically succeed instead.
When [[Climb]]ing rock walls, stalactites, and other natural stone features, you move at half your Speed on a success and at full Speed on a critical success (and you move at full Speed on a success if you have [[Quick Climb]]). This doesn’t affect you if you’re using a climb Speed. If you roll a success on an [[Acrobatics]] check to [[Squeeze]], you get a critical success instead.
You excel at going unnoticed, especially among a crowd.
You no longer need to have [[Cover]] or be [[Concealed]] to [[Hide]] or [[Sneak]].
If you would have lesser cover from creatures, you gain cover and can [[Take Cover]], and if you would have cover from creatures, you gain greater cover.
You are a cel rau, child of a strigoi, one of the first vampires to walk Golarion. Your heritage ties you to the Shadow Plane and grants you strange resilience to light and darkness alike.
You gain a +1 circumstance bonus to saving throws against effects with the <<tag Darkness>>, <<tag Light>>, or <<tag Shadow>> traits, and whenever you become [[Dazzled]] or [[Blinded]] for at least 2 rounds, you can reduce the duration by 1 round.
The more people you have looking at you, the more content you are, and you take every opportunity to show up others when their performances are less than perfect.
You gain the [[Upstage]] reaction. In addition, when you [[Earn Income]], if the level of the task is higher than your level, you gain a +1 circumstance bonus to your check to Earn Income.
//This has no prerequisites! Apparently you don't need to be particularly good at anything to be a celebrity...//
<<archetypefeatlist "4 6 10" "[[Celebrity]]">>
Creatures that hail from or have a strong connection to the good-aligned planes are called celestials.
Celestials can survive the basic environmental effects of planes in the Outer Sphere.
''Craft Requirements'' You are good.
This suit of [[+2|Armor Potency]] [[Resilient]] chain mail is made of fine white links of a strange and slightly translucent pale metal, and the sleeves and skirt are fashioned into smaller trails that resemble feathers.
Unlike normal chain mail, celestial armor has no Speed reduction, its armor check penalty is 0, and its Bulk is 1.
You gain a +1 circumstance bonus to AC and saving throws against fiends.
You appear radiant while you wear the armor, giving you a +2 item bonus to [[Diplomacy]] checks against all creatures except fiends.
If you are not good, you are [[Drained]] 2 while wearing celestial armor. You can’t recover from this condition while wearing the armor.
''Activate'' {{OneAction}} Command; ''Frequency'' once per day; ''Effect'' The armor sprouts glowing wings that grant you a fly Speed of 30 feet. The wings shed bright light in a 40-foot radius (and [[Dim Light]] to the next 40 feet). The wings fade away after 10 minutes.
{{||SpellSummaryTable}}
A blazing symbol appears on the target, marking it for divine justice.
You and your allies receive a +1 status bonus to your attack rolls and skill checks against it.
Anytime a <<tag Good>>creature damages it, the good creature deals an additional 1d4 good damage.
The target is then temporarily immune for 1 minute.
''Heightened (+2)'' The good damage increases by 1.
You gain the [[Invoke Celestial Privilege]] reaction. Your alternate form is a common Medium humanoid ancestry prevalent where you grew up (typically human), called a tailless form.
''Prerequisites'' [[Low-Light Vision]]
You can see through darkness. You gain [[Darkvision]].
''Special'' You can select this feat only at 1st level, and you can’t retrain into or out of this feat.
''Prerequisites'' tenets of good.
You take on a celestial countenance, appearing like a type of celestial who serves your deity; for example, as an angel, you would gain a halo and feathery wings.
You gain a fly Speed equal to your Speed.
You gain [[Darkvision]] if you don’t already have it, and you gain the <<tag Celestial>> trait and the trait appropriate to the type of servitor you’ve become (archon, angel, or azata, for example).
//You don't gain the abilities, skills, attacks, etc. of your celestial.//
You were raised with an aasimar or celestial relative, or you’ve devoted yourself to researching the secrets of the celestial realms.
You gain the trained proficiency rank in [[Diplomacy]] and [[Religion]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in a [[Lore]] skill related to the celestial realm from which you trace your lineage (usually Elysium Lore, Heaven Lore, or Nirvana Lore).
''Prerequisites'' [[Divine Ally]] (steed), tenets of good.
Your steed gains incredible celestial powers granted by your deity.
It gains [[Darkvision]], its maximum Hit Points increase by 40, and it gains weakness 10 to evil damage.
Additionally, it grows wings appropriate to a servitor of your deity (such as metallic wings for an archon), granting it a fly Speed equal to its Speed.
It gains the <<tag Celestial>> trait and the trait appropriate to the type of servitor it has become (archon, angel, or azata, for example).
Your growing connection to your celestial forebears has granted you one of their resistances as well.
Choose one of the following energy damage types: <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, <<tag Fire>> or <<tag Sonic>>.
You gain resistance 5 to that damage type.
Though you can choose any of these energy damage types, the damage type typically matches a celestial associated with your bloodline. For instance, an [[Angelkin]] might choose resistance to cold or fire with a cassisian forebear, resistance to fire with a balisse forebear, or resistance to sonic with a choral forebear.
Your connection to good arms all your attacks against forces of evil.
All your weapon and unarmed [[Strike]]s deal 1 additional good damage and have the <<tag Good>> and <<tag Magical>> traits.
With effort, you can call forth magical wings from your back, similar in appearance to those of your celestial forebears.
These wings remain for 10 minutes.
You gain a fly Speed equalto your Speed while you’ve manifested your wings.
You can call forth a holy word from the celestial realms to punish your foes.
Once per day, you can cast [[Divine Decree]] as a 7th-level divine innate spell. You must choose good for the spell’s alignment, and you can [[Cast the Spell|Cast a Spell]] regardless of whether you worship a deity or what their alignment is.
Even when you don’t hit squarely, you can still score a glancing blow.
Make a melee [[Strike]].
It gains the following failure effect: Your attack deals any damage it would have dealt on a hit, excluding all damage dice. (This removes damage dice from weapon runes, spells, and special abilities, in addition to weapon damage dice.)
Made from a carefully distilled blend of serpentine hemotoxins, the fast-acting cerulean scourge is infamous for transforming the blood vessels near the original wound, which glow with a bright blue light before painfully bursting.
| !Saving Throw |DC 36 [[Fortitude]] |
| !Maximum Duration |6 rounds |
| !Stage 1 |9d6 poison damage (1 round) |
| !Stage 2 |12d6 poison damage (1 round) |
| !Stage 3 |15d6 poison damage (1 round) |
{{||SpellSummaryTable}}
You discharge a powerful bolt of lightning at the target, dealing 8d12 electricity damage.
The electricity arcs to another creature within 30 feet of the first target, jumps to another creature within 30 feet of that target, and so on.
You can’t target the same creature more than once, and you must have line of effect to all targets.
You can end the chain at any point.
//Each// target must attempt a basic Reflex save.
Roll the damage only once, and apply it to each target (halving or doubling as appropriate for its saving throw outcome).
The chain ends if any one of the targets critically succeeds at its save.
''Heightened (+1)'' The damage increases by 1d12.
{{||SpellSummaryTable}}
You shift the colors of the targets’ outermost layer of clothing and gear to be closer to their environment when they remain still.
Creatures affected by the spell gain a +3 status bonus to [[Stealth]] checks to [[Hide]].
The changed color granted by the spell always shifts to match the environment, even if there are drastic changes.
If any piece of gear or clothing affected by the spell is removed from a creature, the spell ends for that creature.
''Heightened (6th)'' If a creature affected by this spell rolls a critical failure on its [[Stealth]] check to [[Sneak]] within 30 feet of a creature that would spot it, it instead only fails its check, as the spell mildly hypnotizes the spotter.
''Heightened (8th)'' As 6th level, and the status bonus is +4.
The color of your hair and skin is mutable, possibly due to latent magic. You can slowly change the vibrancy and the exact color, and the coloration can be different across your body, allowing you to create patterns or other colorful designs. It takes a single action for minor localized shifts and up to an hour for dramatic shifts throughout your body. While you’re asleep, the colors shift on their own in tune with your dreams, giving you an unusual coloration each morning. When you’re in an area where your coloration is roughly similar to the environment (for instance, forest green in a forest), you can use the single action to make minor localized shifts designed to help you blend into your surroundings. This grants you a +2 circumstance bonus to [[Stealth]] checks until your surroundings shift in coloration or pattern.
!! Splats
<$list filter="[tag<currentTiddler>tag[Splat]]" />
!! Class Features
| !Level | !Features |
| 1 | [[Champion's Code]], Deity and Cause, [[Deific Weapon]], Champion's Reaction (Cause feature), Devotion Spells, [[Shield Block]] |
| 2 | |
| 3 | [[Divine Ally]] |
| 4 | |
| 5 | [[Weapon Expertise]] |
| 6 | |
| 7 | [[Armor Expertise]], [[Weapon Specialization]] |
| 8 | |
| 9 | [[Champion Expertise]], Divine Smite (Champion's Reaction feature), [[Juggernaut]], [[Lightning Reflexes]] |
| 10 | |
| 11 | [[Alertness]], [[Divine Will]], Exalt (Champion's Reaction feature) |
| 12 | |
| 13 | [[Armor Mastery]], [[Weapon Mastery]] |
| 14 | |
| 15 | [[Greater Weapon Specialization]] |
| 16 | |
| 17 | [[Champion Mastery]], [[Legendary Armor]] |
| 18 | |
| 19 | [[Hero's Defiance]] |
| 20 | |
!! Class Feats
{{||ClassFeatList}}
Choose a deity and cause as you would if you were a [[Champion]].
You become trained in light, medium, and heavy armor.
You become trained in [[Religion]] and your deity’s associated skill; for each of these skills in which you were already trained, you instead become trained in a skill of your choice.
You become trained in champion class DC.
You are bound by your deity’s anathema and must follow the champion’s code and alignment requirements for your cause.
You don’t gain any other abilities from your choice of deity or cause.
!! Causes
<$list filter="[tag[Champion]tag[Splat]]" />
<<levelfeatlist "4 6 14" "[tag[Archetype]field:feat-arch[Champion]]">>
Prayers strengthen your divine power.
Your proficiency ranks for your champion class DC and divine spell attack rolls and DCs increase to expert.
You’ve mastered your arsenal of champion techniques and divine spells.
Your proficiency ranks for your champion class DC and for divine spell attack rolls and spell DCs increase to master.
''Prerequisite'' class granting no more Hit Points per level than 8 + your Constitution modifier.
You gain 3 additional Hit Points for each champion archetype class feat you have.
As you continue selecting champion archetype class feats, you continue to gain additional Hit Points in this way.
You follow a code of conduct, beginning with tenets shared by all champions of an alignment, and continuing with tenets of your cause.
Deities often add additional strictures.
Tenets are listed in order of importance, starting with the most important. If a situation places two tenets in conflict, you aren’t in a no-win situation; instead, follow the more important tenet. For instance, as a paladin, if an evil king asked you if you’re hiding refugees so he could execute them, you could lie to him, since the tenet against lying is less important than preventing harm to innocents.
Trying to subvert your code by creating a situation that forces a higher tenet to override a lower tenet (for example, promising not to respect authorities and then, to keep your word, disrespecting authorities) is a violation of the champion code.
If you stray from your alignment or violate your code of conduct, you lose your focus pool and [[Divine Ally]] until you demonstrate your repentance by conducting an [[Atone]] ritual, but you keep any other champion abilities that don’t require those class features.
If your alignment shifts but is still one allowed by your deity, your GM might let you retrain your cause while still following the same deity.
You can use the champion’s reaction associated with your cause.
{{||SpellSummaryTable}}
''Trigger'' An ally is hit by a Strike, or an ally fails a saving throw against an effect that doesn't affect you.
You form a link with an ally, allowing you to take harm in their stead.
All the effects of the hit or failed save are applied to you instead of the ally. For example, if the target critically fails a saving throw against a fireball, you would take double damage.
These effects ignore any resistances, immunities, or other abilities you have that might mitigate them in any way, although those of the target apply before you take the effect.
''Frequency'' once per day
''Trigger'' You would die as a result of a failed saving throw or recovery check.
Your previous life ended due to sheer poor luck, struck by lightning or choking on a fish bone.
You can reroll the triggering recovery check or saving throw, but you must use the new result, even if it’s worse than the first roll.
''Special'' You can select this feat only at 1st level, and you can’t retrain into or out of this feat.
//Implied by [[Shapechange]].//
You can change your form to any other form you could choose with this spell by using a single action, which has the Concentrate trait.
You change into your humanoid or hybrid shape.
Each shape has a specific, persistent appearance, and most beastkin remain in their hybrid shapes by default. In hybrid shape, you appear as a mix between your ancestry and your inherent animal.
While in hybrid shape, you gain a jaws unarmed [[Strike]] resembling the features of your inherent animal (fangs for bats, beaks for eagles, mandibles for wasps, and so on). Your jaws deal 1d4 piercing damage, have the [[Agile]], [[Finesse]], and [[Unarmed]] traits, and are in the brawling weapon group.
In your humanoid shape, you retain the appearance of your original ancestry.
You transform into a specific alternate form determined by your heritage.
If your heritage doesn’t list a form, your alternate form is a tailless form, which is a common Medium humanoid ancestry prevalent where you grew up (typically human).
This form is the same age and body type as your true form and has roughly analogous physical traits, such as hair color.
Using Change Shape counts as creating a disguise for the [[Impersonate]] use of [[Deception]].
You lose any unarmed Strikes you gained from a kitsune heritage or ancestry feat in this form.
You can remain in your alternate form indefinitely, and you can shift back to your true kitsune form by using this action again.
| !Heritage | !Form |
| [[Celestial Envoy Kitsune]] | Tailless |
| [[Dark Fields Kitsune]] | Fox (per 1st level [[Pest Form]]) |
| [[Earthly Wilds Kitsune]] | Fox (per 1st level [[Pest Form]]) |
| [[Empty Sky Kitsune]] | Tailless |
| [[Frozen Wind Kitsune]] | Tailless |
The monster changes its shape indefinitely.
It can use this action again to return to its natural shape or adopt a new shape.
Unless otherwise noted, a monster cannot use Change Shape to appear as a specific individual.
Using Change Shape counts as creating a disguise for the [[Impersonate]] use of [[Deception]]. It gains a +4 status bonus to its Deception DC to prevent others from seeing through its disguise.
The monster’s transformation automatically defeats [[Perception]] DCs to determine whether the creature is a member of the ancestry or creature type into which it transformed.
Change Shape abilities specify what shapes the monster can adopt.
The monster doesn’t gain any special abilities of the new shape, only its physical form. For example, in each shape, it replaces its normal Speeds and [[Strike]]s, and might potentially change its senses or size. Any changes are listed in its stat block.
''Implied by the text of [[Wind Walk]].''
You can change the wind’s direction by using a single action, which has the Concentrate trait.
Your mother was a hag. Your heterochromatic eyes are the most obvious signifier of this parentage, but you likely also have a slighter build, paler skin, and darker hair than most members of your other parent’s ancestry.
You gain the <<tag Changeling>> trait.
You also gain [[Low-Light Vision]], or you gain [[Darkvision]] if your ancestry already has low light vision.
You can select from <<tag Changeling>> feats and feats from your other parent’s ancestry whenever you gain an ancestry feat.
{{||VHerFeatList}}
All too aware of your true nature, you’ve studied hags and their powers.
You gain the trained proficiency rank in [[Deception]] and [[Occultism]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Hag [[Lore]].
''Prerequisites'' harmful font or healing font
''Cost'' Expend a [[Harm]] or [[Heal]] spell.
You siphon the destructive energies of positive or negative energy through a melee attack and into your foe.
Make a melee [[Strike]] and add the spell’s damage to the Strike’s damage.
This is negative damage if you expended a harm spell or positive damage if you expended a heal spell.
The spell is expended with no effect if your [[Strike]] fails or hits a creature that isn’t damaged by that energy type (such as if you hit a non-<<tag Undead>> creature with a heal spell).
''Frequency'' once per day
You tap into the Godmind’s collective cognitive well, rapidly parsing near-infinite variables to read your surroundings.
For 1 minute, you gain precise motion sense out to 60 feet, you can see invisible creatures and objects, and you gain the effects of a 9th-level [[True Seeing]].
''Prerequisites'' healing font.
You can remove conditions with divine grace.
You can sacrifice one [[Heal]] spell you’ve prepared in your extra slots from healing font to cast one of the following spells instead: [[Remove Curse]], [[Remove Disease]], [[Remove Paralysis]], or [[Restoration]].
The spell is heightened to the same level as the heal spell you sacrificed.
//Implied by [[Positive Luminance]].//
At the start of each of your turns, you can use a free action to increase the luminance reservoir by 4. If you do, the radius of your light increases by 10 feet.
Your magic is drawn to your persistent creations.
While you are within 30 feet of and have line of effect to your persistent creation, you can use it as the origin point for your line or cone spells. For instance, a [[Lightning Bolt]] could originate from the persistent creation rather than from you.
{{||SpellSummaryTable}}
You fire a javelin of electricity that leaves a charged field around its target.
Make a spell attack roll.
The javelin deals 1d6 electricity damage and 1 persistent electricity damage. //On a critical hit, // the javelin deals double damage, both initial and persistent.
As long as the target is taking persistent damage from this spell, creatures gain a +1 status bonus to attack rolls with metal weapons or <<tag Electricity>> effects against the target, and the target takes a –1 status penalty to saves against <<tag Electricity>> effects.
''Heightened (+1)'' The initial damage increases by 1d6, and the persistent damage increases by 1.
You gain fire resistance equal to half your level (minimum 1). You can also recover from being on fire more easily. Your flat check to remove persistent fire damage is DC 10 instead of DC 15, which is reduced to DC 5 if another creature uses a particularly appropriate action to help.
Charisma measures your character’s personal magnetism and strength of personality.
A high Charisma score helps you influence the thoughts and moods of others.
//Charisma governs [[Deception]], [[Diplomacy]], [[Intimidation]], and [[Performance]].//
//Being [[Stupefied]], [[Sickened]] or [[Frightened]] reduces your Charisma rolls.//
{{||StatModSummary}}
{{||SpellSummaryTable}}
You speak on the virtue of charity, compelling the target to give away its possessions.
The target must attempt a [[Will]] save.
If the target has no items on its person, the spell fails.
{{||SaveSuccessTable}}
You’ve learned to mimic the abilities of spellcasters by studying their flourishes and words.
When you activate a magic item to generate a spell effect, attempt a [[Deception]] check. If you succeed against an onlooker’s Perception DC, to that onlooker, you appear to Cast that Spell instead.
Onlookers who successfully [[Recognize the Spell|Recognize Spell]] realize you used a magic item, though those who later successfully [[Identify the Magic|Identify Magic]] still can’t determine that the source of the effect was a magic item.
{{||SpellSummaryTable}}
To the target, your words are honey and your visage seems bathed in a dreamy haze.
It must attempt a Will save, with a +4 circumstance bonus if you or your allies recently threatened it or used [[Hostile Action]]s against it.
You can Dismiss the spell.
If you use hostile actions against the target, the spell ends.
When the spell ends, the target doesn’t necessarily realize it was charmed unless its friendship with you or the actions you convinced it to take clash with its expectations, meaning you could potentially convince the target to continue being your friend via mundane means.
''Heightened (4th)'' The duration lasts until the next time you make your [[daily preparations|Rest]].
''Heightened (8th)'' The duration lasts until the next time you make your [[daily preparations|Rest]], and you can target up to 10 creatures.
{{||SaveSuccessTable}}
''Prerequisites'' Trained in [[Deception]].
Your charm allows you to win over those you lie to.
When you get a critical success using the [[Lie]] action, the target’s attitude toward you improves by one step, as though you’d succeeded at using [[Diplomacy]] to [[Make an Impression]].
This works only once per conversation, and if you critically succeed against multiple targets using the same result, you choose one creature’s attitude to improve.
You must be lying to impart seemingly important information, inflate your status, or ingratiate yourself, which trivial or irrelevant lies can’t achieve.
{{||SpellSummaryTable}}
You infuse your target with attraction, causing it to act friendlier toward you.
The target attempts a [[Will]] save. It gains a +4 circumstance bonus to this save if you or your allies recently threatened or were hostile to it.
You can [[Dismiss]] the spell.
If you use [[Hostile Action]]s against the target, the spell ends.
After the spell ends, the target doesn’t necessarily realize it was charmed unless its friendship with you or the actions you convinced it to take clash with its expectations, which could potentially allow you to convince the target to continue being your friend via mundane means.
''Heightened (4th)'' You can target any type of creature, not just humanoids, as long as it could find you attractive.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You whisper enchanting words to deflect your foe’s ire.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
''Frequency'' once per day
Your next fire spell leaves embers in its wake.
If your next action is to [[Cast a Spell]] with an area and the <<tag Fire>> trait, for 1 minute, your spell’s area becomes [[Difficult Terrain]] as well as Hazardous Terrain, dealing 1 fire damage for each square a creature moves through.
Your cheeks are stretchy, and you can store up to four items of light Bulk or less in these cheek pouches.
None of these items can have a dimension longer than 1 foot. As long as you have at least one item in your cheek pouches, your speech is noticeably difficult to understand.
Placing an item in your cheek pouch or retrieving one is an [[Interact]] action.
You can empty your mouth with a single action, causing everything you had stored in your cheek pouches to fall to the ground in your square.
Enzymatic compounds in this elixir strengthen and excite the muscles in your legs.
You gain a status bonus to your Speed for the listed duration. //NB: Not an item bonus.//
| !Type | !Level | !Price | !Speed status bonus | !Duration |
| Lesser | 1 | 30 | +5' | 1 minute |
| Moderate | 5 | 250 | +10' | 10 minutes |
| Greater | 9 | 1100 | +10' | 1 hour |
''Trigger'' A creature within 30 feet critically fails its initial saving throw against a poison you created.
With carefully engineered enzymes, you coax some of your poison to infect another target, using the original victim as a carrier.
A creature adjacent to the triggering creature is exposed to the triggering poison.
{{||SpellSummaryTable}}
Siphoning negative energy into yourself, your hand radiates a pale darkness. Your touch weakens the living and disorients undead, possibly even causing them to flee.
The effect depends on whether the target is living or undead.
* ''Living Creature'' The spell deals negative damage equal to 1d4 plus your spellcasting modifier. The target attempts a basic [[Fortitude]] save, but is also [[Enfeebled]] 1 for 1 round on a critical failure.
* ''Undead Creature'' The target is [[Flat-Footed]] for 1 round on a failed Fortitude save. On a critical failure, the target is also [[Fleeing]] for 1 round unless it succeeds at a [[Will]] save.
''Heightened (+1)'' The negative damage to living creatures increases by 1d4.
{{||SpellSummaryTable}}
You shoot an utterly cold ray of darkness tinged with unholy energy.
Make a ranged spell attack against the target.
You deal 5d6 cold damage, plus 5d6 evil damage if the target is a celestial.
If the ray passes through an area of magical light or targets a creature affected by magical light, chilling darkness attempts to [[Counteract]] the light.
If you need to determine whether the ray passes through an area of light, draw a line between yourself and the spell’s target.
''Heightened (+1)'' The cold damage increases by 2d6, and the evil damage against celestials increases by 2d6.
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
A cone of icy shards bursts from your spread hands and coats the targets in a layer of frost.
You deal 2d4 <<tag Cold>> damage to creatures in the area; they must each attempt a [[Reflex]] save.
''Heightened (+1)'' The damage increases by 2d4.
{{||SaveSuccessTable}}
This hollow mithral tube is about a foot long and bears engravings reminiscent of open locks and broken chains.
The chime can be activated 10 times before it cracks and becomes useless.
''Activate'' {{OneAction}} Interact; ''Effect'' You aim the chime at a container, door, or lock you want to open and strike the chime. The chime sends out magical vibrations that attempt a [[Thievery]] check against the lock’s DC, with a Thievery bonus of +13. This targets only one lock or binding at a time, so you might need to activate the chime multiple times to open a target with several forms of protection.
You concentrate on healing others with alchemy.
''Level 1'': You start with the formulas for two of the following in your formula book, in addition to your other formulas: lesser [[Antidote]], lesser [[Antiplague]], or __minor__ [[Elixir of Life]].
''Level 1'': As long as your proficiency rank in [[Medicine]] is trained or better, you can attempt a [[Crafting]] check instead of a Medicine check for any of Medicine’s untrained and trained uses.
''Level 5'': When using [[Advanced Alchemy]] to make elixirs of life during your daily preparations, you can create three elixirs with each batch of reagents instead of two.
''Level 13'': When you use [[Quick Alchemy]] to create any type of elixir of life, the creature drinking the elixir gains the maximum Hit Points possible for that elixir, instead of rolling to determine the number of Hit Points regained.
{{LOCGFeat}}
Choose one goblin heritage that you do not already have; you gain that heritage and its benefits.
{{||SpellSummaryTable}}
Your hand glows with impossible colors from beyond the stars, and your touch saps both color and vitality from the living.
The target must attempt a [[Fortitude]] save; creatures with the <<tag Gnome>> trait take a –2 circumstance penalty to this save.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You create an opaque [[Wall]] of light in a single vibrant color.
The wall is straight and vertical, stretching 60 feet long and 30 feet high.
If the wall would pass through a creature, the spell is lost.
The wall sheds bright light for 20 feet on each side, and dim light for the next 20 feet. You can ignore the wall’s effects //when passing thorugh, but it still blocks your weapons and effects//.
Roll 1d4 to determine the color of the wall. Each color has a particular effect on items, effects, or creatures that attempt to pass through.
Chromatic wall can’t be [[Counteract]]ed normally; rather, each color is automatically counteracted when targeted by a specific spell, even if that spell’s level is lower than that of chromatic wall.
{{ChromaWall14}}
''Heightened (7th)'' The spell’s duration increases to 1 hour. Roll 1d8 to determine the wall’s color; the results for 5–8 are below.
A red, orange, yellow, or green wall deals an extra 10 damage.
{{ChromaWall57}}
<ol start="8">
<li>Reroll, and creatures that pass through the wall take a –2 circumstance penalty to their saves.</li>
</ol>
# ''Red'' The wall destroys ranged weapon ammunition (such as arrows and crossbow bolts) that would pass through, and it deals 20 fire damage to anyone passing through, with a basic [[Reflex]] save. [[Cone of Cold]] can counteract a red chromatic wall.
# ''Orange'' The wall destroys thrown weapons that would pass through, and it deals 25 acid damage to anyone passing through, with a basic [[Reflex]] save. [[Gust of Wind]] can counteract an orange chromatic wall.
# ''Yellow'' The wall stops <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, <<tag Fire>>, <<tag Force>>, <<tag Negative>>, <<tag Positive>>, and <<tag Sonic>>effects from passing through, and it deals 30 electricity damage to anyone passing through, with a basic [[Reflex]] save. [[Disintegrate]] can counteract a yellow chromatic wall.
# ''Green'' The wall stops toxins, gases, and breath weapons from passing through. It deals 10 poison damage to anyone passing through and makes them [[Enfeebled]] 1 for 1 minute. A basic [[Fortitude]] save reduces the damage and negates the enfeebled condition on a success. [[Passwall]] can counteract a green chromatic wall.
<ol start="5">
<li>''Blue'' The wall stops <<tag Auditory>>, <<tag Petrification>>, and <<tag Visual>> effects from passing through, and creatures passing through are subject to the effects of [[Flesh to Stone]]. [[Magic Missile]] can counteract a blue chromatic wall.</li>
<li>''Indigo'' The wall stops <<tag Divination>>and <<tag Mental>> effects from passing through, and those passing through are subject to the effects of [[Warp Mind]]. [[Searing Light]] can counteract an indigo chromatic wall.</li>
<li>''Violet'' The wall prevents spells from targeting the other side (area effects still cross as normal). Creatures passing through must succeed at a [[Will]] save or they are [[Slowed]] 1 for 1 minute; on a critical failure, the creature is instead sent to another plane, with the effect of [[Plane Shift]]. [[Dispel Magic]] can counteract a violet chromatic wall.</li>
</ol>
This sharp-taloned +1 [[Striking]] [[Spiked Gauntlet]] appears to have been crafted from dragon scales, with claws built from iron.
In addition to the typical weapon traits, a Cinderclaw gauntlet has the [[Versatile]] S trait.
On a critical hit, the Cinderclaw gauntlet deals an additional 1d6 <<tag Fire>> damage.
''Activate'' {{ReactionIcon}} command; ''Trigger'' Your attack roll with the Cinderclaw gauntlet is a critical success.
''Effect'' The creature you hit must succeed at a DC 19 Fortitude save or be [[Sickened]] 1 by the gauntlet’s acrid smoke. Creatures that don’t need to breathe are immune.
The fire of your elemental ancestor manifests like dying embers of a blaze, and your inner charcoal helps staunch bleeding, purify simple poisons, and absorb acid.
The DC for you to recover from persistent acid, bleed, and poison damage is 10 instead of 15 (or 5 if you have particularly effective assistance).
{{||SpellSummaryTable}}
You ward a creature and those nearby against a specified alignment.
Choose <<tag Chaotic>>, <<tag Evil>>, <<tag Good>>, or <<tag Lawful>>; this spell gains the opposing trait.
Creatures in the area gain a +1 status bonus to [[AC]] against attacks by creatures of the chosen alignment and to saves against effects from such creatures.
This bonus increases to +3 against effects from such creatures that directly control the target and attacks made by summoned creatures of the chosen alignment.
Summoned creatures of the chosen alignment can’t willingly enter the area without succeeding at a [[Will]] save; repeated attempts use the first save result.
''Heightened (4th)'' The duration increases to 1 hour.
You know that the greatest treasures often look like refuse, and you scoff at those who throw away perfectly good scraps.
You gain a +1 circumstance bonus to checks to [[Subsist]], and you can use [[Society]] or [[Survival]] when you Subsist in a settlement.
When you Subsist in a city, you also gather valuable junk that silly longshanks threw away. You can [[Earn Income]] using Society or Survival in the same time as you Subsist, without spending any additional days of downtime. You also gain a +1 circumstance bonus to this check.
''Special'' If you have the irongut goblin heritage, increase the bonuses to +2.
{{||SpellSummaryTable}}
You attempt to wrest control of a target undead or force it to recognize you as its master.
If the target is controlled by another creature, that controller attempts a [[Will]] saving throw to retain control; otherwise, the target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You create an invisible floating ear at a location within range (even if it’s outside your line of sight or line of effect).
It can’t move, but you can hear through the ear as if using your normal auditory senses.
{{||SpellSummaryTable}}
You create an invisible floating eye at a location within range (even if it’s outside your line of sight or line of effect).
The eye can’t move, but you can see in all directions from that point as if using your normal visual senses.
You get one [[Clan Dagger]] of your clan for free, as it was given to you at birth.
Selling this clan dagger is a terrible taboo and earns you the disdain of other dwarves.
Your clan dagger can protect your allies as easily as yourself.
When you use an [[Interact]] action to gain a circumstance bonus to AC from your clan dagger’s [[Parry]] trait, you can grant the circumstance bonus to an adjacent ally instead of gaining it yourself.
You can use multiple [[Interact]] actions to protect multiple allies, or to protect yourself and an ally. The ally benefits from the bonus to AC only when they are adjacent to you.
{{LOCGFeat}}
''Prerequisites'' Trained in Clan Daggers.
By moving your clan dagger with rapid precision, you can protect yourself more effectively.
Make two clan dagger [[Strike]]s against different targets. Your [[Multiple Attack Penalty]] applies normally to these Strikes. You then use an [[Interact]] action to gain the +1 circumstance bonus to your AC from your clan dagger’s [[Parry]]ing trait.
<$list filter="[tag[Class]!tag[Feat]sort[]]">
<table>
<tr><th>Level</th><th>Feats</th></tr>
<$list filter="1 2 4 6 8 10 12 14 16 18 20" variable="level">
<tr><th><<level>></th>
<td>
<$list filter="[tag[Feat]tag[Class]tag<currentTiddler>field:feat-level<level>sort[]]">
<$list filter="[all[current]field:a-actions[1]]">
{{OneAction}}
</$list>
<$list filter="[all[current]field:a-actions[2]]">
{{TwoAction}}
</$list>
<$list filter="[all[current]field:a-actions[3]]">
{{ThreeAction}}
</$list>
<$list filter="[all[current]tag[Reaction]]">
{{ReactionIcon}}
</$list>
<$list filter="[all[current]tag[Free]]">
{{FreeAction}}
</$list>
<$list filter="[all[current]tag[Focus Spell]]">
{{SpellIcon}}
</$list>
<$link />
<$list filter="[all[current]tag[Focus Spell]!tag[Cantrip]]">
(Focus Spell)
</$list>
<$list filter="[all[current]tag[Focus Spell]tag[Cantrip]]">
(Focus Cantrip)
</$list>
<$list filter="[all[current]tag[Uncommon]]">
(Uncommon)
</$list>
<$list filter="[all[current]tag[Rare]]">
(Rare)
</$list>
<$list filter="[all[current]has[feat-fpre]]">
(Requires
<$list filter="[all[current]list[!!feat-fpre]]">
<$link/></$list>)</$list>
<$list filter="[all[current]has[feat-sppre]]">
(Requires
<$list filter="[all[current]list[!!feat-sppre]]">
<$link/></$list>)</$list>
<$list filter="[all[current]has[feat-skill]]">
(Requires
<$transclude tiddler="SkillProficiencyLongName" index={{!!feat-spre}} />
<$link to={{!!feat-skill}} />)</$list>
<br />
</$list>
</td></tr>
</$list>
</table>
You gain a claw unarmed attack that deals 1d6 slashing damage. Your claws are in the [[Brawling]] group and have the [[Agile]], [[Finesse]], and [[Unarmed]] traits.
Your fingernails grow into razor-sharp claws, and scales speckle your fingers, hands, and wrists.
Your claws are [[Agile]], [[Finesse]] unarmed attacks that deal 1d6 slashing damage and are in the brawling weapon group.
If you’re a draconic sorcerer, when you cast [[Dragon Claws]], increase the spell’s slashing damage die from d4 to d6 and increase the resistance to 10 at 1st level, 15 at 5th level, and 20 at 9th level.
Your nanites help purge your body of harmful chemicals and toxins.
Each time you succeed at a Fortitude save against an ongoing poison, you reduce its stage by 2, or by 1 against a virulent poison. Each critical success you achieve against an ongoing poison reduces its stage by 3, or by 2 against a virulent poison.
''Requirements'' You’re wielding a melee weapon in two hands.
You put your body behind your massive weapon and swing, shoving enemies to clear a wide path.
You attempt to [[Shove]] up to five creatures adjacent to you, rolling a separate [[Athletics]] check for each target.
Then [[Stride]] up to half your Speed.
This movement doesn’t trigger reactions from any of the creatures you successfully Shoved.
''Trigger'' Your melee [[Strike]] kills a creature or knocks it [[Unconscious]], and another foe is adjacent to that creature.
You swing clear through one foe and into another.
Make a melee Strike against the second foe.
!! Splats
<$list filter="[tag<currentTiddler>tag[Splat]]" />
!! Class Features
| !Level | !Features |
| 1 | Deity, Doctrine, [[Divine Font]], 5 cantrips, 2 1st-level slots |
| 2 | +1 1st-level slot |
| 3 | Second Doctrine (doctrine feature), 2 2nd-level slots |
| 4 | +1 2nd-level slots |
| 5 | [[Alertness]], 2 3rd-level slots |
| 6 | +1 3rd-level slots |
| 7 | Third Doctrine (doctrine feature), 2 4th-level slots |
| 8 | +1 4th-level slots |
| 9 | [[Resolve]], 2 5th-level slots |
| 10 | +1 5th-level slots |
| 11 | Fourth Doctrine, [[Lightning Reflexes]], 2 6th-level slots |
| 12 | +1 6th-level slots |
| 13 | [[Weapon Specialization]], [[Divine Defense]], 2 7th-level slots |
| 14 | +1 7th-level slots |
| 15 | Fifth Doctrine, 2 8th-level slots |
| 16 | +1 8th-level slots |
| 17 | 2 9th-level slots |
| 18 | +1 9th-level slot |
| 19 | Final Doctrine, [[Miraculous Spell]] |
| 20 | |
!! Class Feats
{{||ClassFeatList}}
You cast spells like a cleric.
You gain access to the [[Cast a Spell]] activity.
You can prepare two common cantrips each day from the Core divine spell list or any other cantrips you learn or discover.
You’re trained in spell attack rolls and spell DCs for divine spells.
Your key spellcasting ability for cleric archetype spells is [[Wisdom]], and they are divine cleric spells.
Choose a deity as you would if you were a cleric.
You become bound by that deity’s anathema.
You become trained in [[Religion]] and your deity’s associated skill; for each of these skills in which you were already trained, you instead become trained in a skill of your choice.
You don't gain any other abilities from your choice of deity.
<<levelfeatlist "4 6 8 12 18" "[tag[Archetype]field:feat-arch[Cleric]]">>
You creatively apply your prepared spells to [[Counterspell]] a much wider variety of your opponents’ magic.
Instead of being able to counter a foe’s spell with Counterspell only if you have that same spell prepared, you can use Counterspell as long as you have the spell the foe is casting in your spellbook.
When you use Counterspell in this way, the prepared spell you expend must share a trait other than its tradition with the triggering spell. At the GM’s discretion, you can instead use a spell that has an opposing trait or that otherwise logically would counter the triggering spell (such as using a cold or water spell to counter fireball or using remove fear to counter a fear spell).
Regardless of what spell you expend, you take a –2 penalty to your counteract check, though the GM can waive this penalty if the expended spell is especially appropriate.
''Trigger'' Your [[Strike]] critically hits and deals damage to a creature you’ve identified with [[Recall Knowledge]].
Your battle tactics are aided by your assessment of your foes’ capabilities, allowing you to instantly adjust your movements to maximum advantage.
You [[Step]] or [[Stride]]; this movement doesn’t trigger reactions from the triggering creature.
You’ve learned how to handle situations when you’re out of your depth.
You gain the [[Untrained Improvisation]] general feat.
In addition, you can attempt skill actions that normally require you to be trained, even if you are untrained.
You can perform simple [[Interact]] actions with your shadow, such as opening an unlocked door.
Anything your shadow Interacts with must be within your reach.
Your shadow can’t perform actions that require significant manual dexterity, including any action that would require a check to accomplish, and you can’t use it to hold items.
You gain the [[Combat Climber]] feat as a bonus feat, and as long as you aren’t wearing footwear, you can use the sticky pads on your feet to [[Climb]], leaving your hands free. Additionally, if you roll a success on an [[Athletics]] check to climb, you get a critical success instead.
''Requirements'' You have both hands free //(or just one hand if you have [[Combat Climber]])//.
You move up, down, or across an incline. Unless it’s particularly easy, you must attempt an [[Athletics]] check. The GM determines the DC based on the nature of the incline and environmental circumstances. You’re [[Flat-Footed]] unless you have a climb Speed //or [[Combat Climber]]//.
//You can use [[Tumble Through]] to climb though an opponent's square.//
{{||ActionSuccessTable}}
If you have [[Quick Climb]], you move 5 more feet on a success and 10 more feet on a critical success, to a maximum of your Speed.
Bolt.
The shaft of this bolt is wrapped with fine twine.
When the bolt strikes a solid surface, the twine unwinds and enlarges into a 50-foot-long rope, securely fastened to the surface the bolt struck.
The rope can be pulled free with an [[Interact]] action and a successful DC 20 [[Athletics]] check.
You can extend your claws to aid you in climbing.
You gain a climb Speed of 10 feet.
''Requirements'' Your last action was a successful [[Strike]].
You hang onto a foe to harry them into submission.
If your target moves while you’re hanging onto it, you can choose to move with the target. The target is released if you choose not to move with it, at the start of your next turn, or if the target [[Escape]]s.
Attempts to Escape from a Cling follow the rules for Escape, but use your [[Acrobatics]] DC and end the Cling instead of the conditions normally ended by the Escape action.
''Special'' You can use this action without a free hand if your preceding [[Strike]] was made with your jaws or a similar unarmed attack you could use to hang on. The GM determines which unarmed attacks apply. Hanging on in this way prevents you from using that unarmed attack.
{{||SpellSummaryTable}}
Freezing sleet and heavy snowfall collect on the target’s feet and legs, dealing 1d4 cold damage //with a basic [[Reflex]] save. If it fails its save, it also takes a -5 foot circumstance penalty to its Speeds until the spell ends. If it critically fails, the penalty is -10 foot.//
Once this spell ends, the target becomes temporarily immune for 1 minute.
''Heightened (+1)'' The damage increases by 1d4.
{{||SpellSummaryTable}}
You adopt the stance of clinging shadows.
You can make shadow grasp [[Strike]]s. These deal 1d4 <<tag Negative>> damage; are in the [[Brawling]] group; and have the [[Agile]], [[Grapple]], [[Reach]], and [[Unarmed]] traits. While entering the stance uses a ki spell, the shadow grasp attacks it grants are not, so you can use them as often as you like while in the stance.
While in clinging shadows stance, you gain a +2 circumstance bonus to Athletics checks to [[Grapple]], and to the DC for creatures to [[Escape]] from you.
{{||SpellSummaryTable}}
A cloak of swirling colors shrouds the target.
Creatures are [[Dazzled]] while adjacent to it, and attacking the target causes a brilliant flash of light.
A creature that hits the target with a melee attack must attempt a [[Will]] save.
{{||SaveSuccessTable}}
The creature is temporarily immune until the end of its turn; //the effect on a melee attack// has the [[Incapacitation]] trait.
''Frequency'' once per day
You secrete a cloak of concentrated poison that harms any who dare attack you.
For 1 minute, any creature that touches you or damages you with an unarmed attack or melee weapon without the reach trait takes 3d6 poison damage.
{{||SpellSummaryTable}}
You drape the target in a mantle of swirling shadows that make it harder to see.
The cloak reduces [[Bright Light]] within a 20-foot [[Emanation]] to [[Dim Light]]. This is a form of magical darkness and can therefore overcome non-magical light or attempt to [[Counteract]] magical light.
The target can use //the// [[Concealed]] condition gained from the shadows to [[Hide]], though observant creatures can still follow the moving aura of shadow, making it difficult for the target to become completely undetected.
The target can use an [[Interact]] action to remove the cloak and leave it behind as a decoy, where it remains, reducing light for the rest of the spell’s duration.
If anyone picks up the cloak after it’s been removed by the original target, the cloak evaporates and the spell ends.
<svg fill="#000000" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="1em" height="1em">
<path d="M 12 0 C 5.371094 0 0 5.371094 0 12 C 0 18.628906 5.371094 24 12 24 C 18.628906 24 24 18.628906 24 12 C 24 5.371094 18.628906 0 12 0 Z M 12 2 C 17.523438 2 22 6.476563 22 12 C 22 17.523438 17.523438 22 12 22 C 6.476563 22 2 17.523438 2 12 C 2 6.476563 6.476563 2 12 2 Z M 10.9375 3.875 L 10.5 12.0625 L 10.59375 12.9375 L 16.75 18.375 L 17.71875 17.375 L 12.625 11.96875 L 12.1875 3.875 Z"/>
</svg>
You are a cleric of the cloth, focusing on divine magic and your connection to your deity’s domains.
''First Doctrine'' (1st): You gain the [[Domain Initiate]] cleric feat.
''Second Doctrine'' (3rd): Your proficiency rank for [[Fortitude]] saves increases to expert.
''Third Doctrine'' (7th): Your proficiency ranks for divine spell attack rolls and spell DCs increase to expert.
''Fourth Doctrine'' (11th): You gain expert proficiency with your deity’s favored weapon. When you critically succeed at an attack roll using that weapon, you apply the weapon’s [[Critical Specialization Effect]]; use your divine spell DC if necessary.
''Fifth Doctrine'' (15th): Your proficiency ranks for divine spell attack rolls and spell DCs increase to master.
''Final Doctrine'' (19th): Your proficiency ranks for divine spell attack rolls and spell DCs increase to legendary.
{{||RitualSummaryTable}}
''Cost'' rare laboratory supplies and reagents worth the target’s level (minimum 1) × 100 gp.
You remove 1 cubic inch of flesh from the target, who must be present throughout the ritual and can be one of the casters. You then use that flesh to grow a duplicate of the target’s physical form that will house the target’s soul upon death.
This duplicate is physically identical to the original creature. In order to perform the ritual, you need an [[Expanded Alchemist’s Lab]] or a superior set of equipment.
Once the ritual is successfully completed, the duplicate grows within the laboratory equipment for 2d4 months. While direct involvement isn’t required during this period of growth, you must prevent any interference or interruption or the ritual fails.
When the duplicate is complete, the original creature’s soul enters it as soon as their original body dies, or immediately if the creature died during the intervening months, as long as the soul is free and willing. If //the gods have// decided that the target’s time has come or the target’s soul is trapped or doesn’t wish to return, the duplicate remains empty until the impediment is removed. While unoccupied, the inert duplicate must be preserved in suitable alchemical equipment to prevent it from rotting.
{{||ActionSuccessTable}}
//Implied by [[Eye of the Arclords]].//
The eye can remain open for 1 minute, and you can close it before then with a single action with the Concentrate trait.
You’ve trained to fight with allies in tunnel warrens, dense undergrowth, or similarly cramped terrain.
If you are Small or smaller, you can end your movement in the same square as a Small or smaller ally.
No more than two creatures can share the same space when using this ability or a similar one.
Your connection to air allows you to see through obscuring mists.
You can see well enough through fog, mist, and clouds that would normally cause creatures to be [[Concealed]] that you don’t need to succeed at a flat check to target creatures benefiting from such concealment.
''Prerequisites'' Legendary in [[Athletics]].
Your unparalleled athletic skill allows you to jump impossible distances.
Triple the distance you [[Long Jump]] (so you could jump 60 feet on a successful DC 20 check). //Unless you use extra actions (as below) you can't jump further than your Speed.//
When you [[High Jump]], use the calculation for a Long Jump but don’t triple the distance.
__You can jump a distance greater than your Speed by spending additional actions when you Long Jump or High Jump. For each additional action spent, add your Speed to the limit on how far you can jump.__
Using fantastic acrobatic skill, you can walk for brief stretches across insubstantial surfaces.
When you [[Stride]], you can move across water, air, and solid surfaces that can hold only limited weight as if they were normal ground.
If you [[Stride]] over a trap with a weight-sensitive pressure plate, you don’t trigger it.
At the end of your turn, you sink, fall, break fragile surfaces, or trigger traps as normal for your current location.
{{||SpellSummaryTable}}
You conjure a poisonous fog.
This functions as [[Obscuring Mist]], except the area moves 10 feet away from you each round.
You deal 6d8 poison damage to each breathing creature that starts its turn in the spell’s area.
You can [[Dismiss]] the spell.
''Heightened (+1)'' The damage increases by 1d8.
As long as you can act and have enough room, you can //open flaps of skin along your limbs// to slow any fall just enough to avoid taking damage (whether you have the room to do so depends on the GM’s discretion).
{{||SpellSummaryTable}}
You afflict the target with a curse that causes it to emit ridiculous noises as it moves. Furthermore, the target’s hands and feet become awkward and uncoordinated, as though it were wearing oversized gloves and shoes.
//It must make a [[Will]] save.//
{{||SaveSuccessTable}}
''Frequency'' once per 10 minutes
''Trigger'' Another creature attempts a check to investigate a lead you’re pursuing.
You share information with the triggering creature.
They gain a circumstance bonus to their check equal to your circumstance bonus to checks investigating your subject from Pursue a Lead.
The GM can add any relevant traits to this reaction depending on the situation, such as <<tag Auditory>> and <<tag Linguistic>> if you’re conveying information verbally.
You can clue in all your allies at once.
When you use the [[Clue In]] reaction, any of your allies who are attempting the same check to investigate a lead receive the circumstance bonus from Clue In.
If you use this ability during an encounter, they must attempt their check within 1 round of when you Clued them In.
Your movements become clumsy and inexact.
Clumsy always includes a value. You take a status penalty equal to the condition value to [[Dexterity]]-based checks and DCs, including [[AC]], [[Reflex]] saves, ranged attack rolls, and skill checks using [[Acrobatics]], [[Stealth]], and [[Thievery]].
An acidic ooze coats your limbs.
Your unarmed attacks deal an additional 1d4 persistent acid damage on a critical hit.
You know how to take advantage of foes thrown off-balance by unstable flooring, loose cobblestones, or similar impediments.
While in an outdoor urban environment, you can [[Step]] into [[Difficult Terrain]] and enemies in difficult terrain are [[Flat-Footed]] to you.
''Prerequisites'' Expert in unarmed attacks.
''Frequency'' once per minute.
''Requirements'' You are in [[Cobra Stance]].
You lash out with devious intent and the power to envenom your foe.
Make a cobra fang Strike. Your reach with this Strike is 5 feet greater than normal.
If this Strike hits, the target takes 1d4 persistent poison damage per weapon damage die.
''Special'' If you have this feat, the circumstance bonus to Fortitude saves and Fortitude DC granted by Cobra Stance increases from +1 to +2.
You enter a tight stance, coiled up like a lashing cobra with your hands poised as venomous fangs.
While in this stance, the only Strikes you can make are cobra fang unarmed attacks. These deal 1d4 poison damage; are in the brawling group; and have the [[Agile]], [[Deadly]] d10, [[Finesse]], [[Nonlethal]], [[Poison]], and [[Unarmed]] traits.
While in Cobra Stance, you gain a +1 circumstance bonus to [[Fortitude]] saves and your Fortitude DC, and you gain poison resistance equal to half your level.
With threats either veiled or overt, you attempt to bully a creature into doing what you want.
You must spend at least 1 minute of conversation with a creature you can see and that can either see or sense you.
At the end of the conversation, attempt an [[Intimidation]] check against the target’s [[Will]] DC,
modified by any circumstances the GM determines.
{{||ActionSuccessTable}}
''Trigger'' Your turn ends.
''Requirements'' You are currently affected by a <<tag Mental>> effect that you gained by failing, but not critically failing, a saving throw.
You can find a loophole in a mental effect to temporarily overcome it.
Until the end of your next turn, you ignore a single mental effect that meets the requirement.
You can suppress a particular effect using Cognitive Loophole only once.
''Special'' You can use this reaction even if the mental effect is preventing you from using reactions.
Your mind becomes clear and cognition flows freely, but physical matters seem ephemeral.
''Benefit'' You gain an item bonus to [[Arcana]], [[Crafting]], [[Lore]], [[Occultism]], and [[Society]] checks and all checks to [[Recall Knowledge]]. Your critical failures on Recall Knowledge checks become failures instead.
//Greater and Major Cognitive Mutagen also cause you to become trained in a skill for the duration, chosen when the mutagen is created.//
''Drawback'' You take a –2 penalty to weapon and unarmed attack rolls, [[Athletics]] checks, and [[Acrobatics]] checks. You can carry 2 less Bulk than normal before becoming encumbered, and the maximum Bulk you can carry is reduced by 4.
| !Type | !Level | !Price | !Item Bonus | !Duration | !Trained in skill |
| Lesser | 1 | 40 | +1 | 1 minute | None |
| Moderate | 3 | 120 | +2 | 10 minutes | None |
| Greater | 11 | 3000 | +3 | 1 hour | Any [[Intelligence]] skill |
| Major | 17 | 30000 | +4 | 1 hour | Any skill |
Effects with this trait deal cold damage.
Creatures with this trait have a magical connection to cold.
Weapons made from cold iron are deadly to demons and fey alike. Cold iron looks like normal iron but is mined from particularly pure sources and shaped with little or no heat. This process is extremely difficult, especially for high-grade cold iron items.
| !Unit | !Price | !Bulk |
| Chunk | 100 | L |
| Ingot | 1000 | 1 |
| !Grade | !Level | !Price |
| Low | 2 | 200/Bulk |
| Standard | 7 | 2500/Bulk |
| High | 15 | 4500/Bulk |
| !Item | !Grade | !Hardness | !HP | !BT |
| Thin | Low | 5 | 20 | 10 |
| Thin | Standard | 7 | 28 | 14 |
| Thin | High | 10 | 40 | 20 |
| Item | Low | 9 | 36 | 18 |
| Item | Standard | 11 | 44 | 22 |
| Item | High | 14 | 56 | 28 |
| Structure | Low | 18 | 72 | 36 |
| Structure | Standard | 22 | 88 | 44 |
| Structure | High | 28 | 112 | 56 |
Cold iron armor sickens certain creatures that touch it.
A creature with weakness to cold iron (such as most demons and fey) that critically fails an unarmed attack against a creature in cold iron armor becomes [[Sickened]] 1.
A creature with weakness to cold iron is sickened 1 as long as it wears cold iron armor.
| !Type | !Level | !Price | !Value of Cold Iron needed | !Hardness | !HP | !BT | !Magic Level Limit |
| Low-Grade | 5 | 1400 + 140/Bulk | 70 + 7/Bulk | 9 | 36 | 18 | 8 |
| Standard-Grade | 11 | 12000 + 1200/Bulk | 1500 + 150/Bulk | 11 | 44 | 22 | 15 |
| High-Grade | 18 | 200000 + 20000/Bulk | 100000 + 10000/Bulk | 14 | 56 | 28 | Any |
Cold iron weapons deal additional damage to creatures with weakness to cold iron, like demons and fey.
| !Type | !Level | !Price | !Value of Cold Iron needed |
| Low-Grade | 2 | 400 + 40/Bulk | 20 + 2/Bulk |
| Standard-Grade | 10 | 8800 + 880/Bulk | 1100 + 110/Bulk |
| High-Grade | 16 | 90000 + 9000/Bulk | 45000 + 4500/Bulk |
When you [[Thrash]] a grabbed foe, you smack that foe into another nearby.
Another foe adjacent to the grabbed foe also takes your Thrash damage, with a basic [[Reflex]] save against your class DC.
{{||SpellSummaryTable}}
You teleport the targets to new positions within the area.
The creatures must each be able to fit in their new space, and their positions must be unoccupied, entirely within the area, and in your line of sight.
Unwilling creatures can attempt a [[Will]] save.
''Heightened (+1)'' The number of targets increases by 1.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
Swirling colors affect viewers based on their [[Will]] saves.
{{||SaveSuccessTable}}
You make a telegraphed attack to learn about your foe.
Make a melee [[Strike]].
On a hit, you can immediately attempt a check to [[Recall Knowledge]] about the target.
On a critical hit, you gain a +2 circumstance bonus to the check to Recall Knowledge.
The target is temporarily immune to Combat Assessment for 1 day.
''Prerequisites'' Trained in [[Athletics]].
Your techniques allow you to fight as you climb.
You’re not [[Flat-Footed]] while Climbing and can [[Climb]] with a hand occupied.
You must still use another hand and both legs to Climb.
Through your experience in battle, you can prepare your tactics to suit different situations.
When you make your daily preparations, you gain one fighter feat of 8th level or lower that you don’t already have.
You can use that feat until your next daily preparations.
You must meet all of the feat’s other prerequisites.
''Requirements'' You have one hand free, and your target is within reach of that hand.
You swipe at your opponent and grab at them.
Make a melee [[Strike]] while keeping one hand free.
If the Strike hits, you grab the target using your free hand.
The creature remains [[Grabbed]] until the end of your next turn or until it [[Escape]]s, whichever comes first.
You use a performer’s cold reading techniques, aura reading, and other tricks to discover your foe’s strengths and weaknesses.
The GM rolls a secret [[Occultism]] check for you against the [[Deception]] or [[Stealth]] DC (whichever is higher) of an enemy of your choice who is engaged in combat and isn’t [[Concealed]] from you, [[Hidden]] from you, or [[Undetected]] by you.
The GM might apply a penalty for the distance between you and the enemy.
The enemy is then temporarily immune to your Combat Reading for 1 day.
{{||ActionSuccessTable}}
You are particularly swift at punishing foes who leave you openings.
At the start of each of your turns when you regain your actions, you gain an additional reaction that can be used only to make an [[Attack of Opportunity]].
''Frequency'' Once per round.
''Trigger'' You use [[Quick Alchemy]] to craft an alchemical item that has the <<tag Elixir>>trait and is at least 2 levels lower than your Advanced Alchemy level.
You’ve discovered how to mix two elixirs into a single hybrid concoction.
You can spend 2 additional batches of infused reagents to add a second elixir to the one you’re crafting.
The second elixir must also be at least 2 levels lower than your advanced alchemy level, and the combination elixir is an alchemical item two levels higher than the higher of the two elixirs’ levels.
When this combination elixir is consumed, both the constituent elixirs take effect. For example, you can combine two elixirs of life to create a combined elixir that heals twice the normal amount, or you can combine a lesser darkvision elixir with a lesser eagle-eye elixir to both gain darkvision and find secret doors.
You open yourself to attacks so you can respond in turn.
Until your rage ends, you are [[Flat-Footed]], and damage rolls against you gain a +2 circumstance bonus.
If a creature hits you, that creature is flat-footed to you until the end of your next turn. If you hit it before the end of your next turn, you gain temporary Hit Points equal to your Constitution modifier, or double that on a critical hit.
These temporary Hit Points last until the end of your rage.
{{||SpellSummaryTable}}
You shout a command that’s hard to ignore.
You can command the target to approach you, run away (as if it had the [[Fleeing]] condition), release what it’s holding, [[Drop Prone]], or stand in place.
It can’t [[Delay]] or take any reactions until it has obeyed your command.
The effects depend on the target’s [[Will]] save.
''Heightened (5th)'' You can target up to 10 creatures.
{{||SaveSuccessTable}}
You issue an order to an animal.
Attempt a [[Nature]] check against the animal’s [[Will]] DC. The GM might adjust the DC if the animal has a good attitude toward you, you suggest a course of action it was predisposed toward, or you offer it a treat.
You automatically fail if the animal is hostile or unfriendly to you. If the animal is helpful to you, increase your degree of success by one step.
You might be able to Command an Animal more easily with a feat like [[Ride]].
Most animals know the [[Leap]], [[Seek]], [[Stand]], [[Stride]], and [[Strike]] basic actions.
If an animal knows an activity, such as a horse’s [[Gallop]], you can Command the Animal to perform the activity, but you must spend as many actions on Command an Animal as the activity’s number of actions.
You can also spend multiple actions to Command the Animal to perform that number of basic actions on its next turn; for instance, you could spend 3 actions to Command an Animal to Stride three times or to Stride twice and then Strike.
Issuing commands to an animal doesn’t always go smoothly. An animal is an independent creature with limited intelligence. Most animals understand only the simplest instructions, so you might be able to instruct your animal to move to a certain square but not dictate a specific path to get there, or command it to attack a certain creature but not to make its attack nonlethal. The GM decides the specifics of the action your animal uses.
The animal does what you commanded as soon as it can, usually as its first action on its next turn. If you successfully commanded it multiple times, it does what you said in order. It forgets all commands beyond what it can accomplish on its turn.
If multiple people command the same animal, the GM determines how the animal reacts. The GM might also make the DC higher if someone has already tried to Command the Animal that round.
{{||ActionSuccessTable}}
//"It does nothing" on a failure means that it does nothing in response to your commands, not that it does nothing at all. You cannot cause a hostile animal to stop attacking and stand still by failing to Command it.//
You command the attention of all around you with style, ensuring their gaze falls only upon you until the end of your next turn.
When creatures within 30 feet of you attempt saving throws against other visual effects, they use the outcome for one degree of success better than the result they rolled.
An enemy within the area attempting to use a visual effect that involves focusing its attention on a particular creature (such as a medusa’s [[Focus Gaze]]) must succeed at a [[Will]] save against your class DC or spell DC, whichever is higher, in order to target any creature except you.
Allies in the area can attempt to [[Hide]] even if they don’t have cover, as you are continually providing a distraction.
//Implied by [[Draconic Barrage]].//
While the spell persists, you can command one of your dragons to spit a missile of energy at a creature within 60 feet by using a single action, which has the Concentrate trait.
''Prerequisites'' harmful font, evil alignment
You grasp the animating force within an undead creature and bend it to your will.
If the next action you use is to cast [[Harm]] targeting one undead creature, you transform the effects of that harm spell.
Instead of harm’s normal effects, the target becomes [[Controlled]] by you if its level is equal to or lower than your level – 3.
It can attempt a [[Will]] saving throw to resist being controlled by you.
If the target is already under someone else’s command, the controlling creature also rolls a saving throw, and the undead uses the better result.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You must cast this spell on a creature you dealt damage to on your most recent action.
With the threat of more pain, you compel a creature you’ve recently harmed.
You issue a command to the target, with the effects of the spell [[Command]].
!! Granting Save Bonuses
| !Level | !Fortitude | !Reflex | !Will |
| Expert | [[Great Fortitude]] | [[Lightning Reflexes]] | [[Iron Will]] |
| Master and promote | [[Juggernaut]] | [[Evasion]] | [[Resolve]], [[Divine Will]], [[Indomitable Will]], [[Slippery Mind]] |
| Legendary and promote | [[Greater Juggernaut]] | [[Improved Evasion]] | [[Greater Resolve]] |
You’re a conduit for positive energy, and as you channel it through you, it heals some of your
minor injuries.
When you cast the [[Heal]] spell to heal a single creature other than yourself, you regain Hit Points equal to the spell level of the heal spell.
{{||RitualSummaryTable}}
''Cost'' Rare incense worth a total value of 150 gp.
Secondary casters must use the same skill as the primary caster.
You call upon an unknown planar entity to answer questions; this is a servitor of your deity if you have one and use [[Religion]].
You can ask up to seven questions that could be answered with “Yes” or “No.”
The entity is likely to know answers related to its purview; a servitor of //a god of storms// would likely know about unnatural weather patterns and a servitor of //a god of travel or freedom// would likely know someone’s travel route.
The entity answers with one word answers such as “Yes,” “No,” “Likely,” and “Unknown,” though its answers always reflect its own agenda and could be deceptive.
{{||ActionSuccessTable}}
{{||RitualSummaryTable}}
''Cost'' Rare incense worth a total value of 60 gp.
As [[Commune]], except you contact the primal spirits of nature, which know about <<tag Animal>>s, <<tag Beast>>s, <<tag Fey>>, <<tag Plant>>s, topography, and natural resources within a 3-mile radius of the ritual’s location.
''Prerequisites'' an animal companion.
You can urge your companion to do its utmost.
You can spend 2 actions to Command an Animal instead of 1 when commanding your animal companion.
If you do, your animal companion uses an additional action.
{{||SpellSummaryTable}}
Your competitiveness drives you to prove yourself against the opposition.
You gain a +1 status bonus to attack rolls and skill checks.
If an enemy within 20 feet critically succeeds at an attack roll or skill check, your status bonus increases to +3 //on// attack rolls or that specific skill check (whichever the foe critically succeeded at) for 1 round.
''Heightened (7th)'' Increase the base bonus to +2 and the increased bonus after an enemy critically succeeds to +4.
You can infuse your performances with magic to create unique effects called compositions.
Compositions are a special type of spell that often require you to use the [[Performance]] skill when casting them.
Composition spells are a type of <<tag Focus Spell>>.
Composition cantrips are special composition spells that don’t cost Focus Points, so you can use them as often as you like.
Composition cantrips are in addition to the cantrips you choose from the occult list. Generally, only feats can give you more composition cantrips. Unlike other cantrips, you can’t swap out composition cantrips gained from bard feats at a later level, unless you swap out the specific feat via retraining.
To cast a composition cantrip or focus spell, you use a type of [[Perform]]ance.
If the spell includes a verbal component, you must use an auditory performance, and if it includes a somatic component, you must use a visual one.
The spell gains all the traits of the performance you used.
You can cast only one composition spell each turn, and you can have only one active at a time.
If you cast a new composition spell, any ongoing effects from your previous composition spell end immediately.
You can infuse your performances with magic to create unique effects called compositions.
Compositions are a special type of spell that often require you to use the [[Performance]] skill when casting them.
Composition spells are a type of focus spell.
It costs 1 Focus Point to cast a focus spell, and you start with a focus pool of 1 Focus Point.
You refill your focus pool during your daily preparations, and you can regain 1 Focus Point by spending 10 minutes using the [[Refocus]] activity to perform, write a new composition, or otherwise engage your muse.
Focus spells are automatically heightened to half your level rounded up, much like cantrips.
Focus spells don’t require spell slots, and you can’t cast them using spell slots.
Taking feats can give you more focus spells and increase the size of your focus pool, though your focus pool can never hold more than 3 Focus Points.
Composition cantrips are special composition spells that don’t cost Focus Points, so you can use them as often as you like.
Composition cantrips are in addition to the cantrips you choose from the occult list.
Generally, only feats can give you more composition cantrips.
Unlike other cantrips, you can’t swap out composition cantrips gained from bard feats at a later level, unless you swap out the specific feat via [[Retraining]].
You learn the [[Counter Performance]] composition spell, protecting against auditory and visual effects.
You learn the [[Inspire Courage]] composition cantrip, which boosts your allies’
attacks, damage, and defense against fear.
To cast a composition cantrip or focus spell, you use a type of [[Performance]]. If the spell includes a verbal component, you must use an auditory performance, and if it includes a somatic component, you must use a visual one.
The spell gains all the traits of the performance you used.
You can cast only one composition spell each turn, and you can have only one active at a time.
If you cast a new composition spell, any ongoing effects from your previous composition spell end immediately.
{{||SpellSummaryTable}}
The target can understand the meaning of a single language it is hearing or reading when you cast the spell.
This doesn’t let it understand codes, language couched in metaphor, and the like (subject to GM discretion).
If the target can hear multiple languages and knows that, it can choose which language to understand; otherwise, choose one of the languages randomly.
''Heightened (3rd)'' The target can also speak the language.
''Heightened (4th)'' You can target up to 10 creatures, and targets can also speak the language.
This bitter draft opens your mind to the potential of the written word.
For the listed duration after drinking this elixir, you can understand any words you read, so long as they are written in a common language.
This elixir doesn’t automatically allow you to understand codes or extremely esoteric passages—you still need to attempt a skill check to [[Decipher Writing]].
| !Type | !Level | !Price | !Duration |
| Lesser | 2 | 70 | 1 minute |
| Greater | 7 | 540 | 10 minutes |
You hide a small object on your person (such as a weapon of light Bulk).
When you try to sneak a concealed object past someone who might notice it, the GM rolls your [[Stealth]] check and compares it to this passive observer’s [[Perception]] DC.
Once the GM rolls your check for a concealed object, that same result is used no matter how many passive observers you try to sneak it past.
If a creature is specifically searching you for an item, it can attempt a Perception check against your Stealth DC (finding the object on success).
You can also conceal an object somewhere other than your person, such as among undergrowth or in a secret compartment within a piece of furniture. In this case, characters Seeking in an area compare their Perception check results to your Stealth DC to determine whether they find the object.
{{||ActionSuccessTable}}
Hiding your gestures and incantations within other speech and movement, you attempt to conceal the fact that you are Casting a Spell.
If the next action you use is to [[Cast a Spell]], attempt a [[Stealth]] check against one or more observers’ [[Perception]] DCs; if the spell has verbal components, you must also attempt a [[Deception]] check against the observers’ Perception DC.
If you succeed at your check (or checks) against an observer’s DC, that observer doesn’t notice you’re casting a spell, even though material, somatic, and verbal components are usually noticeable and spells normally have sensory manifestations that would make spellcasting obvious to those nearby.
This ability hides only the spell’s spellcasting actions and manifestations, not its effects, so an observer might still see a ray streak out from you or see you vanish into thin air.
While you are concealed from a creature, such as in a thick fog, you are difficult for that creature to see. You can still be observed, but you’re tougher to target.
A creature that you’re concealed from must succeed at a DC 5 flat check when targeting you with an attack, spell, or other effect. If the check fails, the attack, spell, or effect doesn’t affect you.
Area effects aren’t subject to this flat check.
//If a creature with vision as their only precise sense is [[Dazzled]], all creatures are concealed to them.//
//Creatures with [[Low-Light Vision]] ignore concealment from being in dim light.//
Rather than hide an object somewhere the inspectors won’t search, you’re skilled at keeping the object on the move so it’s never where they look.
When you [[Conceal an Object]] of light Bulk or less, you can use [[Thievery]] instead of [[Stealth]] for your checks and for the DC of an active searcher’s [[Perception]] check.
You roll the check only once, but you must continue to use actions to Conceal an Object throughout the process.
''Prerequisites'' tenets of evil.
Because you know your mind is superior, you scoff at anyone who would alter your mental state—but this hubris gets the better of you when you’re wrong.
You gain a +2 circumstance bonus to saves against <<tag Mental>> effects. If you succeed at a save against a mental effect, you critically succeed instead; similarly, if you fail at a save against a mental effect, you critically fail instead.
An action with this trait requires a degree of mental concentration and discipline.
//You can't use an action with the Concentrate trait while raging unless the action also has the [[Rage]] trait.//
//You can't use a Concentrate action while [[Fascinated]] unless it relates to the object of your fascination.//
''Requirements'' Your last action or spell this turn had the <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, <<tag Fire>>, or <<tag Sonic>> trait.
You channel energy into your weapon.
The weapon deals 1 additional damage per weapon damage die until the start of your next turn. This damage type matches the trait of the triggering action or spell.
If your triggering action or spell had multiple eligible traits, you select one of those traits.
''Usage'' Etched onto a weapon.
A conducting weapon can channel energy through it.
The weapon gains the [[Resonant]] weapon trait, except that when you [[Conduct Energy]], the weapon deals an additional 1d8 damage of the selected type instead of 1 additional damage per die; if the weapon already had the resonant weapon trait, it deals 1d8 damage plus 1 damage per die instead.
On a critical hit, the weapon deals 1d8 persistent damage of the same type.
A cone shoots out from you in a quarter circle on the grid.
When you aim a cone, the first square of that cone must share an edge with your space if you’re aiming orthogonally, or it must touch a corner of your space if you’re aiming diagonally.
If you’re Large or larger, the first square can run along the edge of any square of your space.
You can’t aim a cone so that it overlaps your space.
The cone extends out for a number of feet, widening as it goes, as shown in the Areas diagram.
For instance, when a green dragon uses its breath weapon, it breathes a cone of poisonous gas that originates at the edge of one square of its space and affects a quarter-circle area 30 feet on each edge.
If you make a cone originate from someone or something else, follow these same rules, with the first square of the cone using an edge or corner of that creature or object’s space instead of your own.
//Measure the distance to the target in the standard way, with every other diagonal square counted as 10'.//
//This has the effect that cones become ''less'' wide at the very end of their range.//
//If the cone originates at the corner of a square, targets not in the quadrant of the area bounded by that corner cannot be affected. //
//If the cone originates at the edge of a square, targets only reached by moving parallel to that edge more often than away from it cannot be affected. //
//A cone's width at a given point is ''not'' equal to the distance of the centre from the point of origin. (That's that other game.)//
{{||SpellSummaryTable}}
Icy cold rushes forth from your hands.
You deal 12d6 cold damage to creatures in the area.
//They can attempt a basic [[Reflex]] save.//
''Heightened (+1)'' The damage increases by 2d6.
''Prerequisites'' Expert in [[Deception]].
Even when caught in falsehoods, you pile lie upon lie.
Reduce the circumstance bonus a target gains for your previous attempts to [[Create a Diversion]] or [[Lie]] to it from +4 to +2.
If you’re a master in Deception, reduce the bonus to +1, and if you’re legendary, your targets don’t get these bonuses at all.
You make an incredibly graceful attack, piercing your foe’s defenses.
Make a [[Strike]] with a weapon or unarmed attack that would apply your precise strike damage, with the following failure effect.
''Failure'' You deal half your precise strike damage to the target. This damage type is that of the weapon or unarmed attack you used for the Strike.
You don’t have your wits about you, and you attack wildly.
You are [[Flat-Footed]], you don’t treat anyone as your ally (though they might still treat you as theirs).
You can’t [[Delay]], [[Ready]], or use reactions.
You use all your actions to [[Strike]] or cast offensive cantrips, though the GM can have you use other actions to facilitate attack, such as draw a weapon, move so that a target is in reach, and so forth.
Your targets are determined randomly by the GM. If you have no other viable targets, you target yourself, automatically hitting but not scoring a critical hit.
If it’s impossible for you to attack or cast spells, you babble incoherently, wasting your actions.
Each time you take damage from an attack or spell, you can attempt a DC 11 flat check to recover from your confusion and end the condition.
{{||SpellSummaryTable}}
You befuddle your target with strange impulses, causing it to act randomly.
The effects are determined by the target’s [[Will]] save.
You can [[Dismiss]] the spell.
''Heightened (8th)'' You can target up to 10 creatures.
{{||SaveSuccessTable}}
Conjuration spells transport creatures via teleportation, create an object, or bring a creature or object from somewhere else (typically from another plane) to follow your commands.
Conjuration spells often have the <<tag Teleportation>>trait, and the creatures summoned by conjuration spells have the <<tag Summoned>>trait.
<<schoolspelllist Conjuration>>
Ephemeral connections between people, places, and concepts are invisible to most, but seeing them is your stock and trade.
You spend 10 minutes considering two different leads you’re pursuing.
You then attempt a check to investigate how connected the two are. Unless the GM determines otherwise, this is a [[Crafting]] check if they’re both items or a [[Society]] check for other combinations of leads.
If any subjects are creatures, this check usually uses the highest DC among their [[Deception]] and [[Will]] DCs. If no subjects are creatures, but at least one is an item, the DC is usually a hard DC for the level of the highest-level item. If neither case applies, the DC is usually a hard expert or hard master DC (22 or 32).
Once you try to Connect the Dots between two particular leads, you can never try to Connect the Dots between those same leads again unless the GM allows it after you’ve learned a substantial amount of new information.
{{||ActionSuccessTable}}
''Prerequisites'' Expert in [[Society]], [[Courtly Graces]].
You have social connections you can leverage to trade favors or meet important people.
When you’re in an area with connections (typically a settlement where you’ve spent downtime building connections, or possibly another area in the same nation), you can attempt a Society check to arrange a meeting with an important political figure or ask for a favor in exchange for a later favor of your contact’s choice.
The GM decides the DC based on the difficulty of the favor and the figure’s prominence.
{{||RitualSummaryTable}}
''Cost'' Rare incense and offerings worth a total value of 20 gp times the spell level.
Secondary casters must be worshippers of your religion.
You consecrate a site to your deity, chanting praises and creating a sacred space.
While within the area, worshippers of your deity gain a +1 status bonus to attack rolls, skill checks, saving throws, and [[Perception]] checks, and creatures anathema to your deity take a –1 status penalty to those checks.
Attacks made by worshippers of your deity within the area deal 1 damage of one of your deity’s alignment types (your choice); if your deity is true neutral, you don’t gain this benefit.
{{||ActionSuccessTable}}
''Heightened (7th)'' The consecrated area also gains the effects of the [[Dimensional Lock]] spell, but the effect doesn’t attempt to counteract teleportation by worshippers of your deity. The cost increases to 200 gp times the spell level.
Your nanites are incredibly effective, capable of improving your body’s efficiency regularly.
You can use [[Nanite Surge]] with a frequency of once per 10 minutes, rather than once per hour.
A constant spell affects the monster without the monster needing to cast it, and its duration is unlimited.
If a constant spell gets [[Counteract]]ed, the monster can reactivate it by spending the normal spellcasting actions the spell requires.
Constitution measures your character’s overall health and stamina.
Constitution is an important statistic for all characters, especially those who fight in close combat.
Your Constitution modifier is added to your [[Hit Points]] and [[Fortitude]] saving throws.
//Constitution does not govern any skills.//
//Being [[Drained]] reduces your Constitution.//
{{||StatModSummary}}
The monster deals the listed amount of damage to any number of creatures [[Grabbed]] or [[Restrained]] by it.
Each of those creatures can attempt a basic [[Fortitude]] save with the listed DC.
//[[Greater Constrict]] resembles Constrict but creatures who fail the basic save also fall unconscious.//
''Requirements'' The snake has a smaller creature [[Grabbed]].
The snake deals 12 bludgeoning damage to the grabbed creature; the creature must attempt a basic [[Fortitude]] save.
If the snake is a specialized animal companion, increase this damage to 20.
A construct is an artificial creature empowered by a force other than necromancy.
Constructs are often <<tag Mindless>>; they are immune to bleed damage, <<tag Death>>effects, <<tag Disease>>, <<tag Healing>>, <<tag Necromancy>>, nonlethal attacks, <<tag Poison>>, and the [[Doomed]], [[Drained]], [[Fatigued]], [[Paralyzed]], [[Sickened]], and [[Unconscious]] conditions; and they may have [[Hardness]] based on the materials used to construct their bodies.
Constructs are not living creatures, nor are they <<tag Undead>>.
When reduced to 0 Hit Points, a construct creature is destroyed.
Your synthetic body resists ailments better than those of purely biological organisms.
You gain a +1 circumstance bonus to saving throws against diseases, poisons, and radiation.
''Frequency'' Once per day.
You have learned rites or meditations that enable you to perceive minor, invisible spirits within a place.
Choose [[Nature]], [[Occultism]], or [[Religion]] when you select this feat.
Nature allows you to contact the spirits of nature that form leshies, who are born of pure life essence rather than spiritual energy and can answer questions about natural features like the location of nearby water or plant life.
Religion reveals the presence of angelic, demonic, or other spirits in service to divine beings, who provide information about sources of powerful positive or negative energy, sacred or profane influences, or the presence of undead.
Occultism allows you to contact lingering spirits, psychic echoes of the departed dead, and spirits from beyond reality, who tell you about things like strange auras, effects, or the presence of unnatural occult beings.
Spend 10 minutes and attempt a check to [[Recall Knowledge]] with the chosen skill; the DC is determined by the GM (usually a very high DC for the level of the highest-level creature you might encounter in the area).
If you’re legendary in the chosen skill, you can use this feat once per hour, instead of only once per day, but you can’t use it again on any area that overlaps a previous area.
{{||ActionSuccessTable}}
''Special'' You can select this feat multiple times, each time picking a different skill in which you have the master proficiency rank. You can use this feat with each skill once per day (or once per hour, if you’re legendary).
You find wisdom in the movements of the heavens.
Once per day, you can spend 10 minutes to draw upon your readings of a recent night’s sky to gain the trained proficiency rank in one skill of your choice; the chosen skill’s key attribute must be [[Charisma]], [[Intelligence]], or [[Wisdom]]. This proficiency lasts until your next daily preparation.
Since this proficiency is temporary, you can’t use it as a prerequisite for a skill increase or a permanent character option like a feat.
When you successfully [[Counterspell]] a spell of the tradition that matches your bloodline, you consume it, replenishing yourself with its energy.
When you do, you are nourished as if you had eaten a meal and regain Hit Points equal to twice the level of the counteracted spell.
{{||SpellSummaryTable}}
Your shadow wriggles before spreading out from you, forming a gateway of clinging, consuming shadow through which the horrors of another plane can barely be seen.
The first time each turn you [[Sustain the Spell|Sustain a Spell]], the radius increases by 5 feet.
Each enemy that enters the area or begins its turn in the area takes 2d6 <<tag Negative>> damage and must attempt a [[Reflex]] save.
''Heightened (+1)'' The damage increases by 1d6.
{{||SaveSuccessTable}}
You can drive your allies into a frenzy, granting them incredible benefits.
You can ignore the requirements on [[Share Rage]], using it multiple times in a Rage.
Allies affected by Share Rage who accept your anathema for the duration of the Rage gain your instinct ability and the specialization ability it gains from [[Weapon Specialization]], but not greater weapon specialization.
{{||SpellSummaryTable}}
You prepare a spell that will trigger later.
While casting contingency, you also cast another spell of 4th level or lower with a casting time of no more than 3 actions.
This companion spell must be one that can affect you.
You must make any decisions for the spell when you cast contingency, such as choosing a damage type for [[Resist Energy]].
During the casting, choose a [[Trigger]] under which the spell will be cast, using the same restrictions as for the trigger of a [[Ready]] action.
Once contingency is cast, you can cause the companion spell to come into effect as a reaction with that trigger.
It affects only you, even if it would affect more creatures.
If you define complicated conditions, as determined by the GM, the trigger might fail.
If you cast contingency again, the newer casting supersedes the older.
''Heightened (8th)'' You can choose a spell of 5th level or lower.
''Heightened (9th)'' You can choose a spell of 6th level or lower.
''Heightened (10th)'' You can choose a spell of 7th level or lower.
{{||SpellSummaryTable}}
A magical flame springs up from the object, as bright as a [[Torch]]. {{TorchLight}}
It doesn’t need oxygen, react to water, or generate heat.
//The material component for the spell is ruby dust. The required value depends on the level. The casting level makes no difference except to how hard the spell is to [[Counteract]].//
| !Level | !Cost |
| 2 | 6 gp |
| 3 | 16 gp |
| 4 | 30 gp |
| 5 | 60 gp |
| 6 | 120 gp |
| 7 | 270 gp |
| 8 | 540 gp |
| 9 | 1350 gp |
| 10 | 3350 gp |
''Prerequisites'' Expert in [[Medicine]].
You zealously monitor a patient’s progress to administer treatment faster.
When you [[Treat Wounds]], your patient becomes immune for only 10 minutes instead of 1 hour.
This applies only to your Treat Wounds activities, not any other the patient receives.
You can use [[Elemental Assault]] once per hour instead of once per day.
While not equal to the heights of your panache in combat, you have a dramatic flair about you in any situation.
Whenever you succeed at a check during exploration that would have granted you [[Panache]] in combat, you gain a +1 circumstance bonus to further checks for actions that would grant you panache in combat.
This benefit ends when the exploration changes to a different scene (as determined by the GM) or shifts to an encounter or downtime.
You can squeeze out of tight situations surprisingly quickly, gaining an advantage against foes that try to pin you down.
You gain the [[Quick Squeeze]] skill feat, and if you’re a master in [[Acrobatics]], you can [[Squeeze]] at full Speed.
Whenever you successfully [[Escape]] using Acrobatics, the creature you Escaped from is [[Flat-Footed]] against the next attack you make against it before the end of your next turn.
{{||SpellSummaryTable}}
You whip up a small sandstorm around your body.
When a creature starts its turn in the area or moves into the area, it must succeed at a [[Fortitude]] save or become [[Dazzled]] for as long as it remains in the area; it is then temporarily immune to this dazzling effect for 10 minutes.
Choose one of the following additional effects when you cast this spell. On subsequent rounds, you can switch to a different effect once per round as a [[Free]] action triggered by [[sustaining the spell|Sustain a Spell]].
* ''Sand Shield'' You create a magical shield made of sand. The sand shield provides no benefit to AC, but it does allow you to use the [[Shield Block]] reaction and acts as a shield for this purpose. The sand shield has Hardness 14, 21 Hit Points, and no Broken Threshold; when the shield’s HP are reduced to 0, you can’t use its Shield Block reaction again until the next time you Sustain the Spell and choose the sand shield effect.
* ''Sandblast'' You direct a jet of sand at a single target. One creature of your choice within 30 feet takes 8d6 <<tag Slashing>> damage (basic [[Reflex]] save). On a critical failure, the creature is also [[Dazzled]] for 1 minute.
* ''Sandstorm'' The area of the spell expands to a 30-foot [[Emanation]], and any creature that starts its turn in the area or moves into the area takes 6d4 slashing damage (basic [[Reflex]] save) and must hold its breath or begin [[Suffocating]].
''Heightened (+1)'' Increase the sand shield’s Hardness by 2 and its Hit Points by 1, the sandblast damage by 1d6, and the sandstorm damage by 1d4.
{{||SpellSummaryTable}}
By imposing your will upon the water, you can raise or lower the level of water in the chosen area by 10 feet.
<<tag Water>>creatures in the area are subjected to the effects of [[Slow]].
{{||RitualSummaryTable}}
You alter the weather, making it calm and normal for the season or choosing up to two effects based on the season:
* ''Spring'' drizzle, heat, hurricane, sleet, thunderstorm, tornado
* ''Summer'' drizzle, downpour, extreme heat, hail, heat
* ''Autumn'' cold weather, fog, mild heat, sleet
* ''Winter'' blizzard, mild cold, extreme cold, thaw
You can’t specifically control the manifestations, such as the exact path of a tornado or the targets of lightning strikes.
''Heightened (9th)'' You can create unseasonable weather and contradictory weather effects, such as extreme cold and a hurricane. You can make the weather calm and normal weather for a different season or choose weather effects from any season’s list.
{{||ActionSuccessTable}}
Someone else is making your decisions for you, usually because you’re being commanded or magically dominated.
The controller dictates how you act and can make you use any of your actions, including attacks, reactions, or even [[Delay]].
The controller usually does not have to spend their own actions when controlling you.
''Trigger'' A creature succeeded, but didn’t critically succeed, at a [[Perception]] check or [[Will]] save to disbelieve an illusion from a spell that you cast.
''Requirements'' You are within 30 feet of the observer and the illusion.
You use your deceptive skills to make your illusions seem even more real.
Attempt a [[Deception]] check against the target’s [[Perception]] DC.
If you succeed, the target fails to disbelieve the illusion.
The short human life span lends perspective and has taught you from a young age to set aside differences and work with others to achieve greatness. You gain a +4 circumstance bonus on checks to [[Aid]].
You have developed a soul-deep bond with your comrades and maintain an even greater degree of cooperation with them.
If you are at least an expert in the skill you are [[Aid]]ing, you get a success on any outcome rolled to Aid other than a critical success.
You heroically dash into the fray, inspiring your allies to follow.
You [[Stride]] up to your Speed and make a melee [[Strike]].
If your Strike hits and damages an enemy, each ally within 60 feet who saw you hit can use a reaction to [[Stride]], but they each must end their Stride closer to the creature you hit than where they started.
The smallest of fey have ridden corgis as mounts since time immemorial, leading to a pattern on corgis’ backs called a “faerie saddle.” You have formed a magical connection with a corgi that can serve as your mount.
Your corgi [[familiar|Familiar (Rule)]] is Small rather than Tiny, and it’s appropriate for use as your mount, unlike most familiars.
It has the scent ability, which counts against your limit for familiar and master abilities as normal. Furthermore, it can never gain a familiar ability that grants it any Speeds other than a land Speed.
If you’re a pixie, you can’t ride a corgi due to your Size, but you can take this feat to gain a corgi familiar.
When physically outmatched, you fight with unexpected ferocity.
If a foe of a larger size than you critically hits and damages you, that foe is [[Flat-Footed]] to you for 1 round.
''Usage'' etched onto a weapon without an [[Anarchic]] rune.
''Craft Requirements'' You are lawful.
Acid sizzles across the surface of the weapon.
When you hit with the weapon, add 1d6 <<tag Acid>> damage to the damage dealt.
In addition, on a critical hit, the target’s armor (if any) takes 3d6 acid damage (before applying [[Hardness]]); if the target has a shield raised, the shield takes this damage instead.
''Greater Corrosive'': The acid damage dealt by this weapon ignores the target’s acid resistance. Increase the acid damage dealt to armor or a shield on a critical hit to 6d6.
''Prerequisites'' [[Shield Ally|Divine Ally]], tenets of evil.
Your shield ally is more than just a spirit of protection - it’s a conduit for deadly divine magic.
When you use your shield ally to [[Shield Block]] a melee unarmed attack or a melee weapon [[Strike]] from an adjacent creature, the attacker takes 1d6 evil or negative damage (your choice).
If the attack or Strike breaks or destroys your shield, double this additional damage.
The damage the attacker takes increases to 2d6 at 11th level and 3d6 at 16th level.
{{||MysterySummary}}
Your body is as much an astronomical one as it is physical. You gain resistance equal to 2 + half your level against all physical damage.
!!! Curse of the Sky's Call
''Minor Curse'' Your unnatural lightness makes it hard to keep your footing and interact with other physical objects. You are [[Enfeebled]] 1 and take a –2 penalty to saves and DCs against [[Grapple]], [[Shove]], and other forms of forced movement.
''Moderate Curse'' Your body is drawn further skyward. You are [[Enfeebled]] 2, and the penalty from your minor curse increases to –3. You are treated as one size smaller for <<tag Wind>> effects. You gain a +2 status bonus against Trip attempts, you only take half as much damage from falls, and you gain the effects of the [[Powerful Leap]] and [[Quick Jump]] skill feats. You weigh only half as much, and your Bulk, should someone need to carry you, is also half as much.
''Major Curse'' As your body rises, you float just above the ground beneath you. You become [[Enfeebled]] 4, and the penalty from your minor curse increases to –4. You can walk on liquids as if they were solid; you gain the effects of the [[Cloud Jump]] skill feat; and you don’t leave tracks, trigger weight-sensitive pressure plates, or otherwise connect with the ground below you.
You gain the [[Counter Performance]] composition spell.
If you don’t already have one, you gain a focus pool of 1 Focus Point, which you can [[Refocus]] by engaging your muse.
{{||SpellSummaryTable}}
//You can cast this spell with a somatic ''or'' verbal component.//
''Trigger'' You or an ally within 60 feet rolls a saving throw against an <<tag Auditory>> or <<tag Visual>> effect.
Your performance protects you and your allies.
Roll a [[Performance]] check for a type you know: an auditory performance if the trigger was auditory, or a visual one for a visual trigger.
You and allies in the area can use the better result between your Performance check and the saving throw.
Some effects try to counteract spells, afflictions, conditions, or other effects. Counteract checks compare the power of two forces and determine which defeats the other.
Successfully counteracting an effect ends it unless noted otherwise.
When attempting a counteract check, add the relevant skill modifier or other appropriate modifier to your check against the target’s DC.
For spells //that are used to counteract//, the counteract check modifier is your spellcasting ability modifier plus your spellcasting proficiency bonus, plus any bonuses and penalties that specifically apply to counteract checks.
What you can counteract depends on the check result, the target’s //counteract// level, //and the level of the effect you are counteracting with//.
| !Effect type | !DC | !Counteract Level |
| Affliction | Per stat block | Affliction's level / 2, rounded up |
| Spell | Caster's DC | Spell's level |
| Other | GM decides based on standard level DC | Effect or creature's level / 2, rounded up |
//[[Chromatic Wall]] can't be counteracted normally.//
{{||ActionSuccessTable}}
''Trigger'' A creature [[Casts a Spell|Cast a Spell]] that you have prepared.
When a foe Casts a Spell and you can see its manifestations, you can use your own magic to disrupt it.
You expend a prepared spell to counter the triggering creature’s casting of that same spell. You lose your spell slot as if you had cast the triggering spell.
You then attempt to [[Counteract]] the triggering spell.
This feat has the trait corresponding to the tradition
of spells you cast (arcane, divine, //primal//, or occult).
{{||SpellSummaryTable}}
Eyes form across the touched creature’s body, allowing it to see in all directions at once.
The subject can’t be [[Flanked|Flanking]] for the spell’s duration.
In addition, when the subject [[Seek]]s, it can Seek in a 30-foot burst centered on itself or up to four 15-foot bursts within line of sight.
With a rousing call, you exhort an ally to advance.
If your next action is to cast the [[Inspire Courage]] composition cantrip, one ally who gains a status bonus from the spell can immediately use a reaction to [[Stride]].
With a mighty shout, you can stir an ally to attack.
If your next action is to cast the [[Inspire Courage]] composition cantrip, one ally who gains a status bonus from the spell can immediately use a reaction to make a melee [[Strike]].
You use your performance to orchestrate an onslaught against your enemies.
If your next action is to cast the [[Inspire Courage]] composition cantrip, one ally who gains a status bonus from the spell can immediately use a reaction to Stride and then make a melee Strike.
''Trigger'' A creature within your reach uses an <<tag Auditory>> effect, <<tag Manipulate>> action, or <<tag Move>> action; makes a ranged attack; or leaves a square during its move action.
''Requirements'' You are affected by [[Inspire Courage]].
You bellow a ferocious call to arms, inspiring yourself to lash out at a foe.
Make a melee [[Strike]] against the triggering creature.
If the attack is a critical hit and the trigger was a <<tag Manipulate>> action, the action is disrupted.
{{LOCGFeat}}
''Trigger'' You critically fail a [[Diplomacy]] check.
''Requirements'' You’re in a settlement or community, and you haven’t used Courteous Comeback in this settlement or community within the past month.
Reroll the triggering [[Diplomacy]] check, using the second result.
''Prerequisites'' Trained in [[Society]].
You were raised among the nobility or have learned proper etiquette and bearing, allowing you to present yourself as a noble and play games of influence and politics.
You can use Society to [[Make an Impression]] on a noble, as well as with [[Impersonate]] to pretend to be a noble if you aren’t one.
If you want to impersonate a specific noble, you still need to use [[Deception]] to Impersonate normally, and to [[Lie]] when necessary.
This monster can form a coven with two or more other creatures who also have the coven ability.
This involves performing an 8-hour ceremony with all prospective coven members.
After the coven is formed, each of its members gains [[Elite]] adjustments, adjusting their levels accordingly.
Coven members can sense other members’ locations and conditions by spending a single action, which has the [[Concentrate]] trait, and can sense what another coven member is sensing as a two-action activity, which has the concentrate trait as well.
Covens also grant spells and rituals to their members, but these can be cast only in cooperation between three coven members who are all within 30 feet of one another. A coven member can contribute to a coven spell with a single-action spellcasting activity that has a single verbal component. If two coven members have contributed these actions within the last round, a third member can cast a coven spell on her turn by spending the normal spellcasting actions.
A coven can cast its coven spells an unlimited number of times but can cast only one coven spell each round.
All covens grant the 8th-level [[Baleful Polymorph]] spell and all the following spells, which the coven can cast at any level up to 5th: [[Augury]], [[Charm]], [[Clairaudience]], [[Clairvoyance]], [[Dream Message]], [[Illusory Disguise]], [[Illusory Scene]], [[Prying Eye]], and [[Talking Corpse]].
A coven can also cast the [[Control Weather]] ritual with a DC of 23 instead of the standard DC.
Individual creatures with the coven ability also grant additional spells to any coven they join.
If a coven member leaving the coven or the death of a coven member brings the coven below three members, the remaining members keep their elite adjustments for 24 hours, but without enough members to contribute the necessary actions, they can’t cast coven spells.
When you’re behind an obstacle that could block weapons, guard you against explosions, and make you harder to detect, you’re behind cover.
Standard cover gives you a +2 circumstance bonus to [[AC]], to [[Reflex]] saves against area effects, and to [[Stealth]] checks to [[Hide]], [[Sneak]], or otherwise avoid detection.
You can increase this to Greater Cover using the [[Take Cover]] basic action, increasing the circumstance bonus to +4.
If cover is especially light, typically when it’s provided by a creature, you have lesser cover, which grants a +1 circumstance bonus to AC.
A creature with standard cover or greater cover can attempt to use [[Stealth]] to [[Hide]], but lesser cover isn’t sufficient.
Cover is relative, so you might simultaneously have cover against one creature and not another.
Cover applies only if your path to the target is partially blocked. If a creature is entirely behind a wall or the like, you don’t have [[Line of Effect]] and typically can’t target it at all.
Usually, the GM can quickly decide whether your target has cover. If you’re uncertain or need to be more precise, draw a line from the center of your space to the center of the target’s space. If that line passes through any terrain or object that would block the effect, the target has standard cover (or greater cover if the obstruction is extreme or the target has Taken Cover). If the line passes through a creature instead, the target has lesser cover.
When measuring cover against an area effect, draw the line from the effect’s point of origin to the center of the creature’s space.
If a creature between you and a target is two or more sizes larger than both you and your target, that creature’s space blocks the effect enough to provide standard cover instead of lesser cover. The GM might determine that a creature doesn’t gain cover from terrain that it’s significantly larger than. For example, a Huge dragon probably wouldn’t receive any benefit from being behind a 1-foot-wide pillar.
Your GM might allow you to overcome your target’s cover in some situations. If you’re right next to an arrow slit, you can shoot without penalty, but you have greater cover against someone shooting back at you from far away. Your GM might let you reduce or negate cover by leaning around a corner to shoot or the like. This usually takes an action to set up, and the GM might measure cover from an edge or corner of your space instead of your center.
You cover your tracks, moving up to half your travel Speed.
You don't need to attempt a [[Survival]] check to cover your tracks, but anyone tracking you must succeed at a Survival check against your Survival DC if it is higher than the normal DC to [[Track]].
In some cases, you might Cover Tracks in an encounter. In this case, Cover Tracks is a single action and doesn’t have the exploration trait.
{{||SpellSummaryTable}}
You shape a cabin 20 feet on each side and 10 feet high.
This cabin has the <<tag Structure>> trait and the same restrictions as magic items that create structures.
The walls of the hut are simple and wooden, with small, square glass windows, and it has one wooden door. It doesn’t include its own lock, but it has a fastener to which a lock can be applied. The interior contains three cots, one chamber pot, and a small fireplace holding a magical fire.
The interior is lit with a small magical light that you can light or extinguish at will using a single action, which has the <<tag Concentrate>> trait.
The climate inside the hut is comfortable and allows creatures inside it to withstand most hostile weather conditions, but incredible heat or cold, powerful storms, and winds of hurricane force or greater destroy the hut.
Other creatures can freely enter and exit the hut without damaging it, but if you exit the hut, the spell ends.
You can [[Dismiss]] the spell.
You can make an item from raw materials.
You need the [[Alchemical Crafting]] skill feat to create alchemical items, the [[Magical Crafting]] skill feat to create magic items, and the [[Snare Crafting]] feat to create snares.
You can Craft items with the consumable trait in batches, making up to four of the same item at once with a single check. This requires you to include the raw materials for all the items in the batch at the start, and you must complete the batch all at once.
You also Craft non-magical ammunition in batches, using the quantity listed in Table 6–8: Ranged Weapons (typically 10).
To Craft an item, you must meet the following requirements:
* The item is your level or lower. An item that doesn’t list a level is level 0. If the item is 9th level or higher, you must be a master in Crafting, and if it’s 16th or higher, you must be legendary.
* You have the formula for the item.
* You have an appropriate set of tools and, in many cases, a workshop. For example, you need access to a smithy to forge a metal shield. __You need an Alchemist's Lab to craft alchemical items.__
* You must supply raw materials worth at least half the item’s Price. You always expend at least that amount of raw materials when you Craft successfully. If you’re in a settlement, you can usually spend currency to get the amount of raw materials you need, except in the case of rarer precious materials.
You must spend 4 days at work, at which point you attempt a [[Crafting]] check. The GM determines the DC to Craft the item based on its level, rarity, and other circumstances.
If your attempt to create the item is successful, you expend the raw materials you supplied.
You can pay the remaining portion of the item’s Price in materials to complete the item immediately, or you can spend additional downtime days working on it.
For each additional day you spend, reduce the value of the materials you need to expend to complete the item. This amount is determined using Table 4–2: Income Earned (page 236), based on your proficiency rank in Crafting and using your own level instead of a task level.
After any of these downtime days, you can complete the item by spending the remaining portion of its Price in materials.
If the downtime days you spend are interrupted, you can return to finish the item later, continuing where you left off.
{{||ActionSuccessTable}}
''Prerequisites'' Legendary in [[Crafting]].
You can find ways to craft just about anything, despite restrictions.
As long as you have the appropriate Crafting skill feat (such as [[Magical Crafting]] for magic items) and meet the item’s level and proficiency requirement, you ignore just about any other requirement, such as being of a specific ancestry or providing spells.
The only exceptions are requirements that add to the item’s cost, including castings of spells that themselves have a cost, and requirements of special items such as the philosopher’s stone that have exclusive means of access and Crafting.
The GM decides whether you can ignore a requirement.
Your research has paid off, culminating in the legendary [[Philosopher’s Stone]].
You learn the formula for the philosopher’s stone and can add it to your formula book.
Your knowledge of items’ construction allows you to discern their magical effects as well.
You can use [[Crafting]] instead of a skill associated with a magic tradition to [[Identify Magic]] on magic items, though not on any other sorts of magic.
''Key Ability'' [[Intelligence]].
You can use this skill to create, understand, and repair items.
{{||SkillActionList}}
{{||SkillFeatList}}
{{||SkillRitualList}}
''Trigger'' You are targeted with a melee attack by an attacker you can see.
''Requirements'' You are in [[Crane Stance]].
You interpose your arm between yourself and your opponent.
Your circumstance bonus to AC from [[Crane Stance]] increases to +3 against the triggering attack.
If the attack misses you, you can immediately make a crane wing Strike against the attacker at a –2 penalty, even if the attacker isn’t within your reach
''Requirements'' You are unarmored.
You enter the stance of a crane, holding your arms in an imitation of a crane’s wings and using flowing, defensive motions.
You gain a +1 circumstance bonus to AC, but the only Strikes you can make are crane wing attacks. These deal 1d6 bludgeoning damage; are in the brawling group; and have the [[Agile]], [[Finesse]], [[Nonlethal]], and [[Unarmed]] traits.
While in Crane Stance, reduce the DC for [[High Jump]] and [[Long Jump]] by 5, and when you [[Leap]], you can move an additional 5 feet horizontally or 2 feet vertically.
{{||SpellSummaryTable}}
You summon a crashing wave that sweeps away from you.
You deal 6d6 bludgeoning damage to creatures in the area //with a basic Reflex save//.
The water also extinguishes non-magical fires in the area.
''Heightened (+1)'' The damage increases by 2d6.
''Requirements:'' You are [[Prone]] and your Speed is at least 10'.
You move 5 feet by crawling and remain Prone.
//If you have [[Nimble Crawl]] you can crawl up to half your speed, or your full speed if you're also master in [[Acrobatics]].//
With a gesture, a trick, or some distracting words, you can create a diversion that draws creatures’ attention elsewhere.
If you use a gesture or trick, this action gains the [[Manipulate]] trait. If you use distracting words, it gains the [[Auditory]] and [[Linguistic]] traits.
Attempt a single [[Deception]] check and compare it to the [[Perception]] DCs of the creatures whose attention you’re trying to divert.
Whether or not you succeed, creatures you attempt to divert gain a +4 circumstance bonus to their Perception DCs against your attempts to Create a Diversion for 1 minute.
{{||ActionSuccessTable}}
{{||RitualSummaryTable}}
''Cost'' precious materials worth a total value of 800 gp.
Secondary casters can't use the same skill as the Primary caster.
Few incantations are as renowned as the power to create worlds.
To cast this ritual, you must be on the Astral Plane, the Ethereal Plane, or a plane that connects to one of the two.
A demiplane created with this ritual exists on the Astral or Ethereal Plane. It can have the appearance of any mundane environment or structure, such as a glorious cathedral, a clearing in a forest, a comfortably furnished cavern, or anything else one can imagine. All demiplanes have finite, unbreachable boundaries, which might resemble stone, wood, or something more unnatural, such as a wall of mist or unceasing void.
Demiplanes have environmental conditions as appropriate for the Material Plane, though the primary caster can dictate a general climate or light level, as well as whether the demiplane experiences seasons or a day-night cycle. The demiplane has no native plants or animals, but they can be introduced, and plants will grow in a demiplane’s light.
When you first cast create demiplane, the casters are teleported to the demiplane. The demiplane has no direct access to other worlds, so [[Plane Shift]] or similar abilities are necessary to access it.
As part of casting the ritual to create a new demiplane, you create a key to the demiplane which serves as a plane shift tuning fork for that demiplane. Most resemble ornate keys, but some take the forms of maps, compasses, or dowsing rods.
If you have the original key to an existing demiplane and are on that demiplane, you can instead use this ritual to either expand the demiplane or add special traits or features.
* ''Alignment'' The demiplane gains one alignment trait, such as <<tag Lawful>> or <<tag Good>>.
* ''Bounteous'' The demiplane has a functional ecosystem, with plants and animals appropriate to the environment. This ecosystem doesn’t require any additional effort on your part to maintain.
* ''Elemental'' The demiplane gains the <<tag Air>>, <<tag Earth>>, <<tag Fire>>, or <<tag Water>> planar essence trait.
* ''Gravity'' The demiplane gains a gravity trait of your choice.
* ''Key'' You create an additional key that can be used to access the demiplane with plane shift and improve it with create demiplane.
* ''Portal'' You create a permanent gateway between the demiplane and a single other location. You must spend the ritual’s casting time constructing the gateway on the external side, which typically resembles an arch or doorway of some sort. The gate is always active, but it can be secured as you would any door.
* ''Scope'' The demiplane can be unbounded instead of finite, though still with the same size.
''Heightened (10th)'' The ritual creates a square area 1,000 feet on a side, with a ceiling 20 feet high (two contiguous areas of this size on a critical success). The cost of the ritual increases to 20,000 gp.
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
You create enough food to feed six <<tag Medium>>creatures for a day.
This food is bland and unappealing, but it is nourishing.
After 1 day, if no one has eaten the food, it decays and becomes inedible.
Most <<tag Small>> creatures eat one-quarter as much as a Medium creature (one-sixteenth as much for most <<tag Tiny>> creatures), and most <<tag Large>> creatures eat 10 times as much (100 times as much for <<tag Huge>> creatures and so on).
''Heightened (4th)'' You can feed 12 Medium creatures.
''Heightened (6th)'' You can feed 50 Medium creatures.
''Heightened (8th)'' You can feed 200 Medium creatures.
| !Level | !Tiny | !Small | !Medium | !Large | !Huge |
| 2 | 96 | 24 | 6 | 0 | 0 |
| 4 | 192 | 48 | 12 | 1 | 0 |
| 6 | 800 | 200 | 50 | 5 | 0 |
| 8 | 3200 | 800 | 200 | 20 | 2 |
You create a forged document, usually over the course of a day or a week.
You must have the proper writing material to create a forgery.
When you Create a Forgery, the GM rolls a secret DC 20 [[Society]] check. If you succeed, the forgery is of good enough quality that passive observers can’t notice the fake. Only those who carefully examine the document and attempt a [[Perception]] or Society check against your Society DC can do so.
If your check result was below 20, the forgery has some obvious signs of being a fake, so the GM compares your result to each passive observer’s Perception DC or Society DC, whichever is higher, using the success or failure results below.
Once the GM rolls your check for a document, that same result is used against all passive observers’ DCs no matter how many creatures passively observe that document.
An observer who was fooled on a passive glance can still choose to closely scrutinize the documents on the lookout for a forgery, using different techniques and analysis methods beyond the surface elements you successfully forged with your original check. In that case, the observer can attempt a Perception or Society check against your Society DC. If they succeed, they know your document is a forgery.
If the document’s handwriting doesn’t need to be specific to a person, you need only to have seen a similar document before, and you gain up to a +4 circumstance bonus to your check, as well as to your DC (the GM determines the bonus).
To forge a specific person’s handwriting, you need a sample of that person’s handwriting.
{{||ActionSuccessTable}}
{{||RitualSummaryTable}}
''Cost'' A black onyx of value below:
{{CreationRitualCost}}
You transform the target into an <<tag Undead>> creature with a level up to that allowed in the table above.
There are many versions of this ritual, each specific to a particular type of undead (one ritual for all zombies, one for skeletons, one for ghouls, and so on), and the rituals that create <<tag Rare>> undead are also rare.
Some forms of undead, such as liches, form using their own unique methods and can’t be created with a version of create undead.
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
As you cup your hands, water begins to flow forth from them.
You create 2 gallons of water.
If no one drinks it, it evaporates after 1 day.
Your manufactured body is durable; you don’t need to eat and can’t starve. You gain a +2 circumstance bonus to saving throws against diseases.
You conjure a temporary object from eldritch energy.
It must be of vegetable matter (such as wood or paper) and 5 cubic feet or smaller.
It can’t rely on intricate artistry or complex moving parts, never fulfills a cost or the like, and can’t be made of precious materials or materials with a rarity of <<tag Uncommon>>or higher.
It is obviously temporarily conjured, and thus can’t be sold or passed off as a genuine item.
''Heightened (5th)'' The item is metal and can include <<tag Common>>minerals, like feldspar or quartz.
| !Creature Level | !Spell Level | !Cost (gp) |
|-1 or 0 |2 |15 |
|1 |2 |60 |
|2 |3 |105 |
|3 |3 |180 |
|4 |4 |300 |
|5 |4 |480 |
|6 |5 |750 |
|7 |5 |1080 |
|8 |6 |1500 |
|9 |6 |2100 |
|10 |7 |3000 |
|11 |7 |4200 |
|12 |8 |6000 |
|13 |8 |9000 |
|14 |9 |13500 |
|15 |9 |19500 |
|16 |10 |30000 |
|17 |10 |45000 |
You have a powerful creative drive, useful for prevarication and performance.
You gain the trained proficiency rank in [[Deception]] and [[Performance]]. If you are already trained in either of these skills, you become trained in a skill of your choice in its place.
You also become trained in Art [[Lore]].
Your positive energy sets undead alight.
When you use a [[Heal]] spell to damage undead, each undead that takes damage also takes persistent fire damage equal to the spell’s level.
You have dealings with a variety of unsavory characters, which you can leverage to trade favors or meet powerful people.
When you’re in an area where you have connections (typically a settlement where you’ve spent downtime building connections or possibly another area in the same nation), you can attempt a [[Society]] check to arrange a meeting with an important criminal, such as a thieves’ guild leader, or ask for a favor in exchange for a later favor of your contact’s choice.
The GM decides the DC based on the difficulty of the favor and the figure’s prominence.
{{LOWGFeat}}
''Frequency'' A number of times per day equal to your number of class feats from the Red Mantis assassin archetype.
You swathe yourself in a veil of red mist for 1 minute.
While the shroud is active, you gain [[Fast Healing]] equal to half your level.
You can [[Interact]] with your shroud, swirling it around you, to gain a +1 circumstance bonus to AC until the beginning of your next turn.
Finally, if you die while the shroud is active, you can choose to have your entire body vanish into red mist, leaving behind only your gear; you make this choice when you activate Crimson Shroud.
''Trigger'' A creature you are aware of critically succeeds on a [[Strike]] against you and would deal damage to you.
With pitiful posturing, you cause your foe to pull back a deadly attack.
The attacking creature takes a circumstance penalty to the damage of the triggering Strike equal to your level + 2. This penalty applies after doubling the damage for a critical hit.
The attacker is then immune to your Cringe for 24 hours.
{{||SpellSummaryTable}}
You assault the target’s faith, riddling the creature with doubt and mental turmoil that deal 6d6 mental damage, or 6d8 mental damage if it can cast divine spells.
The effects are determined by its [[Will]] save.
To many deities, casting this spell on a follower of your own deity without significant cause is [[Anathema]].
''Heightened (+1)'' The damage increases by 2d6 (or by 2d8 if the target is a divine spellcaster).
{{||SaveSuccessTable}}
Your debilitations are especially effective on your most powerful attacks.
Whenever you critically succeed at an attack roll against an enemy and use [[Debilitating Strike]], add the following debilitation to the list you can choose from:
The target attempts a [[Fortitude]] save against your class DC with the following effects.
{{||SaveSuccessTable}}
Once per hour, you can use [[Change Shape]] to enter a critter shape.
While in critter shape, you gain the effect of a 1st-level [[Pest Form]], except you can only transform into an animal matching your inherent animal.
You can remain in critter shape for up to 10 minutes, after which you transform back into your hybrid shape and can’t enter your critter shape again for 1 hour.
You can instead use Change Shape to return to your humanoid or hybrid shape at any time during the duration of Critter Shape.
If your inherent animal is normally larger than Tiny, you transform into a smaller, younger version of the animal, such as a Tiny bear cub.
If your inherent animal has a fly Speed, you can turn into that animal (unlike normal for 1st-level pest form), but you still don’t gain a fly Speed.
Filled with rancor and hate, you rend the minds of those who displease you.
You can cast [[Warp Mind]] once per day as an occult innate spell.
Odd interactions in your bloodline provide you with unexpected spells.
You can have one spell in your spell repertoire from a tradition other than the one that matches your bloodline.
You cast that spell as a spell from your bloodline’s tradition.
You can swap which spell you add and from which tradition as you could any other sorcerer spell, but you can’t have more than one spell from another tradition in your spell repertoire at the same time using this feat.
You have a deep understanding of the crossbow.
When you’re wielding a crossbow and use [[Hunt Prey]] or use [[Interact]] to reload your crossbow, you gain a +2 circumstance bonus to the damage roll on your next [[Strike]] with that crossbow.
If the crossbow is a simple crossbow, also increase the damage die size for that attack by one step.
You must make the attack before the end of your next turn or these benefits are lost.
You are a dynamo with the crossbow.
You gain a +2 circumstance bonus to damage with crossbows.
If the crossbow is a simple weapon, also increase the damage die size for your attacks made with that crossbow by one step.
As normal, this damage die increase can’t be combined with other abilities that alter the weapon damage die (such as the ranger feat [[Crossbow Ace]]).
{{LOWGFeat}}
You use the crowd to your advantage, diverting your foes’ attention to potential hidden dangers in the crowd.
When determining if your foe is flanked, treat all squares occupied by a crowd as if they were occupied by an ally with a melee reach of 5 feet.
Even if you don’t speak a creature’s language, you can rely on inflection, root words, and body language to infer rudimentary meaning.
If you interact with a creature for at least 10 minutes and that creature can speak a language, the GM rolls a secret [[Society]] check with a DC appropriate for the language’s rarity.
On a success, you understand the gist of the meaning and can communicate basic concepts back to the creature; on a failure, you are mistaken or communicate incorrect concepts.
If you’re legendary in [[Society]], you can communicate instantly without needing to attempt a Society check; even if you didn’t know the medium of communication the creature uses (speech, sign language, and so on), you intuit this information as soon as they try to communicate.
The harm you deal with your corrupting touch saps the strength from your enemy’s body.
If your next action is to cast [[Touch of Corruption]] on a living creature, the target is also [[Enfeebled]] 1 for 1 minute if it fails its save (enfeebled 2 if it critically fails).
{{||SpellSummaryTable}}
You issue a divine mandate to the targets.
You pronounce a cause. It can be to attain an item, claim a patch of land, slay a creature, war with a group, or be entirely peaceful.
Your cause can’t force the targets to harm one another or themselves.
The targets become completely dedicated to that cause, depending on their levels. They choose their own actions, but they favor direct action over inaction or indirect action.
* ''13th or Lower'' The target is so dedicated to the cause that it pursues the cause to the death (unless you say otherwise).
* ''14th'' The target is dedicated to the cause, but the spell ends for the target if it’s reduced to half its maximum Hit Points or fewer.
* ''15th'' As 14th, plus the target can attempt a [[Will]] save at the end of each of its turns to end the spell for itself.
The spell ends for all creatures if you or one of your allies uses a hostile action against a target, or when the cause is completed.
The GM might determine this spell has alignment traits befitting the cause.
''Heightened (10th)'' The level for each category increases by 2.
// The meaning of the 10 minute duration is not clear. //
{{||SpellSummaryTable}}
You inflict despair on creatures in the area.
The effects for each creature are determined by its [[Will]] save.
''Heightened (7th)'' The area increases to a 60-foot cone.
{{||SaveSuccessTable}}
Like a powerful constrictor, you crush targets in your unyielding grasp.
When you successfully [[Grapple]] a creature, you can deal bludgeoning damage to that creature equal to your [[Strength]] modifier.
You can make this attack nonlethal with no penalty.
{{||SpellSummaryTable}}
Your voice booms, smashing what’s in front of you.
Each creature and unattended object in the area takes 1d8 <<tag Sonic>> damage //with a basic [[Fortitude]] save//.
If you already dealt damage to an enemy this turn with a [[Strike]] or spell, increase the damage dice from this spell to d12s.
''Heightened (+1)'' The damage increases by 1d8.
Affix to armor.
''Requirements'' You are trained in [[Medicine]].
''Trigger'' You critically fail to [[Administer First Aid]].
''Activate'' {{FreeAction}} Envision: When you activate this alabaster pendant, your critical failure becomes a normal failure instead.
This polished crystal sphere enhances scrying magic.
Any visual information received through a spell with the scrying trait that was cast by the crystal ball appears within the sphere, and any auditory information sounds out from the surface of the sphere.
When you cast a scrying spell by any other means while holding the sphere, you can relay any information you receive in the same way, allowing others to see or hear the target.
The base version of a crystal ball is a sphere of clear quartz, but other versions are made of different stones. //Other versions give you the benefit of another spell on the target.//
''Activate'' {{ClockIcon}} 1 minute (command, envision, Interact); ''Frequency'' once per hour; ''Effect'' The crystal ball casts [[Clairvoyance]] to your specifications.
''Activate'' {{ClockIcon}} 10 minutes (command, envision, Interact); ''Frequency'' twice per day; ''Effect'' The crystal ball casts a DC 33 [[Scrying]] spell to your specifications.
| !Type | !Level | !Price | !Scrying DC | !Additional Spell |
| Clear Quartz | 14 | 38000 | 33 | None |
| Selenite | 15 | 70000 | 36 | [[See Invisibility]] |
| Moonstone | 16 | 75000 | 37 | [[Mind Reading]] (same save DC) |
| Peridot | 17 | 125000 | 39 | [[Telepathy]] |
| Obsidian | 19 | 320000 | 41 | [[True Seeing]] |
//This archetype has plot requirements described in Age of Ashes 4.//
You can use [[Arcana]], [[Occultism]], [[Religion]], or [[Society]] to [[Decipher Writing]] by meditating before a crystal, regardless of the type of writing.
When you [[Decipher Writing]] and roll a critical failure, you get a failure instead, and when you [[Decipher Writing]] and roll a success, you get a critical success instead.
Additionally, you gain resistance 10 to damage from hazards associated with crystals.
<<archetypefeatlist "4 6 10" "[[Crystal Keeper]]">>
This flask holds a pressurized red-brown gas flecked with bits of sublimated crystal.
You gain the listed item bonus to attack rolls.
When the bomb explodes, it deals the listed piercing damage and piercing splash damage as the mixture suddenly turns into solid crystals flying at high speeds.
Surfaces in the splash area grow brittle, gleaming red crystals that crumble to dust after 1 minute. The crystals on level surfaces are [[Caltrops]]. The crystals on vertical surfaces can be used briefly as handholds, granting the listed item bonus to the next [[Athletics]] check to [[Climb]] each space.
The crystals in each space crumble after the creature leaves, whether Climbing or moving through the caltrops.
| !Type | !Level | !Price | !Piercing Damage | !Piercing Splash Damage | !Item bonus to attack |
| Moderate | 4 | 160 | 2d4 | 4 | +1 |
| Greater | 12 | 3500 | 3d4 | 5 | +2 |
| Major | 18 | 40000 | 4d4 | 6 | +3 |
Your study of crystals and the energies held within a gem’s facets grants you special arcane crystal ward spells, which are a type of focus spell.
You gain the [[Electrified Crystal Ward]] focus spell, and you are trained in arcane spell attack rolls and spell DCs. Your spellcasting ability is [[Intelligence]].
When you use [[Crystalline Dust]], you can spend one additional action to disperse the motes as a 10-foot-radius cloud centered on you instead of as haze; the activity gains the <<tag Concentrate>> trait.
All creatures within the cloud become [[Concealed]], and all creatures outside the cloud become concealed to creatures within it.
''Frequency'' once per day
You’ve learned to disperse the crystalline motes coating your body as a haze.
You become [[Concealed]], though you can’t use this concealment to [[Hide]] or [[Sneak]], as normal for concealment where your position is still obvious.
The motes stay within an inch of your skin, move with you, and last for a number of rounds equal to half your level.
During your adventures, you’ve honed your ability to adapt to the culture of the predominant ancestry around you.
You gain the [[Adopted Ancestry]] general feat, and you also gain one 1st-level ancestry feat from the ancestry you chose for the Adopted Ancestry feat.
''Usage'' etched on a slashing or piercing weapon.
The weapon performs divination magic on the blood of your foes, granting you insight into their abilities and weaknesses.
''Activate'' {{FreeAction}} envision; ''Frequency'' once per minute; ''Requirements'' On your previous action this turn, you used this weapon to hit and damage a creature that has blood or other vital fluids; ''Effect'' You learn the secrets the weapon gleaned from the creature’s blood. Attempt to [[Recall Knowledge]] about the target of the required attack, gaining an item bonus to the Recall Knowledge skill check equal to the weapon’s item bonus to attack rolls from its potency rune. If the required attack was a critical hit, you also gain a +2 circumstance bonus to this check.
Whether you are climbing a ship’s rigging, a jungle tree, or a clock tower, you have an uncanny knack for finding footholds and handholds where larger creatures can’t.
You gain a climb Speed of 10 feet.
You can take the Legendary Climber feat even if you don’t have the [[Quick Climb]] feat, provided you meet its other prerequisites.
//This is an error. There is no Legendary Climber feat.//
Your hair moves under your control.
You can perform simple [[Interact]] actions with your hair, such as opening an unlocked door.
Your hair can’t perform actions that require fingers or significant manual dexterity, including any action that would require a check to accomplish, and you can’t use it to hold items.
{{||SpellSummaryTable}}
You curse the target with a [[Thirst]] no drink can quench.
You can [[Dismiss]] the spell.
The target must attempt a [[Fortitude]] save.
Heightened (+3) The thirst becomes more unbearable, increasing the damage each hour by 1d4, or by 2d4 on a critical failure.
{{||SaveSuccessTable}}
As you use your magic to manipulate air or water, you divert some of its currents to form a barrier around you.
If your next action is to [[Cast a Spell]] with the air or water trait, until the start of your next turn, you gain a +1 circumstance bonus to AC or a +2 circumstance bonus against ranged attacks.
This effect has the <<tag Air>> or <<tag Water>> trait, or both, depending on the traits of the spell you cast.
You also gain a +1 circumstance bonus to all saves against effects with the air trait, water trait, or both until the start of your next turn, depending on the spell’s traits.
{{||SpellSummaryTable}}
You focus your malevolent gaze on a target, causing their heart to seize in dread.
The target must attempt a [[Fortitude]] saving throw.
Regardless of the result, the target is temporarily immune to further castings of curse of death for 1 day.
''Curse of Death'' (curse) This curse ends immediately when the spell ends; ''Stage 1'' 4d6 <<tag Negative>> damage and [[Fatigued]] (1 round); ''Stage 2'' 8d6 negative damage and [[Fatigued]] (1 round); Stage 3 12d6 negative damage and [[Fatigued]] (1 round); Stage 4 death.
''Heightened (+1)'' Increase the negative damage taken on a success and during the first three stages of the curse by 1d6.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You mimic the process of aging or erosion on the target.
The effect depends on whether the target is an object, a construct, or a living creature.
Artifacts and objects and constructs made of precious materials, as determined by the GM, are immune.
* ''Object'' If the object is attended, its bearer can attempt a [[Fortitude]] save. If the bearer fails or the object is unattended, the object immediately takes 4d6 damage (applying Hardness normally) and the item is cursed with an unlimited duration. Until the curse ends, the item becomes [[Shoddy]] and can’t be [[Repair]]ed, and the curse attempts to [[Counteract]] any spell that would restore the object’s Hit Points. [[Remove Curse]] can target an item affected by this spell.
* ''Construct'' The construct takes 4d6 damage (basic [[Fortitude]] save). On a failure, for 1 hour the construct is [[Clumsy]] 1, is [[Enfeebled]] 1, and can’t be [[Repair]]ed, and the curse attempts to [[Counteract]] any spell that would restore the construct’s Hit Points. On a critical failure, these effects have an unlimited duration.
* ''Living Creature'' The living creature must attempt a [[Fortitude]] save. Ageless creatures are immune.
{{||SaveSuccessTable}}
Spells with this trait increase the severity of your oracular curse when cast.
Usually only <<tag Revelation>> spells have this trait.
You can’t cast a cursebound spell if you don’t have an oracular curse.
\define currenttest(s:"")
The current tiddler is <<currentTiddler>>
\end
''Trigger'' You are the target of a physical ranged [[Strike]].
Requirements You’re aware of the attack, not [[Flat-Footed]] against it, and either have a hand free or are wielding a melee weapon.
You can knock aside ranged attacks.
You gain a +4 circumstance bonus to AC against the triggering attack. If the attack misses, you knocked or cut it out of the air.
''Prerequisite'' You must be an expert in a melee weapon.
Select a magical effect that has made an adjacent member of your crop [[Clumsy]], [[Grabbed]], [[Paralyzed]], [[Restrained]], or [[Slowed]].
Attempt a [[Counteract]] check using your attack modifier (including your [[Multiple Attack Penalty]]) with a melee weapon with which you have expert proficiency. Your counteract level is half your level rounded up.
On a success, you free that member from the effect; on a failure, you can’t attempt to use Cut the Bonds on that effect on that crop member until 24 hours have passed.
You’ve been approached with suspicion and distrust throughout your life and return these sentiments back to the strangers you encounter. As a result, you are difficult to deceive.
You gain a +1 circumstance bonus to your [[Perception]] DC against [[Lie]]s and [[Impersonations|Impersonate]].
This thick substance is distilled from the mind-robbing cytillesh fungus, though it lacks memory-altering capabilities.
| !Saving Throw |DC 19 [[Fortitude]] |
| !Onset |Immediate |
| !Maximum Duration |4 rounds |
| !Stage 1 |1d10 poison damage (1 round) |
| !Stage 2 |1d12 poison damage (1 round) |
| !Stage 3 |2d10 poison damage (1 round) |
A family of fiends spawned on the desolate plane of Abaddon, most daemons are neutral evil.
They typically have [[Darkvision]] and weakness to <<tag Good>> damage.
//Not the same as [[Demon]].//
The magic of Abaddon runs through your blood, and you can wield that power.
You can cast [[Death Knell]] and [[False Life]] each once per day as 2nd-level divine innate spells.
The serrated blade of this [[+1|Weapon Potency]] [[Striking]] dagger has a greenish tinge, and the hilt is sculpted to look like the head of a serpent about to strike.
When you critically succeed at an attack roll with the dagger of venom, the target becomes [[Sickened]] 1 unless it succeeds at a DC 19 [[Fortitude]] save. This is a <<tag Poison>> effect.
In addition, you can activate the dagger to poison a creature with a more potent poison.
''Activate'' {{FreeAction}} [[Interact]]; ''Frequency'' once per 'day; ''Trigger'' You damage a creature with the dagger of venom; ''Effect'' You poison the creature you hit with dagger venom.
''Dagger Venom'' (poison); ''Saving Throw'' [[Fortitude]] DC 21; ''Maximum Duration'' 4 rounds. ''Stage 1'' 1d8 poison damage and [[Enfeebled]] 1.
{{||SpellSummaryTable}}
You dance, Striding up to half your Speed.
At either the start or end of your Stride, you create an area of magical darkness in a 10-foot burst centered on your location.
This area is filled with magical darkness that works the same way as that created by a [[Darkness]] spell of the same level.
When you create the darkness, attempt a [[Performance]] check to dance, with a standard DC for your level, to determine the duration of the darkness.
{{||ActionSuccessTable}}
You dart under the legs of your enemies in combat.
You can end a successful [[Tumble Through]] action in a Large or larger enemy’s space.
Also, when using the [[Step Lively]] feat, you can [[Step]] into the triggering enemy’s space. The enemy must have limbs or otherwise leave you enough room for this maneuver, as determined by the GM. For instance, you could share space with a giant or dragon, but not an ooze.
''Usage'' etched onto a melee weapon.
A dancing weapon flies autonomously and strikes your foes.
''Activate'' {{TwoActions}} command, [[Interact]]; ''Effect'' You [[Release]] the weapon and it dances through the air, fighting on its own against the last enemy you attacked, or the nearest enemy to it if your target has been defeated.
At the end of your turn each round, the weapon can [[Fly]] up to its fly Speed of 40 feet, and then can either [[Fly]] again or [[Strike]] one creature within its reach.
The weapon has a space of 5 feet, but it doesn’t block or impede enemies attempting to move though that space, nor does it benefit from or provide flanking.
The weapon can’t move through an enemy’s space.
The weapon can’t use reactions, and its [[Fly]] actions don’t trigger reactions.
While it’s activated, a dancing weapon makes Strikes with an attack modifier of +24 plus its item bonus to attack rolls. It uses the weapon’s normal damage but has a +0 Strength modifier.
The weapon’s abilities that automatically trigger on a hit or critical hit still function, but the weapon can’t be activated or benefit from any of your abilities while dancing.
Each round, when the weapon finishes using its actions, attempt a DC 6 flat check. On a failure, the activation ends. The weapon falls to the ground and can’t dance for 10 minutes.
You are as light as a leaf whirling in the breeze.
When you [[Leap]] or succeed at a [[High Jump]] or [[Long Jump]], increase the distance you jump by 5 feet.
When calculating the damage you take from [[Falling]], don’t count any distance fallen while you are adjacent to a wall.
{{||SpellSummaryTable}}
You create up to four floating lights, no two of which are more than 10 feet apart.
Each sheds light like a [[Torch]]. {{TorchLight}}
When you [[Sustain the Spell|Sustain a Spell]], you can move any number of lights up to 60
feet. Each light must remain within 120 feet of you and within 10 feet of all others, or it winks out.
You are a consummate student of dignity, etiquette, and fashion.
You can use the [[Diplomacy]] skill to perform the special downtime activity [[Influence Rumor]], spending at least one day of downtime to manipulate the course, tone, or content of a rumor to your benefit.
The difficulty of Influencing a Rumor is determined by the GM based on the size of the community, the relative perceptiveness of the inhabitants, and the agency of other rumormongers, but it typically starts with at least DC 15 for a small village and increases to at least DC 20 for a town, at ast DC 30 for a city, and at least DC 40 for a metropolis.
You become trained in [[Deception]] and [[Society]]; if you were already trained, you become an expert instead.
<<archetypefeatlist "4 7" "[[Dandy]]">>
Your legacy grants you great destructive power.
When you [[Cast a Spell]] from your spell slots, if the spell deals damage and doesn’t have a duration, you gain a status bonus to that spell’s damage equal to the spell’s level.
You can hang by your tail from any suitable anchor point, such as a tree branch, balcony, or rocky outcropping (subject to the GM’s discretion), typically while climbing.
While hanging, you have free use of all your other limbs, so you can perform tasks that require both hands, such as firing a bow or swinging a greatsword.
Your companion joins the fray with graceful leaps and dives.
It gains the [[Deny Advantage]] ability, so it isn’t [[Flat-Footed]] to [[Hidden]], [[Undetected]], or [[Flanking]] creatures unless such a creature’s level is greater than yours.
Its proficiency rank in [[Acrobatics]] increases to master, and its [[Dexterity]] modifier increases by 1.
Its proficiency rank in unarmored defense increases to expert, or master if it’s nimble.
If you critically succeed at your [[Daring Act]], you can enter the target’s space and remain there until the beginning of your next turn or until the target moves, whichever comes first.
You gain a +2 circumstance bonus to AC, and your target is [[Flat-Footed]] against your attacks while you are sharing its space in this way.
If any creature other than your target hits you with an attack roll while you are sharing your target’s space, attempt a DC 15 flat check. On a success, resolve the attack against the target instead of you, using the same attack roll result that hit you.
You attempt a death-defying maneuver to distract your enemies.
Select one foe within reach and attempt either an [[Acrobatics]] or [[Athletics]] check against your target’s [[Reflex]] DC.
If you succeed, you can [[Stride]] up to half your Speed (or up to your full Speed if you critically succeed) without triggering reactions from the target due to your movement, and the target is [[Flat-Footed]] against the next melee attack you attempt against it before the end of your turn.
You make quick use of an opening from your daring stunts.
At the end of a successful [[Daring Act]], you can make a melee [[Strike]] against the target or
attempt to [[Disarm]] the target.
The target is [[Flat-Footed]] against the Strike you make during Daring Act as well as the next melee attack you attempt against it before the end of your turn.
You can exert your unsettling presence to subtly [[Demoralize]] others. When you do, Demoralize loses the <<tag Auditory>> trait and gains the <<tag Visual>> trait, and you don’t take a penalty when you attempt to Demoralize a creature that doesn’t understand your language. You also gain the [[Invigorating Fear]] reaction. Your alternate form is a fox, which has the statistics of 1st-level [[Pest Form]].
{{||SpellSummaryTable}}
You infuse a creature’s vision with darkness. //It must make a [[Fortitude]] save.//
After attempting its save, the target becomes temporarily immune for 24 hours.
{{||SaveSuccessTable}}
A creature or object within darkness is [[Hidden]] or [[Undetected]] unless the seeker has [[Darkvision]] or a precise sense other than vision.
A creature without darkvision or another means of perceiving in darkness has the [[Blinded]] condition while in darkness, though it might be able to see illuminated areas beyond the darkness.
If a creature can see into an illuminated area, it can observe creatures within that illuminated area normally.
After being in darkness, sudden exposure to bright light might make you [[Dazzled]] for a short time, as determined by the GM.
{{||SpellSummaryTable}}
You create a shroud of [[Darkness]] that prevents light from penetrating or emanating within the area.
Light does not enter the area and any non-magical light sources, such as a [[Torch]] or [[Lantern]], do not emanate any light while inside the area, even if their light radius would extend beyond the darkness.
This also suppresses magical light of your darkness spell’s level or lower. Light can’t pass through, so creatures in the area can’t see outside. From outside, it appears as a globe of pure darkness.
''Heightened (4th)'' Even creatures with [[Darkvision]] (but not [[Greater Darkvision]]) can barely see through the darkness. They treat targets seen through the darkness as [[Concealed]].
{{LOCGFeat}}
You gain [[Darkvision]].
A creature with darkvision can see perfectly well in areas of [[Darkness]] and [[Dim Light]], though such vision is in black and white only.
Some forms of magical darkness, such as a 4th-level [[Darkness|Darkness (Spell)]] spell, block normal darkvision.
A creature with [[Greater Darkvision]], however, can see through even these forms of magical darkness.
!! Spell
{{||SpellSummaryTable}}
The Darkvision spell grants you darkvision for the duration.
''Heightened (3rd)'' The spell’s range is touch and it targets 1 willing creature.
''Heightened (5th)'' The spell’s range is touch and it targets 1 willing creature. The duration is until the next time you make your [[daily preparations|Rest]].
After you drink this elixir, your sight becomes sharper in darkness.
You gain [[Darkvision]] for the listed duration.
| !Type | !Level | !Price | !Duration |
| Lesser | 2 | 60 | 10 minute |
| Moderate | 4 | 110 | 1 hour |
| Greater | 8 | 900 | 24 hours |
Darkwood is a very lightweight wood found primarily in oldgrowth forests in south-central Avistan; it is dark as ebony but has a slight purple tint.
A darkwood item’s Bulk is reduced by 1 (or to light Bulk if its normal Bulk is 1, with no effect on an item that normally has light Bulk).
The Price of an item made of darkwood is based on the item’s normal Bulk, not its reduced Bulk for being made of darkwood, but reduce the Bulk before making any further Bulk adjustments for the size of the item.
| !Unit | !Price | !Bulk |
| Branch | 5000 | L |
| Lumber | 50000 | 1 |
| !Grade | !Level | !Price |
| Standard | 8 | 3500/Bulk |
| High | 16 | 60000/Bulk |
| !Item | !Grade | !Hardness | !HP | !BT |
| Thin | Standard | 5 | 20 | 10 |
| Thin | High | 8 | 32 | 16 |
| Item | Standard | 7 | 28 | 22 |
| Item | High | 10 | 40 | 20 |
| Structure | Standard | 14 | 56 | 28 |
| Structure | High | 20 | 80 | 40 |
Darkwood armor is 1 Bulk lighter than normal (or light Bulk if its normal Bulk is 1, with no effect on armor that normally has light Bulk).
It’s easier to wear than normal wood armor, reducing the Strength score necessary to ignore its check penalty by 2 and reducing its Speed penalty by 5 feet.
| !Type | !Level | !Price | !Value of Darkwood needed | !Hardness | !HP | !BT | !Magic Level Limit |
| Standard-Grade | 12 | 16000 + 1600/Bulk | 2000 + 200/Bulk | 7 | 28 | 14 | 15 |
| High-Grade | 19 | 320000 + 32000/Bulk | 160000 + 16000/Bulk | 10 | 40 | 20 | Any |
Darkwood weapons are as dark as ebony, with a slight purple tint.
A darkwood weapon’s Bulk is reduced by 1 (or to light Bulk if its normal Bulk is 1, with no effect on a weapon that normally has light Bulk).
| !Type | !Level | !Price | !Value of Darkwood needed |
| Standard-Grade | 11 | 14000 + 1400/Bulk | 1750 + 175/Bulk |
| High-Grade | 17 | 135000 + 13500/Bulk | 67500 + 6750/Bulk |
The raptor [[Step]]s up to 10 feet and then [[Strike]]s, or Strikes and then Steps up to 10 feet.
Whether through painstaking exposure, devoted prayer, or simple luck, you’ve found a greater affinity for life through the sun’s light.
When in an area of direct natural sunlight, your [[Negative Healing]] is suppressed, meaning you are healed by positive healing effects and harmed by negative energy.
//In spite of the name, you do not need to take this feat simply to walk around in sunlight. All Dhampirs can do that.//
{{||SpellSummaryTable}}
You cloud the target’s mind and daze it with a mental jolt.
The jolt deals mental damage equal to your spellcasting ability modifier; the target must attempt a basic [[Will]] save.
If the target critically fails the save, it is also [[Stunned]] 1.
''Heightened (+2)'' The damage increases by 1d6.
''Requirements'' You have a creature [[Grabbed]].
You pummel a held foe, hoping to stagger them.
Make a melee [[Strike]] against a creature you have grabbed. The weapon damage from this Strike is bludgeoning damage.
If the Strike hits, the creature must attempt a [[Fortitude]] save against your class DC; this is an <<tag Incapacitation>> effect.
{{||SaveSuccessTable}}
This knot of copper wire reshapes itself in a new pattern every time its affixed weapon deals damage.
''Trigger'' You deal damage to a [[Flat-Footed]] creature with the affixed weapon.
''Activate'' {{FreeAction}} Envision: When you activate the coil, the damaged creature must succeed at a DC 31 [[Will]] save or be [[Stunned]] 1. If it critically fails, it instead becomes [[Stunned]] 2.
{{||SpellSummaryTable}}
You raise your religious symbol and create a blinding flash of light.
Each creature in the area must attempt a [[Fortitude]] save.
''Heightened (3rd)'' The area increases to a 30-foot cone.
{{||SaveSuccessTable}}
Your eyes are overstimulated.
If vision is your only precise sense, all creatures and objects are [[Concealed]] from you.
On a critical hit, the weapon adds a weapon damage die of the listed size.
Roll this after doubling the weapon’s damage.
This increases to two dice if the weapon has a [[Greater Striking]] rune and three dice if the weapon has a [[Major Striking]] rune.
For instance, a rapier with a greater striking rune deals 2d8 extra piercing damage on a critical hit.
An ability that changes the size of the weapon’s normal damage dice doesn’t change the size of its deadly die.
You aim for your prey’s weak spots, making your shot more challenging but dealing more damage if you hit.
Make a ranged [[Strike]] against your hunted prey at a –2 penalty.
You gain a +4 circumstance bonus to damage on that Strike. This bonus increases to +6 at 11th level and +8 at 15th level.
Your poisons are devastatingly potent.
When you apply a simple poison with [[Poison Weapon]], the poison deals 4d4 poison damage instead of 1d4 poison damage.
When you apply an injury poison to your weapon, the DC to resist that poison increases by 2, to a maximum of your class DC.
''Prerequisites'' deity with a simple favored weapon __or unarmed attacks__, trained with your deity’s favored weapon
Your deity’s weapon is especially powerful in your hands.
When you are wielding your deity’s favored weapon, increase the damage die size of that weapon by one step.
If your deity’s favored weapon is an unarmed attack (such as a fist) and its damage die is smaller than d6, instead increase its damage die size to d6.
You have honed your body to attack with lethal focus.
Your unarmed attacks gain the [[Deadly]] d10 trait, or you increase their [[Deadly]] trait to d10 if the unarmed attack is already deadly with a smaller die size.
You can’t hear.
You automatically critically fail [[Perception]] checks that require you to be able to hear.
You take a –2 status penalty to [[Perception]] checks for [[Initiative]] and checks that involve sound but also rely on other senses.
If you perform an action with the <<tag Auditory>>trait, you must succeed at a DC 5 flat check or the action is lost; attempt the check after spending the action but before any effects are applied.
You are immune to <<tag Auditory>>effects.
//You could use [[Read Lips]] or [[Sign Language]] to communicate with others while deafened.//
{{||SpellSummaryTable}}
The target loses hearing.
It must attempt a [[Fortitude]] save.
The target is then temporarily immune for 1 minute.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You snuff the life out of a creature on the brink of death.
The target must attempt a [[Will]] save.
If this spell kills it, you gain 10 temporary HP and a +1 status bonus to attack and damage rolls
for 10 minutes.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You shield a creature from the ravages of negative energy.
It receives a +4 status bonus to saves against <<tag Death>>and <<tag Negative>>effects, gains negative resistance 10, and suppresses the effects of the [[Doomed]] condition.
If you roll a success on a saving throw against a necromancy effect, you get a critical success instead.
{{||SpellSummaryTable}}
''Trigger'' A living creature within 20 feet of you dies, or an <<tag Undead>>creature within 20 feet of you is destroyed.
Seeing another pass from this world to the next invigorates you.
You gain temporary Hit Points equal to the triggering creature’s level plus your __spellcasting ability__ modifier.
If the triggering creature was undead, double the number of temporary Hit Points you gain.
These last for the duration of the spell, and the spell ends if all the temporary Hit Points are depleted earlier.
''Frequency'' once per 10 minutes.
''Trigger'' You take damage that would reduce you to 0 Hit Points.
You continue to fight when others would fall.
Just before taking the triggering damage, you gain temporary Hit Points equal to twice your level.
If you have Hit Points remaining after gaining these temporary Hit Points, you aren’t knocked unconscious, nor do you suffer the other effects of being reduced to 0 Hit Points.
Any temporary Hit Points that remain after applying the damage last for up to 4 rounds.
Your life has been spent challenging death itself, and proximity to that implacable foe only makes your heart beat harder.
When you are taking [[Persistent Damage]] or your [[Wounded]] value is 1 or greater, you gain a +2 circumstance bonus to [[Fortitude]] saving throws.
The toxic deathcap mushroom can be dried, ground, and treated to form a flavorless powder with accelerated effects.
| !Saving Throw |DC 33 [[Fortitude]] |
| !Onset |10 minutes |
| !Maximum Duration |6 minutes |
| !Stage 1 |13d6 poison damage (1 minute) |
| !Stage 2 |17d6 poison damage and [[Sickened]] 2 (1 minute) |
| !Stage 3 |20d6 poison damage and [[Sickened]] 3 (1 minute) |
''Additive 2''.
''Frequency'' Once per round.
''Trigger'' You use [[Quick Alchemy]] to craft an alchemical bomb that is at least 2 levels lower than your advanced alchemy level.
Your bombs impose additional effects on your enemies.
You mix a substance into the bomb that causes one of the following: [[Dazzled]], [[Deafened]], [[Flat-Footed]], or a –5-foot status penalty to Speeds.
If the attack with that bomb hits, the target must succeed at a [[Fortitude]] saving throw or suffer that effect until the start of your next turn. Use your class DC for this saving throw (even if someone else throws the bomb).
{{||SpellSummaryTable}}
You reveal a glimpse of the impossible conflicts between the divine anathema behind your curse, forcing you to reckon with another’s conflicts as well.
You and the target each take 9d6 <<tag Mental>> damage with a basic [[Will]] save, and the target is [[Stunned]] 1 if it critically fails its save.
You get a degree of success one better than you rolled for your saving throw.
''Heightened (+1)'' The damage increases by 3d6.
Aiming for a weak point, you impede your foe with a precise shot.
Make a ranged weapon [[Strike]].
If it hits and deals damage, the target is [[Slowed]] 1 until the end of its next turn.
''Trigger'' Your Strike hits a [[Flat-Footed]] creature and deals damage.
You apply one of the following debilitations, which lasts until the end of your next turn.
''Taking certain feats adds extra debilitation options. The list below shows all available options, but most feats require higher levels or particular racket choices.''
| !Extra Feat | !Debilitation |
|None |The target takes a –10-foot status penalty to its Speeds. |
|None |The target becomes [[Enfeebled]] 1. |
|[[Precise Debilitations]] |The target takes an additional 2d6 precision damage from your attacks. |
|[[Precise Debilitations]] |The target becomes [[Flat-Footed]]. |
|[[Tactical Debilitations]] |The target can’t use Reactions. |
|[[Tactical Debilitations]] |The target can’t flank or contribute to allies’ [[Flanking]]. ||
|[[Vicious Debilitations]] |The target gains Weakness 5 to your choice of bludgeoning, piercing, or slashing damage. |
|[[Vicious Debilitations]] |The target becomes [[Clumsy]] 1. |
|[[Critical Debilitation]] |On critical hit, can force a save against incapacitation - see the Feat. |
//A target can only be affected by one Debilitation (of any kind) at once.//
Debilitations apply conditions and other negative effects to a creature. When the creature is affected by a new debilitation, any previous one it was affected by ends.
This item looks like an ordinary glass flask full of water.
The stopper can’t be removed unless you speak one of the item’s three command words, each of which causes water to pour forth in a different way.
Pulling the stopper straight out creates fresh water, and rotating it as you pull creates salt water.
Any effect of the decanter lasts until the decanter is plugged (with its own stopper, a finger, or the like).
''Activate'' {{OneAction}} command, Interact; ''Effect'' Speaking “stream,” you cause water to pour at a rate of 1 gallon per round.
''Activate'' {{OneAction}} command, Interact; ''Effect'' Speaking “fountain,” you cause water to pour in a 5-foot-long stream at a rate of 5 gallons per round.
''Activate'' {{OneAction}} command, Interact; ''Effect'' Speaking “geyser,” you cause a powerful deluge of water to erupt at a rate of 15 gallons per round. You can direct the stream at a creature, subjecting it to the effects of [[Hydraulic Push]] (spell attack roll +15). You can repeat this once per round as long as the geyser continues, spending an Interact action to direct the geyser each time.
{{||SpellSummaryTable}}
You wrap yourself in a cloak of illusion, appearing as another creature of the same body shape with roughly similar height and weight as yourself.
This has the effects of a 3rd-level [[Illusory Disguise]].
''Heightened (6th)'' You can appear as any creature of the same size, even with a completely different body shape.
''Key Ability'' [[Charisma]].
You can trick and mislead others using disguises, lies, and other forms of subterfuge.
{{||SkillActionList}}
{{||SkillFeatList}}
Members of your cult frequently pass themselves off as worshippers of other religions.
You can use [[Occultism]] instead of [[Deception]] to [[Impersonate]] a typical worshipper of another faith or to [[Lie]] specifically to claim you are a member of the faith you are Impersonating.
You still need to use the [[Deception]] skill to Impersonate a specific worshipper or to perform other deceptive actions, such as attempting to [[Lie]] about any other matter.
You attempt to decipher complicated writing or literature on an obscure topic.
This usually takes 1 minute per page of text, but might take longer (typically an hour per page for decrypting ciphers or the like).
The text must be in a language you can read, though the GM might allow you to attempt to decipher text written in an unfamiliar language using [[Society]] instead.
The DC is determined by the GM based on the state or complexity of the document. The GM might have you roll one check for a short text or a check for each section of a larger text.
{{||ActionSuccessTable}}
Your dedication to the Godclaw borders on a cleric’s.
You gain the cleric’s [[Domain Initiate]] feat but must select [[Perfection]], [[Protection]], [[Tyranny]], or [[Zeal]] as your domain.
In addition, you can use any religious symbol of Abadar, Asmodeus, Iomedae, Irori, or Torag as your divine focus.
You use your skills at deduction to perform whatever task is necessary to solve the case.
You can attempt any check that requires you to be trained in a skill, even if you’re untrained in it.
You can attempt any check that requires you to have expert proficiency in a skill so long as you’re trained in it.
You can attempt any check that requires you to have master proficiency in a skill as long as you have expert proficiency in it.
You gain <<tag Cold>> or <<tag Negative>> resistance equal to half your level (minimum 1), chosen when you gain this heritage.
Your repertoire is vast, containing far more spells than usual.
Add one spell to your repertoire of each level you can cast.
You gain the [[Terrain Expertise]] skill feat for underground terrain and the [[Combat Climber]] skill feat.
Your vision is suited for night or the underground.
You gain [[Darkvision]].
With some streamlining to your process and a deeper collection of talisman materials, you make a greater number of talismans every day.
You can create two additional talismans during your daily preparations.
You move at half your travel speed with your shield raised.
If combat breaks out, you gain the benefits of [[Raising a Shield|Raise a Shield]] before your first turn begins.
''Trigger'' An enemy makes an attack roll against your mount while you’re riding it.
You interpose yourself between an attacker and your mount, defending your mount from harm.
Use your own AC against the triggering attack instead your mount’s AC.
If the triggering attack hits, you take the effects of the attack instead of your mount.
''Prerequisites'' harmful font or healing font.
Your faith provides temporary protection in addition to healing.
If the next action you use is to cast [[Harm]] or [[Heal]] on a single target and the target regains Hit Points from the spell, it also gains a +2 status bonus to [[AC]] and saving throws for 1 round.
''This is used to defend against:''
<ul>
<$list filter="[field:a-defense<currentTiddler>sort[]]">
<li><$link to=<<currentTiddler>> /></li>
</$list>
</ul>
Like the storied heroes who persist in the face of overwhelming odds, you and your allies will hold the line.
If your next action is to cast the [[Inspire Defense]] composition cantrip, you can [[Raise a Shield]], and one ally who gains a status bonus from the spell can immediately use a reaction to [[Raise a Shield]].
//As written, this requires [[Warrior Muse]] and [[Inspire Defense]], but Inspire Defense is only available to [[Maestro Muse]]. This means that you must take [[Multifarious Muse]] to use this at all.//
The flow of magic and your training combine to help you avoid attacks.
Your proficiency rank in unarmored defense increases to expert.
''Frequency'' once per 10 minutes.
''Trigger'' A physical attack would reduce you to 0 Hit Points.
Dropping into a roll to disperse the force of the blow, you can partially evade a lethal attack and stay conscious.
You take half damage from the triggering attack.
{{LOCGFeat}}
If you would start your turn [[Confused]], [[Controlled]], or [[Fleeing]] due to a failed Will save, you can attempt a [[Will]] save against the same DC; on a success, you become [[Paralyzed]] until your next turn, rather than act against your will.
''Trigger'' You are the target of a physical ranged attack.
''Requirements'' You’re aware of the attack, are not [[Flat-Footed]] against it, and have a hand free.
You gain a +4 circumstance bonus to AC against the triggering attack. If the attack misses, you have deflected it.
You cannot use this feat to deflect unusually massive ranged projectiles (such as boulders or ballista bolts).
When you set things up to help your allies, you also gain some of the fruits of your labors.
When you successfully [[Aid]] an attack roll or AC, you gain a +1 circumstance bonus to attack rolls or AC against that enemy until the end of your next turn, whichever you granted to your ally.
When you successfully [[Aid]] a skill check, if you attempt the exact same skill check (not just using the same skill, but using it for the same purpose, for instance a check to Climb the same wall) on your next turn, you gain a +1 circumstance bonus to your skill check.
You’re exceptionally difficult to kill.
The DC of your recovery checks is equal to 9 + your dying value, or 8 + your dying value if you have the [[Toughness]] general feat.
In addition, whenever someone returns you to life using magic that would normally leave you debilitated for a week (such as [[Raise Dead]] or the [[Resurrect]] ritual), you don’t suffer that condition.
''Prerequisites'' [[Darkvision]].
Using ancient dwarven methods developed to fight enemies wielding magical darkness, you’ve honed your darkvision and sworn not to use such magic yourself.
You gain greater [[Darkvision]], enabling you to see through magical darkness even if it normally hampers darkvision (such as the darkness created by a 4th-level [[Darkness|Darkness (Spell)]] spell).
You can’t cast spells with the <<tag Darkness>> trait, use item activations with the darkness trait, or use any other ability with the darkness trait.
You zealously bear your deity’s favored weapon.
If it’s uncommon, you gain access to it.
If it’s a simple weapon __or an unarmed attack with a d4 damage die__, increase the damage die by one step (d4 to d6, d6 to d8, d8 to d10, d10 to d12).
Imitating animal threat displays, you make yourself appear larger and more imposing.
Roll one [[Intimidation]] check to [[Demoralize]] and compare the result to the [[Will]] DC of each animal, fungus, and plant creature in a 15-foot cone.
When you do, Demoralize gains the <<tag Visual>> trait, and creatures are affected if they can see you. You don’t take a penalty if the creature doesn’t understand your language.
You embody an aspect of your deity.
Choose one of your deity’s [[Domain]]s.
You gain the domain’s initial domain spell as a devotion spell.
When you call upon your deity’s power to fulfill the promise of their domain, you gain divine protection.
After you cast a domain spell, you gain resistance to all damage until the start of your next turn. The amount of resistance is equal to the level of the domain spell you cast.
{{||SpellSummaryTable}}
You loop a thought process in the target’s mind, forcing it to repeat the same actions over again.
The target must attempt a Will save. //''This is an Incapacitation effect, so targets of more than twice the spell's level promote their save by one category.''//
If the target fails, whatever actions the target uses on its next turn, it must repeat on its following turn. The actions must be repeated in the same order and as close to the same specifics as possible. For example, if the target makes an attack, it must repeat the attack against the same creature, if possible, and if the target moves, it must move the same distance and direction, if possible, on its next turn.
If the target can’t repeat an action, such as [[Casting a Spell|Cast a Spell]] that has been exhausted or needing to target a creature that has died, it can act as it chooses for that action but becomes [[Stupefied]] 1 until the end of its turn.
''Trigger:'' Your turn begins.
You wait for the right moment to act.
The rest of your turn doesn’t happen yet. Instead, you’re removed from the initiative order.
You can return to the initiative order as a free action triggered by the end of any other creature’s turn.
This permanently changes your initiative to the new position.
You can’t use [[Reaction]]s until you return to the initiative order.
If you Delay an entire round without returning to the initiative order, the actions from the Delayed turn are lost, your initiative doesn’t change, and your next turn occurs at your original position in the initiative order.
When you Delay, any [[Persistent Damage]] or other negative effects that normally occur at the start or end of your turn occur immediately when you use the Delay action. Any beneficial effects that would end at any point during your turn also end. The GM might determine that other effects end when you Delay as well.
Essentially, you can’t Delay to avoid negative consequences that would happen on your turn or to extend beneficial effects that would end on your turn.
{{||SpellSummaryTable}}
With a surge of healing energy, you push back against an affliction threatening the target and grant a small amount of healing.
The target recovers 3d8 Hit Points.
You attempt to [[Counteract]] any one [[Affliction]] you are aware the target has, suspending its effects for 1 hour on a success rather than removing it. The target is then temporarily immune to delay affliction for 1 day.
You don’t need to have identified the name of the specific affliction, but you do need to be aware of it; for instance, you couldn’t delay an ingested poison during its onset period unless you were aware of the poison.
''Heightened (+1)'' The target recovers an additional 1d8 Hit Points and you can attempt to suspend an additional affliction.
{{||SpellSummaryTable}}
''Trigger'' A creature or object in range is hit by an attack.
You transpose the moment that the target would be injured to later in its timestream.
Roll damage normally, but do not reduce Hit Points or apply any other effects of the attack until the spell’s duration has elapsed.
When the spell ends, the target is immediately affected by the attack, taking damage and being affected by any additional effects.
You can [[Dismiss]] this spell.
''Trigger'' A trap within your reach is triggered.
You can jam the workings of a trap to delay its effects.
Attempt a [[Thievery]] check to [[Disable a Device]] on the trap; the DC to do so is increased by 5, and the effects are as follows.
{{||ActionSuccessTable}}
''Frequency'' once per day
''Trigger'' You are about to gain the [[Dying]] condition as a result of another creature’s attack or ability, and that creature is within your melee reach.
Once, you died because someone—murderer or monster, soldier or executioner— chose to strike you down.
Just before losing consciousness, make a melee Strike against the triggering creature.
''Special'' You can select this feat only at 1st level, and you can’t retrain into or out of this feat..
{{||SpellSummaryTable}}
You unleash a catastrophic downpour in the area that vanishes an instant later.
All flying creatures in the area descend 50 feet or until blocked by the ground or firm surface.
Each creature whose descent was blocked by the ground or firm surface takes <<tag Bludgeoning>> damage equal to the number of feet it fell (the creature does not also take falling damage) and is knocked prone.
Creatures on the ground, including flying creatures forced to the ground by the spell, must succeed at a [[Reflex]] save or be pushed 50 feet away from the center of the area.
Flimsy structures in the area collapse. The GM can determine other large-scale effects that result from the deluge.
''Heightened (+1)'' The area increases by 10 feet, and flying creatures fall an additional 10 feet.
{{||SpellSummaryTable}}
You make the target overconfident, leading it to ascribe failure to external factors.
If the target fails at an attack roll or skill check, it takes a –1 status penalty to attack rolls and skill checks until the end of its turn (or the end of its next turn, if it attempted the roll outside its turn).
If the creature fails a second time while taking this penalty, the penalty increases to –2.
The duration depends on the target’s [[Will]] save.
After attempting its save, the creature becomes temporarily immune for 24 hours.
{{||SaveSuccessTable}}
If your skill check to challenge a foe is a success, the target of your challenge takes a –1 circumstance penalty to attack rolls (or –2 if you critically succeed) until the end of your next turn.
You can rig your bombs to inanimate objects in order to cause destruction to the surrounding area.
As an activity that takes 1 minute, you attach between one and four bombs to an inanimate object within your reach, such as a chest, door, wall, or column.
This creates a hazard in one square occupied by or adjacent to the inanimate object, and the hazard’s [[Stealth]] DC to detect it and [[Thievery]] DC to disable it are equal to your class DC.
The hazard has the [[Fire in the Hole]] reaction, which you can also trigger as a single action so long as you are within 30 feet of the hazard.
The hazard retains its potency until it’s triggered, until the inanimate object moves from its space, or until you make your next daily preparations, whichever comes first.
A family of fiends hailing from the Abyss, most demons are chaotic evil.
Most demons have [[Darkvision]].
//Not the same as [[Daemon]].//
''Craft Requirements'' You are evil; supply one casting of [[Dimension Door]].
Crafted from black iron, this crude suit of [[+2|Armor Potency]] [[Resilient]] full plate is designed to make you look like a horned demon, with your face peering out of the screaming maw of the beast.
While wearing the armor, you can attack with the helmet’s horns. They are a martial melee weapon with the effects of a +2 [[Weapon Potency]] rune. They deal 2d8 piercing damage and have the [[Deadly]] d12 trait. On a critical hit with the horns, the target must attempt a DC 30 Fortitude save against the [[Abyssal Plague]] disease. The horns can’t be etched with any runes.
If you aren’t evil, you’re [[Drained]] 2 and can’t recover from this condition while wearing demon armor.
''Activate'' {{TwoAction}} Command; ''Frequency'' once per day; ''Effect'' You cast [[Dimension Door]].
You can channel the power of the Abyss through your heritage, producing terrible tangible effects.
You can cast [[Paranoia]] and [[Shatter]] each once per day as 2nd-level divine innate spells.
With a sudden shout, a well-timed taunt, or a cutting putdown, you can shake an enemy’s resolve.
Choose a creature within 30 feet of you who you’re aware of.
Attempt an [[Intimidation]] check against that target’s [[Will]] DC. If the target does not understand the language you are speaking, you’re not speaking a language, or they can’t hear you, you take a –4 circumstance penalty to the check.
Regardless of your result, the target is temporarily immune to your attempts to Demoralize it for 10 minutes.
{{||ActionSuccessTable}}
''Requires'' Healing Font.
''Trigger'' Any ally within 30 feet that you can heal with your [[Heal]] spell would take damage from an attack or effect from a source you can observe.
''Requirements'' You have a heal spell prepared and you aren’t [[Flat-Footed]] to the source of the damage.
You cast [[Heal]] on the triggering target. Instead of its normal effects, the heal spell reduces the triggering damage by an amount equal to the Hit Points a 1-action heal spell of that level would have recovered.
As usual, if this reduces the damage to 0, it might also remove additional effects of the triggering attack, such as injury poisons.
Your foes struggle to pass your defenses.
You aren’t [[Flat-Footed]] to [[Hidden]], [[Undetected]], or [[Flanking]] creatures of your level or lower, or creatures of your level or lower using [[Surprise Attack]].
However, they can still help their allies flank.
This family of humanoids are the descendants of fey creatures that fell into darkness and confusion after being abandoned in the Darklands.
They are immune to [[Confusion]] and vulnerable to sunlight.
You always take what pleases you, no matter who it hurts, and you spread the influence of evil across all you touch.
* You must never perform acts anathema to your deity or willingly commit a purely good act, such as giving something solely out of charity, casting a good spell, or using a good item.
* You must never put another person’s needs before your own, and you must never put your own needs before those of your deity. Though you can perform acts others might consider helpful, it must be done with the expectation that it ultimately furthers your own goals or those of your master.
* Subvert or corrupt everything in your path that is pure and good, and sow doubt among those upholding such ideals.
You gain the [[Touch of Corruption]] devotion spell. Your champion's reaction is [[Selfish Shield]].
You gain fire resistance equal to half your level (minimum 1), and environmental heat effects are one step less extreme for you (incredible heat becomes extreme, extreme heat becomes severe, and so on).
If you have both hands free, you can increase your Speed to 30 feet as you run on all fours.
In addition, environmental heat effects are one step less extreme for you, and you can go 10 times as long as normal before you are affected by [[Starvation]] or [[Thirst]].
However, unless you wear protective gear or take shelter, environmental cold effects are one step more extreme for you.
''Trigger'' You complete the last action on your turn, and your turn has not ended yet.
''Requirements'' You meet the requirements to use an action with the <<tag Press>> trait.
You throw everything into one last press.
Use a single action that you know with the <<tag Press>> trait as part of Desperate Finisher.
You forgo the ability to use reactions until the start of your next turn.
''Frequency'' once per day.
''Trigger'' You begin your turn and have no Focus Points in your pool.
You call out to your deity in a plea for their aid.
You instantly recover 1 Focus Point.
{{||SpellSummaryTable}}
Swirling sands of divine devastation surround you, weakening the defenses of all they touch.
Reduce the resistances of creatures in the area (including yourself) by 2.
''Heightened (+2)'' Reduce the resistances by an additional 2.
You can protect yourself more effectively, at the expense of your shield.
When you [[Shield Block]], you can reduce the damage to yourself by double the shield’s Hardness, but if you do, the shield takes double the normal amount of damage it would have taken (before applying its Hardness).
You can’t use Destructive Block if your shield can’t be broken or destroyed, such as if you’re using an indestructible shield.
''Trigger'' An enemy within 15 feet damages you.
Bloodshed begets bloodshed as you drag your enemy toward oblivion.
You increase the amount of damage you take by 1d6, and you deal 1d6 damage to the triggering enemy, choosing evil or negative damage to deal to the enemy each time you use this reaction.
In addition, until the end of your next turn, your [[Strike]]s against the triggering creature deal 2 extra damage of the type you chose. The damage you take and deal when you use this reaction increases to 2d6 at 5th level, 3d6 at 9th level, 4d6 at 12th level, 5d6 at 16th level, and 6d6 at 19th level. The extra damage on your [[Strike]]s increases to 4 at 9th level and 6 at 16th level.
If you have Divine Smite, an enemy damaged by the initial damage from your Destructive Vengeance also takes persistent evil damage equal to your [[Charisma]] modifier. This applies only to the damage the reaction itself deals to the triggering creature, not the damage you deal with subsequent Strikes.
If you have Exalt, when you use Destructive Vengeance, each enemy within 15 feet of you other than the triggering creature takes half the damage you deal to the triggering enemy, of the same damage type you chose.
{{||SpellSummaryTable}}
Your eyes glow as you sense aligned auras.
Choose <<tag Chaotic>>, <<tag Evil>>, <<tag Good>>, or <<tag Lawful>>. You detect auras of that alignment.
You receive no information beyond presence or absence.
You can choose not to detect creatures or effects you’re aware have that alignment.
Only creatures of 6th level or higher—unless divine spellcasters, <<tag Undead>>, or beings from the Outer Sphere—have alignment auras.
''Heightened (2nd)'' You learn each aura’s location and strength.
The strength of an alignment aura depends on the level of the creature, item, or spell.
The auras of undead, clerics and other divine spellcasters with a patron deity, and creatures from the Outer Sphere are one step stronger than normal (faint instead of none, for example).
|!Creature or Item Level|!Spell or Effect Level|!Aura Strength|
|0–5|—|None|
|6–10|0–3|Faint|
|11–15|4–7|Moderate|
|16–20|8–9|Powerful|
|21+|10|Overwhelming|
{{||SpellSummaryTable}}
You send out a pulse that registers the presence of magic.
You receive no information beyond the presence or absence of magic.
You can choose to ignore magic you’re fully aware of, such as the magic items and ongoing spells of you and your allies.
You detect <<tag Illusion>>magic only if that magic’s effect has a lower level than the level of your detect magic spell. However, items that have an illusion aura but aren’t deceptive in appearance (such as an invisibility potion) typically are detected normally.
When used as an exploration activity, you cast [[Detect Magic]] at regular intervals.
You move at half your travel speed or slower.
You have no chance of accidentally overlooking a magic aura at a travel speed up to 300 feet per minute, but must be traveling no more than 150 feet per minute to detect magic auras before the party moves into them.
This activity doesn’t enable characters to automatically find every single magical aura or object during travel. Hazards that require a minimum proficiency can’t be found with detect magic, nor can illusions of equal or higher level than the spell.
''Heightened (3rd)'' You learn the school of magic for the highest level effect within range that the spell detects. If multiple effects are equally strong, the GM determines which you learn.
''Heightened (4th)'' As 3rd level, but you also pinpoint the source of the highest-level magic. Like for an imprecise sense, you don’t learn the exact location, but can narrow down the source to within a 5-foot cube (or the nearest if larger than that).
{{||SpellSummaryTable}}
You detect whether a creature is venomous or poisonous, or if an object is poison or has been poisoned.
You do not ascertain whether the target is poisonous in multiple ways, nor do you learn the type or types of poison.
Certain //common// substances, like lead and alcohol, are //technically// poisons and so mask other poisons.
''Heightened (2nd)'' You learn the number and types of poison.
{{||SpellSummaryTable}}
By tapping into trace divinatory auras, you detect the presence of <<tag Scrying>>effects in the area.
If detect scrying is higher level than a scrying effect, you gain a glimpse of the scrying creature and learn its approximate distance and direction.
''Heightened (6th)'' The duration is until the next time you make your [[daily preparations|Rest]].
//Detection effects help you find things.//
When you’re on a case, you stay watchful and resolute to avoid tricks your suspect might pull.
You gain your circumstance bonus from [[Pursue a Lead]] on saving throws (and their DCs, as normal) against the subject of a lead, and you can use [[Clue In]] to assist an ally’s saving throw against that subject.
''Frequency'' once per day
Your training allows you to shrug off your foes’ spells and conditions when the need is dire.
Choose a single nonpermanent spell or condition that is affecting you.
If you chose a condition, its effect on you ends.
If you chose a spell, attempt to [[Counteract]] the spell (__your counteract level is half your level rounded up__, and you attempt a [[Will]] save as your counteract check).
This doesn’t remove any Hit Point damage normally dealt by the spell or condition, and it doesn’t prevent the spell or debilitating effect from affecting other allies or the environment around you.
It can’t remove an ongoing affliction or prevent such an affliction from inflicting conditions on you later.
It can’t remove conditions from //(caused by)// the situation (such as [[Prone]] or [[Flanked|Flanking]]).
If the effect comes from a creature, hazard, or item of 20th level or higher, Determination can’t remove its effect on you.
Nothing can keep you from your enemy.
[[Stride]] twice.
During this movement you ignore [[Difficult Terrain]], greater difficult terrain, and any effects that would impose a penalty to Speed.
You can attempt an [[Athletics]] check instead of an [[Acrobatics]] check to [[Balance]] when moving across narrow surfaces or uneven ground, using the same DC.
This doesn’t prevent you from being harmed by hazardous terrain.
You can increase the number of actions this activity takes to 3 to [[Stride]] three times instead.
Your Strikes are so devastating that you hardly care about resistance, and your barbarian abilities are unparalleled.
Your proficiency rank for your barbarian class DC increases to master.
Your melee [[Strike]]s ignore 10 points of a creature’s resistance to their physical damage.
A family of fiends from Hell, most devils are lawful evil.
They typically have [[Greater Darkvision]], immunity to <<tag Fire>>, and [[Telepathy]].
You can call in devils to assist your efforts.
You gain [[Summon Fiend]] as an innate spell of a tradition of your choice, which you can cast once per day. When you cast this spell, you can summon only creatures that have the devil trait.
At 16th level and every 2 levels thereafter, the spell is heightened by 1 level (to a maximum of 8th level when you reach 20th level).
You’ve learned to draw your fiendish nature into a small ball of corruption and hide it in
your soul.
Your obviously fiendish traits disappear, including any tails, horns, and cloven hooves, though hints remain (claws turn into jagged nails or eyes retain an odd hue, for instance). You’re still recognizably yourself, but now appear as a typical, non-tiefling member of your base ancestry.
Using Devil in Plain Sight counts as creating a disguise when using [[Deception]] to [[Impersonate]], and your transformation automatically defeats [[Perception]] DCs to determine if you’re a normal member of your base ancestry; only creatures actively rolling Perception to examine you might notice the disguise.
While in your shapeshifted form, you can’t use unarmed attacks, innate spells, or other abilities that require physical features you receive from a tiefling ancestry feat—for instance, you can’t use the [[Skillful Tail|Skillful Tail (Tiefling)]] feat.
You can remain in your alternate form indefinitely, and can shift back to your tiefling form by using this action again.
Drawing on the infernal power of your sinister forbears, you mislead your foes with magical deception.
You can cast [[Invisibility]] and [[Misdirection]] each once per day as 2nd-level divine innate spells.
{{LOCGFeat}}
You know more about the habits of devils than is entirely safe.
You gain a +2 circumstance bonus to [[Perception]] checks against devils and saving throws against their abilities.
In addition, whenever you meet a devil in a social situation, you can immediately attempt a [[Diplomacy]] check to [[Make an Impression]] on that creature rather than needing to converse for 1 minute. You take a –5 penalty to the check. If you fail, you can engage in 1 minute of conversation and attempt a new check at the end of that time rather than accepting the failure or critical failure result.
''Special'' If you have the [[Glad-Hand]] skill feat, you don’t take the penalty to your immediate Diplomacy check if the target is a devil.
Traditionally, fiends are exceptionally good at persuading people to do things, even when their targets know it’s a bad idea. You’re also rather good at it, compelling the weak and weak-willed to your bidding.
You can cast [[Charm]] once per day as a 1st-level divine innate spell.
''Frequency'' once per round
You assess a foe’s weaknesses in combat and use them to formulate a plan of attack against your enemy.
Choose a creature you can see and roll a d20.
If you [[Strike]] the chosen creature later this round, you must use the result of the roll you made to Devise a Stratagem for your Strike’s attack roll instead of rolling.
You make this substitution only for the first Strike you make against the creature this round, not any subsequent attacks.
When you make this substitution, you can also add your [[Intelligence]] modifier to your attack roll instead of your [[Strength]] or [[Dexterity]] modifier, provided your [[Strike]] uses an [[Agile]] or [[Finesse]] melee weapon, an [[Agile]] or [[Finesse]] unarmed attack, a ranged weapon (which must be [[Agile]] or [[Finesse]] if it’s a melee weapon with the [[Thrown]] trait), or a [[Sap]].
If you’re aware that the creature you choose is the subject of a lead you’re pursuing, you can use this ability as a free action.
Your devotion is strong enough to increase your focus to incredible heights.
If you have spent at least 2 Focus Points since the last time you Refocused, you recover 2 Focus Points when you [[Refocus]] instead of 1.
{{||SpellSummaryTable}}
You attempt to utterly consume the target’s life force.
The target takes 60 <<tag Negative>> damage with a basic [[Fortitude]] save.
If this damage reduces the target to 0 Hit Points, it dies immediately.
You regain Hit Points equal to half the negative damage the target takes (after applying resistance and the like). Any excess healing is gained as temporary Hit Points, which you lose after 1 minute.
''Heightened (+1)'' The damage increases by 10.
Dexterity measures your character’s agility, balance, and reflexes.
Dexterity is important if your character plans to make attacks with ranged weapons or use [[Stealth]] to surprise foes.
//Dexterity governs [[Acrobatics]], [[Stealth]] and [[Thievery]].//
Your Dexterity modifier is also added to your character’s [[AC]] and [[Reflex]] saving throws.
//Being [[Clumsy]] reduces your Dexterity.//
//Your maximum Dexterity can be limited by your [[Armor]].//
{{||StatModSummary}}
You are the scion of a vampire, half living and half undead, gifted with uncanny charm and grace, a bloodless pallor, and elongated incisors.
You gain the <<tag Dhampir>> trait, in addition to the traits from your ancestry.
You have the [[Negative Healing]] ability, which means you are harmed by positive damage and healed by negative effects as if you were <<tag Undead>>. //(NB: you are damaged by positive ''damage'', but merely ignore positive ''healing''.)//
You also gain [[Low-Light Vision]], or you gain [[Darkvision]] if your ancestry already has low light vision.
You can choose from <<tag Dhampir>> feats and feats from your ancestry whenever you gain an ancestry feat.
{{||VHerFeatList}}
{{LOWGFeat}}
''Trigger'' Your turn begins and you can observe a devil.
Your Hellknight training drilled details of Hell’s denizens deep into your mind.
Make an attempt to [[Recall Knowledge]] about a devil you’re observing.
If you roll a critical failure on this check, you get a failure instead.
{{||SpellSummaryTable}}
You issue a diabolic edict, demanding the target perform a particular task and offering rewards for its fulfillment.
It gains a +1 status bonus to attack rolls and skill checks related to performing the task.
If it refuses to perform the task you proclaimed, it instead takes a –1 status penalty to all its attack rolls and skill checks.
{{||SpellSummaryTable}}
You supercool the nearby air, forming a cloud of dancing ice crystals in an emanation around you.
A creature other than you that enters the area or ends its turn within the area takes 2d6 <<tag Cold>> damage. A creature can take this damage only once per turn.
The crystals scatter and refract light; if a <<tag Light>> effect enters diamond dust’s area, any creatures that effect goes on to affect gain a +2 status bonus to AC and saves against it.
While the spell persists, you can activate or deactivate this aura by using a single action, which has the <<tag Concentrate>> trait.
You can [[Dismiss]] this spell.
''Heightened (+2)'' The damage increases by 1d6.
Your body hardens as you combine your attacks, making your finishing blows more damaging.
Your unarmed attacks gain the [[Forceful]] trait.
Any that already had this trait instead increase their weapon damage dice by one step.
You have fortified your body and mind against eldritch effects.
You gain a +1 status bonus to saving throws against magic.
When you find a glaring weakness, you can set your allies up to annihilate your foe.
When you use [[Shared Stratagem]], you can designate up to 10 allies instead of just one.
The foe is [[Flat-Footed]] against the first attack from each designated ally before your next turn, and each ally’s first attack deals an extra 2d6 precision damage to the target if it hits.
It takes more to kill you than most.
You die from the [[Dying]] condition at dying 5, rather than dying 4.
{{AoA3Feat}}
''Prerequisites'' ability to select ancestry feats from multiple ancestries.
Your separate experiences in different societies have evolved into entirely separate lives.
Create a second identity for yourself with a different name, history, and background. This identity must correspond to one of the ancestries whose ancestry feats you can select.
You gain the trained proficiency rank in the [[Lore]] skill from the second background you chose (but you don’t gain any of the background’s other benefits), and you gain a +4 circumstance bonus to [[Deception]] checks when making a statement that would be true of your second identity or when disguising yourself as your second identity.
Difficult terrain is any terrain that impedes your movement, ranging from particularly rough or unstable surfaces to thick ground cover and countless other impediments.
Moving into a square of difficult terrain (or moving 5 feet into or within an area of difficult terrain, if you’re not using a grid) costs an extra 5 feet of movement.
Moving into a square of ''greater'' difficult terrain instead costs 10 additional feet of movement.
This additional cost is not increased when moving diagonally.
You can’t [[Step]] into difficult terrain //unless you have [[Feather Step]]//.
Movement you make while you are jumping ignores the terrain you’re jumping over. Some abilities (such as flight or being incorporeal) allow you to avoid the movement reduction from some types of difficult terrain.
Certain other abilities let you ignore difficult terrain on foot; such an ability also allows you to move through greater difficult terrain at the normal movement cost as for difficult terrain, though it wouldn’t let you ignore greater difficult terrain unless the ability specifies otherwise.
IncrediblyEasy:-10
VeryEasy:-5
Easy:-2
Hard:2
VeryHard:5
IncrediblyHard:10
''Requirements'' You are standing on dirt, sand, snow, or similar particulate material.
Your hands work as effectively as shovels when you need to dig a quick hole.
You dig a shallow pit in the square you currently occupy, turning the square into [[Difficult Terrain]] (including for you).
In addition, you also kick up a cloud of grit in a direction of your choice. The cloud extinguishes small, unattended, non-magical fires and helps smother the flames on burning creatures located within the cone; creatures in this cone that are taking persistent <<tag Fire>> damage can immediately attempt an additional flat DC 15 check to end the persistent damage.
Areas in shadow or lit by weak light sources are in dim light.
Creatures and objects in dim light have the [[Concealed]] condition, unless the seeker has [[Darkvision]] or [[Low-Light Vision]], or a precise sense other than vision.
{{||SpellSummaryTable}}
''Trigger'' You cast a <<tag Darkness>> or <<tag Shadow>> spell.
You magnify the darkness from the triggering effect, causing the ambient light level to flicker briefly so you can slip from sight.
You can immediately attempt a [[Stealth]] check to [[Hide]], and you can become [[Hidden]] to a creature even if you don’t have cover and aren’t otherwise concealed from that creature.
You cease being hidden at the end of your turn unless you move into [[Cover]] or become [[Concealed]] before then.
{{||SpellSummaryTable}}
Opening a door that bypasses normal space, you instantly transport yourself and any items you’re wearing and holding from your current space to a clear space within range you can
see.
If this would bring another creature with you—even if you’re carrying it in an extradimensional container—the spell is lost.
''Heightened (5th)'' The range increases to 1 mile. You don’t need to be able to see your destination, as long as you have been there in the past and know its relative location and distance from you. You are temporarily immune for 1 hour.
{{||SpellSummaryTable}}
You interfere with the target’s ability to teleport and travel between dimensions.
Dimensional anchor attempts to [[Counteract]] any <<tag Teleportation>> effect, or any effect that would move the target to a different plane.
The duration is determined by the target’s Will save.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You create a shimmering barrier that attempts to [[Counteract]] <<tag Teleportation>>effects and planar travel into or out of the area, including items that allow access to extradimensional spaces (such as a [[Bag of Holding]].
Dimensional lock tries to [[Counteract]] any attempt to summon a creature into the area but doesn’t stop the creature from departing when the summoning ends.
{{||SpellSummaryTable}}
You teleport to a location up to 20 feet away within your line of sight.
''Heightened (+1)'' The distance you can teleport increases by 5 feet.
These reptiles have survived from prehistoric times.
{{||SpellSummaryTable}}
You channel the primal forces of nature to transform into a [[Large]] animal battle form, specifically that of a powerful and terrifying dinosaur.
You must have space to expand or the spell is lost.
When you cast this spell, choose ankylosaurus, brontosaurus, deinonychus, stegosaurus, triceratops, or tyrannosaurus. You can decide the specific type of animal, but this has no effect on the form’s Size or statistics.
While in this form, you gain the <<tag Animal>> and <<tag Dinosaur>>traits.
You can [[Dismiss]] the spell.
You gain the following statistics and abilities regardless of which battle form you choose:
* AC = 18 + your level. Ignore your armor’s check penalty and Speed reduction.
* 15 temporary Hit Points.
* [[Low-Light Vision]] and [[Imprecise]] [[Scent]] 30 feet.
* One or more unarmed melee attacks specific to the battle form you choose, which are the only attacks you can use. You’re trained with them. Your attack modifier is +16, and your damage bonus is +9. These attacks are [[Strength]] based (for the purpose of the [[Enfeebled]] condition, for example). If your unarmed attack modifier is higher, you can use it instead.
* [[Athletics]] modifier of +18, unless your own modifier is higher.
You also gain specific abilities based on the form you choose:
* ''Ankylosaurus'' Speed 25 feet; Melee [one-action] tail ([[Backswing]], reach 10 feet), Damage 2d6 bludgeoning; Melee [one-action] foot, Damage 2d6 bludgeoning. //These are the ones that look like giant armadilloes.//
* ''Brontosaurus'' Speed 25 feet; Melee [one-action] tail (reach 15 feet), Damage 2d6 bludgeoning; Melee [one-action] foot, Damage 2d8 bludgeoning. //These are the big smooth vegetarian ones.//
* ''Deinonychus'' Speed 40 feet; Melee [one-action] talon ([[Agile]]), Damage 2d4 piercing plus 1 persistent bleed; Melee [one-action] jaws, Damage 1d10 piercing. //These look a bit like the velociraptors out of that movie.//
* ''Stegosaurus'' Speed 30 feet; Melee [one-action] tail (reach 10 feet), Damage 2d8 piercing. //These are the ones with the big spikes down their backs.//
* ''Triceratops'' Speed 30 feet; Melee [one-action] horn, Damage 2d8 piercing, plus 1d6 persistent bleed on a critical hit; Melee [one-action] foot, Damage 2d6 bludgeoning. //These are the ones with the rhino-like flap above their head and big horns.//
* ''Tyrannosaurus'' Speed 30 feet; Melee [one-action] jaws ([[Deadly]], reach 10 feet), Damage 1d12 piercing; Melee [one-action] tail (reach 10 feet), Damage 1d10 bludgeoning. //These are the huge ones with tiny little claws. The "Rex" being missing doesn't make any difference.//
''Heightened (5th)'' Your battle form is [[Huge]] and your attacks have 15-foot reach, or 20-foot reach if they started with 15-foot reach. You instead gain 20 temporary HP, an attack modifier of +18, a damage bonus of +6, double the damage dice, and Athletics +21.
''Heightened (7th)'' Your battle form is [[Gargantuan]] and your attacks have 20-foot reach, or 25-foot reach if they started with 15-foot reach. You instead gain AC = 21 + your level, 25 temporary HP, an attack modifier of +25, a damage bonus of +15, double the damage dice, and Athletics +25.
{{BattleFormRestrictions}}
''Key Ability'' [[Charisma]].
You influence others through negotiation and flattery.
{{||SkillActionList}}
{{||SkillFeatList}}
{{||SkillRitualList}}
Your hybrid shape is a hulking beast.
While in your hybrid shape, you gain the effects of [[Enlarge]].
You can shape the area of your composition spells.
Whenever you cast a composition spell //of which the// area is an [[Emanation]], you can change the spell’s area to a [[Cone]] 10 feet larger, to a maximum of twice the original area.
For example, you could modify a composition spell that affects a 30-foot emanation to affect a 40-foot cone, but a 5-foot emanation could only become a 10-foot cone.
You can shape the energy you channel in a single direction, reaching farther and in a more directed fashion.
When you cast a version of [[Harm]] or [[Heal]] that has an area, you can make its area a 60-foot [[Cone]] instead of a 30-foot [[Emanation]].
You can lob bombs with great force and a precise trajectory to angle the splash in a cone spraying in a single direction.
When throwing an alchemical bomb with the <<tag Splash>> trait, instead of splashing all squares adjacent to the target, you can treat the target’s space as the first affected square of a 15-foot [[Cone]] directed away from you, potentially allowing you to avoid allies and splash deeper into enemy lines.
If the target takes up more than a single square, the target’s square closest to you is the first affected square of the cone.
{{||SpellSummaryTable}}
Foes within the area are [[Frightened]] 1.
They can’t reduce their frightened value below 1 while they remain in the area.
''Requirements'' Some devices require you to use [[Thieves’ Tools]] when disabling them.
This action allows you to disarm a trap or another complex device.
Often, a device requires numerous successes before becoming disabled, depending on its construction and complexity.
Thieves’ tools are helpful and sometimes even required to Disable a Device, as determined by the GM, and sometimes a device requires a higher proficiency rank in Thievery to disable it.
Your [[Thievery]] check result determines how much progress you make. //The DC is determined by the device being disabled.//
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
You shroud a creature from others’ senses.
The target becomes [[Undetected]], not just to sight but to all senses, allowing the target to count as [[Invisible]] no matter what precise and imprecise senses an observer might have.
It’s still possible for a creature to find the target by [[Seek]]ing, looking for disturbed dust, hearing gaps in the sound spectrum, or finding some other way to discover the presence of an otherwise-undetectable creature.
''Requirements'' You have at least one hand free. The target can’t be more than one size larger than you.
You try to knock something out of an opponent’s grasp.
Attempt an [[Athletics]] check against the opponent’s [[Reflex]] DC.
{{||ActionSuccessTable}}
A weapon with the Disarm trait can be used to Disarm with the Athletics skill even if you don’t have a free hand.
This uses the weapon’s reach (if different from your own) and adds the weapon’s item bonus to attack rolls (if any) as an item bonus to the Athletics check.
If you critically fail a check to Disarm using the weapon, you can drop the weapon to take the effects of a failure instead of a critical failure.
On a critical success, you still need a free hand if you want to take the item.
You attack with enough force to knock the weapon out of your foe’s hands.
Make a melee [[Strike]]; if you hit, you can attempt an [[Athletics]] check to [[Disarm]] that foe.
''Trigger'' You [[Shield Block]] a melee [[Strike]] made with a held weapon.
You attempt to [[Disarm]] the creature whose attack you blocked of the weapon they attacked you with. You can do so even if you don’t have a hand free.
''Requirements'' You are wielding only a single one-handed melee weapon and have your other hand or hands free.
You adopt a fencing stance that improves your control over your weapon.
While you are in this stance, you gain a +1 circumstance bonus to [[Athletics]] checks to [[Disarm]] and a +2 circumstance bonus to your [[Reflex]] DC when defending against checks to [[Disarm]] you.
In addition, you can attempt to Disarm creatures up to two sizes larger than you.
''Requirements'' You are wielding only a single one-handed melee weapon and have your other hand or hands free.
After your initial attack redirects your foe’s defenses, your follow-up wrests their weapon from their grasp.
Make a melee [[Strike]] with the required weapon. In addition to its other effects, this Strike gains the success and critical success effects of the [[Disarm]] action.
The Strike also has the following failure effect: the target is [[Flat-Footed]] until the end of your current turn.
{{||SpellSummaryTable}}
Falsehoods ring in your ears like discordant notes.
You gain a +4 status bonus to [[Perception]] checks when someone [[Lie]]s.
{{||SpellSummaryTable}}
You learn the name of the target’s exact location (including the building, community, and country) and plane of existence.
You can target a creature only if you’ve seen it in person, have one of its significant belongings, or have a piece of its body.
To target an object, you must have touched it or have a fragment of it.
Discern location automatically overcomes protections against detection and divination of lower level than this spell, even if they would normally have a chance to block it.
{{||SpellSummaryTable}}
You call upon your patron’s power to better uncover secrets.
When you Cast the Spell, the target can [[Recall Knowledge]], [[Seek]], or [[Sense Motive]].
The target gains a +1 status bonus to the skill or [[Perception]] used for the roll, and this bonus remains as long as you [[Sustain the Spell|Sustain a Spell]].
The target is temporarily immune to discern secrets for 1 minute.
''Heightened (5th)'' You can target two creatures instead of one.
''Requirements'' You must have the [[Dragon Breath]] sorcerer bloodline spell.
You unleash your breath weapon without spending focus.
This has the effects of your [[Dragon Breath]] sorcerer bloodline spell, though it deals 9d6 damage instead of its usual damage, and you don’t have to cast it or spend a Focus Point.
You can’t use Disciple’s Breath again for 1d4 rounds.
Your inspire courage lets loose a discordant shriek that imbues your allies’ attacks with powerful sonic reverberations.
While your allies are affected by your [[Inspire Courage]], their weapon Strikes and unarmed attacks deal an additional 1d6 sonic damage.
You are subtle in your efforts to learn the things you need to know.
When [[Gathering Information|Gather Information]], you can hide the true subject of your inquiry among other topics of little interest to you without increasing the difficulty of the check or taking more time to Gather Information.
Anyone trying to Gather Information to determine if someone else was asking around about the topic in question must exceed your [[Deception]] DC or the normal DC to Gather Information about your inquiries, whichever is higher, or else they don’t learn of your efforts.
When a creature is exposed to a monster’s disease, it attempts a [[Fortitude]] save or succumbs to the disease.
The level of a disease is the level of the monster inflicting the disease.
The disease follows the rules for [[Affliction]]s.
Dreams are pointless illusions you seek to quash.
If you roll a success on a saving throw against an <<tag Illusion>> or <<tag Dream>> effect or a [[Perception]] check to disbelieve an illusion, you get a critical success instead.
If you roll a critical failure on any of those checks, you get a failure instead.
{{||SpellSummaryTable}}
You fire a green ray at your target.
Make a spell attack.
//On a hit, // you deal 12d10 damage, and the target must attempt a basic [[Fortitude]] save. On a critical hit, treat the save result as one degree worse.
A creature reduced to 0 HP is reduced to fine powder; its gear remains.
An object you hit is destroyed (no save), regardless of Hardness, unless it’s an artifact or similarly hard to destroy.
A single casting can destroy no more than a 10-foot cube of matter.
This automatically destroys any force construct, such as a [[Wall of Force]].
''Heightened (+1)'' The damage increases by 2d10.
''Craft Requirements'' Supply one casting of [[Disintegrate]].
Bolt.
The shaft of this bolt is scorched and blackened, and handling it coats your fingers with a fine black powder.
When an activated ({{OneAction}} <<tag Interact>>) disintegration bolt hits a target, it is subject to a [[Disintegrate]] spell requiring a DC 34 Fortitude save. As with the spell, a critical hit on the attack roll causes the target’s saving throw outcome to be one degree worse.
{{||SpellSummaryTable}}
Crackling energy disjoins the target.
You attempt to [[Counteract]] it.
If you succeed, it’s deactivated for 1 week.
On a critical success, it’s destroyed.
If it’s an artifact or similar item, you automatically fail.
{{||SpellSummaryTable}}
You touch an object, and it immediately disassembles itself into its component pieces.
The spell fails if the target lacks component pieces (such as a statue carved from one block of stone), and using it on a dangerous object like a snare or trap typically triggers it.
The object gains the [[Broken]] condition, and the component pieces become small enough to be hidden under normal clothing and armor.
You can [[Dismiss]] the spell.
When the spell ends, the object reassembles itself into its original form, appearing in your hand or hands if you have them free, or on the ground in front of you otherwise.
Once reassembled, the object loses the broken condition and its Hit Points return to the value the object had when you [[Cast the Spell|Cast a Spell]].
''Heightened (4th)'' The spell lasts for 10 minutes.
''Heightened (6th)'' The spell lasts until your next [[daily preparations|Rest]].
You end one spell effect or magic item effect.
This must be an effect you are allowed to dismiss, as defined by the spell or item.
Dismissal might end the effect entirely or might end it just for a certain target or targets, depending on the spell or item.
You use your foes’ openings to expose even greater weaknesses.
When you hit a creature as part of an [[Attack of Opportunity]], that creature becomes [[Flat-Footed]] until the start of your next turn.
{{||SpellSummaryTable}}
You unravel the magic behind a spell or effect.
Attempt a [[Counteract]] check against the target.
If you succeed against a spell effect, you counteract it.
If you succeed against a magic item, the item becomes a mundane item of its type for 10 minutes. This doesn’t change the item’s non-magical properties.
If the target is an artifact or similar item, you automatically fail.
__You cannot use Dispel Magic to remove a curse, even one that is the result of a spell.__
Your sneak attack slices through the threads binding magic to a target.
Make a [[Strike]] against a flat-footed creature (your choice).
If your Strike deals sneak attack damage, you attempt to [[Counteract]] a single spell active on the target.
Your counteract level is equal to __half your level, rounded up__, and your counteract check modifier is equal to your class DC - 10.
Made from a treated sliver of cold iron, this talisman allows you to counteract magical effects.
''Requirements'' You’re a master with the affixed weapon.
''Trigger'' Your Strike damages a target.
''Activate'' {{FreeAction}} Envision: when you activate the dispelling sliver, it attempts to [[Counteract]] a single spell active on the target (counteract modifier +29), with the effects of an 8th-level [[Dispel Magic]] spell.
If you activate the talisman on a successful [[Dispelling Slice]], the talisman attempts to counteract all spells active on the target.
{{||SpellSummaryTable}}
''Trigger'' You take damage from an enemy or a hazard.
After taking the triggering damage, you transform into air.
Until the end of the current turn, you can’t be attacked or targeted, you don’t take up space, you can’t act, and any [[Aura]]s or [[Emanation]]s you have are suppressed.
At the end of the turn, you re-form in any space you can occupy within 15 feet of where you were when you dispersed. Any auras or emanations you had are restored as long as their duration didn’t run out while you were dispersed.
Make an unarmed [[Strike]].
If it deals damage to a living creature, you block that creature’s inner life force. The creature takes 2d6 persistent negative damage and is [[Enfeebled]] 1 until the persistent damage ends.
If you’re 18th level or higher, this deals 3d6 persistent negative damage instead.
''Trigger'' Your hunted prey is within your reach, and it uses a <<tag Manipulate>> action, uses a <<tag Move>> action, or leaves a square during a move action it’s using.
Make a melee [[Strike]] against your prey.
If the attack is a critical hit, you disrupt the triggering action.
{{||SpellSummaryTable}}
You lance the target with energy.
You deal 1d6 <<tag Positive>>damage plus your spellcasting ability modifier.
The target must attempt a basic [[Fortitude]] save.
If the creature critically fails the save, it is also enfeebled 1 for 1 round.
''Heightened (+1)'' The damage increases by 1d6.
''Usage'' etched onto a melee weapon.
A disrupting weapon pulses with positive energy, dealing an extra 1d6 <<tag Positive>> damage to <<tag Undead>>.
On a critical hit, the undead is also [[Enfeebled]] 1 until the end of your next turn.
''Greater Disrupting'': Uncommon. Increase the extra damage to 2d6. On a critical hit, instead of being enfeebled 1, the undead creature must attempt a DC 34 Fortitude save with the following effects. This is an incapacitation effect.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You infuse weapons with positive energy.
Attacks with these weapons deal an extra 1d4 <<tag Positive>>damage to <<tag Undead>>.
''Heightened (3rd)'' The damage increases to 2d4 damage.
''Heightened (5th)'' Target up to three weapons, and the damage increases to 3d4 damage.
The slightest distraction can provoke your wrath, and you’re prepared to foil enemies’ actions.
As long as you are in this stance, you can use [[Attack of Opportunity]] when a creature within your reach uses a <<tag Concentrate>> action, in addition to manipulate and move actions.
Furthermore, you disrupt a triggering concentrate or manipulate action if your [[Strike]] hits (not only if it’s a critical hit).
Your Feints are far more distracting than normal, drawing your foes’ attention and allowing
you and your allies to take greater advantage.
While a creature is [[Flat-Footed]] by your [[Feint]], it also takes a –2 circumstance penalty to [[Perception]] checks and [[Reflex]] saves.
''Trigger'' You observe a target’s attitude toward yourself or your allies decrease as a result of an ally’s behavior.
You know how to maintain a good impression and manage your image, even while keeping uncouth company.
Make a [[Deception]] check against the target’s [[Will]] DC.
Regardless of your result, the target is temporarily immune to your Distracting Flattery for 10 minutes.
{{||ActionSuccessTable}}
Your performances are especially distracting, allowing your allies to Sneak away with ease.
When you [[Aid]] an ally who is trying to [[Create a Diversion]], instead of the usual effects of Aid, you can roll a [[Performance]] check and use that result to determine the outcome of the diversion, instead of the ally rolling a [[Deception]] check.
You have learned to remain hidden by using larger folk as a distraction to avoid drawing attention to yourself. You can use creatures that are at least one size larger than you (usually Medium or larger) as cover for the [[Hide]] and [[Sneak]] actions, though you still can’t use such creatures as cover for other uses, such as the [[Take Cover]] action.
The sheer power of your attacks, or the overwhelming number of them, leaves an enemy flustered.
If you critically hit your hunted prey with a ranged weapon, or hit it at least twice on the same turn with a ranged weapon, it’s [[Flat-Footed]] until the start of your next turn.
You utter a litany of dreadful names, prophecies, and descriptions of realms beyond mortal comprehension, drawn from your study of forbidden tomes and scrolls. Even those who don’t
understand your language are unsettled by these dire secrets.
Attempt an [[Occultism]] check and compare the result to the [[Will]] DC of an enemy within 30 feet, or to the Will DCs of any number of enemies within 30 feet if you are legendary in Occultism.
{{||ActionSuccessTable}}
Those creatures are temporarily immune for 24 hours.
''Prerequisites'' Expert in unarmored defense or one or more types of armor.
Your proficiency ranks for light armor, medium armor, heavy armor, and unarmored defense increase to expert.
You have broadened your understanding of the divine and can tap into the wonders of a different mystery.
Select one revelation spell from a mystery other than your own. You can choose only an initial revelation spell or an advanced revelation spell.
When you cast this revelation spell, you gain the effects of the minor curse from that mystery in addition to the normal curse effects you gain from casting a revelation spell. This additional minor curse effect remains until your next daily preparations.
Any ability that lets you cast a revelation spell without increasing the severity of your curse also prevents you from gaining this additional curse effect.
You can’t cast your chosen revelation spell if any of the following conditions are true:
* its mystery’s curse effects directly conflict with or negate the effects of your own mystery’s curse;
* the curse would have no effect on you (for example, removing an ability from your original mystery that you lack);
* either of these criteria would be met once you finish Casting the Spell.
''Prerequisite'' Expert in any kind of weapon or unarmed attack
Your proficiency ranks for simple weapons and martial weapons increase to expert, and your proficiency rank for advanced weapons increases to trained.
''Requirements'' Your most recent action was to cast a non-cantrip spell.
You transfer vestiges of magical energy to the air around you, creating a vortex that deflects ranged attacks.
Until the start of your next turn, you gain a +1 status bonus to AC against ranged weapon attacks and physical ranged unarmed attacks.
Divinations allow you to learn the secrets of the present, past, and future. They bestow good fortune, grant you the ability to perceive remote locations, and reveal secret knowledge.
Divinations often have the <<tag Detection>>trait if they find something, the <<tag Prediction>>trait if they grant you insight about what might happen in the future, the <<tag Revelation>>trait if they show things as they truly are, or the <<tag Scrying>>trait if they let you perceive another location.
<<schoolspelllist Divination>>
The power of the divine is steeped in faith, the unseen, and belief in a power source from beyond the Material Plane.
[[Cleric]]s are the most iconic divine spellcasters, beseeching the gods to grant them their magic. Divine [[Sorcerer]]s can use the blood of their celestial or fiendish ancestors as a divine conduit, and [[Champion]]s call upon their gods to grant them martial prowess through divine guidance.
Divine spells are identified using [[Religion]].
<<schoolspelllist Divine>>
Your ability to tap into divine magic surpasses the spells traditionally available to you (the divine spell list).
Choose one deity who grants one of your mystery’s granted domains. Add up to three cleric spells of your choice granted by that deity to your spell list. You can select from these spells when you add or swap spells in your spell repertoire.
''Special'' You can select this feat more than once. You can’t choose the same spells more than once, but you can choose a different domain or a different deity with the same domain you’ve previously selected with this feat.
You summon divine energy to shield yourself, offering protection against other traditions but leaving you exposed to other divine effects.
Until the beginning of your next turn, you gain a +1 circumstance bonus to saving throws against non-divine magical effects, but you also take a –1 circumstance penalty to saves against divine effects.
Your devotion attracts a spirit of your deity’s alignment.
Once you choose an ally, your choice can’t be changed.
The following are divine allies:
* ''Blade Ally'': A spirit of battle dwells within your __armaments__. Select one weapon __or [[Handwraps of Mighty Blows]]__ when you make your daily preparations. In your hands, the weapon gains the effect of a property rune. For a champion following the tenets of good, choose [[Disrupting]], [[Ghost Touch]], [[Returning]], or [[Shifting]]. You also gain the weapon’s critical specialization effect. For a champion following the tenets of evil, you can choose [[Fearsome]], [[Returning]] or [[Shifting]].
* ''Shield Ally'': A spirit of protection dwells within your shield. In your hands, the shield’s Hardness increases by 2 and its HP and BT increase by half.
* ''Steed Ally'': You gain a young animal companion as a mount. Ordinarily, your animal companion is one that has the mount special ability, such as a horse. You can select a different animal companion (GM’s discretion), but this ability doesn’t grant it the mount special ability.
You gain a [[Divine Ally]] of your choice.
{{||SpellSummaryTable}}
Divine power wards the targets, granting each a +1 status bonus to [[AC]] and saves while in the area.
Choose an alignment your deity has (<<tag Chaotic>>, <<tag Evil>>, <<tag Good>>, or <<tag Lawful>>). You can’t cast this spell if you don’t have a deity or your deity is true neutral. This spell gains the trait of the alignment you chose.
The bonuses granted by the spell increase to +2 against attacks by—and effects created by—creatures with an alignment opposite to the spell (lawful if you chose chaotic, evil if you chose good).
These bonuses increase to +4 against effects created by such creatures that attempt to impose the [[Controlled]] condition on a target of your divine aura, as well as against attacks made by creatures summoned by anything opposite in alignment to your divine aura.
When a creature of opposite alignment hits a target with a melee attack, the creature must succeed at a [[Will]] save or be [[Blinded]] for 1 minute. It’s then temporarily immune for 1 minute.
The first time you [[Sustain the Spell|Sustain a Spell]] each round, the divine aura’s radius grows 10 feet.
You can cast more divine spells each day.
Increase the spell slots you gain from cleric archetype feats by 1 for each spell level other than your two highest spell levels.
You’ve studied your celestial heritage with the intent of better defending yourself, and you’ve found that your techniques are equally powerful against celestials, fiends, and other divine entities.
You gain a +1 circumstance bonus to all saving throws against <<tag Divine>> effects.
{{||SpellSummaryTable}}
You utter a potent litany from your faith, a mandate that harms those who oppose your ideals.
Choose an alignment your deity has (<<tag Chaotic>>, <<tag Evil>>, <<tag Good>>, or <<tag Lawful>>). You can’t cast this spell if you don’t have a deity or your deity is true neutral. This spell gains the trait of the alignment you chose.
You deal 7d10 damage to creatures in the area; each creature must attempt a [[Fortitude]] save.
Creatures with an alignment that matches the one you chose are unaffected by the spell.
Those that neither match nor oppose it treat the result of their saving throw as one degree better and don’t suffer effects other than damage.
''Heightened (+1)'' The damage increases by 1d10, and the level of creatures that must attempt a second save on a critical failure increases by 2.
{{||SaveSuccessTable}}
//The "effect of a failed Banishment save" is normally just to banish the target. This refers only to special reactions the creature may have to such a thing.//
Your training and your deity protect you from harm.
Your proficiency rank in unarmored defense increases to expert.
The power of your mystery surges through you like a font of divine energy, even when your own magic dwindles.
Twice per day, you can cast a spell after you’ve run out of spell slots of the appropriate spell level; the two spells you cast with this feat must be of different spell levels.
''Prerequisites'' bloodline that grants divine spells
The divine might provided by your bloodline flows through you.
You gain an additional spell slot of your highest level, which you can use only to cast your choice of [[Heal]] or [[Harm]].
You can cast either of these spells using that spell slot, even if they aren’t in your spell repertoire.
Through your deity’s blessing, you gain additional spells that channel either the life force called positive energy or its counterforce, negative energy.
When you prepare your spells each day, you can prepare additional [[Heal]] or [[Harm]] spells, depending on your deity. The divine font spell your deity provides is listed in the Divine Font entry for your deity on pages 437–440 of the Core Rulebook //(and not reproduced here because the Lost Omens deities are not Open Game Content)//; if both are listed, you can choose between heal or harm.
Once you choose, you can’t change your choice short of an ethical shift or divine intervention.
''Healing Font'': You gain additional spell slots each day at your highest level of cleric spell slots. You can prepare only [[Heal]] spells in these slots, and the number of slots is equal to 1 plus your [[Charisma]] modifier.
''Harmful Font'': You gain additional spell slots each day at your highest level of cleric spell slots. You can prepare only [[Harm]] spells in these slots, and the number of slots is equal to 1 plus your [[Charisma]] modifier.
''Trigger'' You attempt a save against a spell, before you roll.
You call upon your deity’s grace, gaining a +2 circumstance bonus to the save.
''Prerequisites'' Legendary in [[Religion]].
You’re so immersed in divine scripture that you find meaning and guidance in your texts in any situation.
Spend 10 minutes [[Deciphering Writing|Decipher Writing]] on religious scriptures of your deity or philosophy while thinking about a particular problem or conundrum you face, and then attempt a Religion check (DC determined by the GM).
If you succeed, you unearth a relevant passage, parable, or aphorism that can help you move forward or change your thinking to help solve your conundrum.
For example, the GM might provide you with a cryptic poem or hint that can guide you to the next step of solving your problem.
Your faith makes you resistant to disease, protecting you as you offer succor to the ill.
You gain a +1 status bonus to saves against diseases.
In addition, if you roll a success on a save against a disease, you get a critical success instead.
{{||SpellSummaryTable}}
You infuse a target with spiritual energy, refreshing its magic.
If it prepares spells, it recovers one 6th-level or lower spell it previously cast today and can cast that spell again.
If it spontaneously casts spells, it recovers one of its 6th-level or lower spell slots.
If it has a focus pool, it regains its Focus Points, as if it had [[Refocus]]ed.
{{||SpellSummaryTable}}
You unleash a beam of divine energy.
Choose an alignment your deity has (<<tag Chaotic>>, <<tag Evil>>, <<tag Good>>, or <<tag Lawful>>). You can’t cast this spell if you don’t have a deity or if your deity is true neutral. The spell gains the trait of the alignment you chose.
Make a ranged spell attack roll against the target’s [[AC]].
On a hit, the target takes damage of the chosen alignment type equal to 1d4 + your spellcasting ability modifier (double damage on a critical hit).
''Heightened (+1)'' The damage increases by 1d4.
{{||SpellSummaryTable}}
Your deity sends wracking plagues.
The target must attempt a [[Fortitude]] save.
When you Cast the Spell, decide whether the disease inflicts the [[Clumsy]], [[Enfeebled]], or [[Stupefied]] condition.
{{||SaveSuccessTable}}
''Divine Plague (disease)'' Level 1; ''Stage 1'' //Your chosen condition// 1 (1 round); Stage 2 [[Slowed]] 1 and //your chosen condition// 1 (1 round); Stage 3 //Your chosen condition// 1 and the target can’t recover from the condition until they are cured (1 day)
''Heightened (5th)'' The divine plague disease gains the [[Virulent]] trait. The condition value for the clumsy, enfeebled, or stupefied condition is 2 instead of 1.
At the start of each of your turns, you gain an additional reaction that you can use only for your champion’s reaction.
{{||SpellSummaryTable}}
You accept otherworldly energies into your body; while you are still recognizably yourself, you gain the features of one of your deity’s servitors.
Choose an alignment your deity has (<<tag Chaotic>>, <<tag Evil>>, <<tag Good>>, or <<tag Lawful>>). You can’t cast this spell if you don’t have a deity or your deity is true neutral. This spell gains the trait of the alignment you chose.
If you were <<tag Medium>> or smaller, you become <<tag Large>>, as the effects of [[Enlarge]]. You must have space to expand into, or the spell is lost.
You also gain the following benefits.
* 40 temporary Hit Points.
* A [[Fly]] Speed equal to your Speed.
* [[Weakness]] 10 to the alignment opposite the one you chose. //(Not really a "benefit", but..)//
* A +1 status bonus to saves against spells.
* Darkvision.
* Your unarmed attacks and weapons deal 1 additional damage of the chosen alignment type.
* One or more unarmed melee attacks.
If you chose good or lawful, your fist attacks deal 2d8 damage.
If you chose chaotic, you gain a bite unarmed attack that deals 2d10 piercing damage.
If you chose evil, you gain a claws unarmed attack that deals 2d8 slashing damage and has the <<tag Agile>>and <<tag Finesse>>traits.
''Heightened (9th)'' The temporary Hit Points increase to 60, the weakness increases to 15, and the duration increases to 10 minutes.
''Requirements'' You are wielding a shield.
You use your shield to harry your enemies, preventing them from stepping away from or around you.
All spaces adjacent to you are [[Difficult Terrain]] for your enemies.
''Frequency'' once per turn.
''Trigger'' You finish [[Casting a Spell|Cast a Spell]] using one of your divine spell slots on your turn.
You siphon residual spell energy into a weapon you’re wielding.
Until the end of your turn, the weapon deals an additional 1d4 force damage.
You can instead deal an additional 1d6 damage of an alignment type that matches one of your deity’s alignment components. As usual for aligned damage, this can damage only creatures of the opposite alignment.
Your faith grants mastery of your will.
Your proficiency rank for [[Will]] saves increases to master.
When you roll a success on a [[Will]] save, you get a critical success instead.
{{||SpellSummaryTable}}
You can channel the fury of your deity against foes of opposed alignment.
Choose an alignment your deity has (<<tag Chaotic>>, <<tag Evil>>, <<tag Good>>, or <<tag Lawful>>). You can’t cast this spell if you don’t have a deity or your deity is true neutral. This spell gains the trait of the alignment you chose.
You deal 4d10 damage of the alignment you chose; each creature in the area must attempt a [[Fortitude]] save.
Creatures that match the alignment you chose are unaffected.
Those that neither match nor oppose it treat the result of their saving throw as one degree better.
{{||SaveSuccessTable}}
You sense magical dangers.
When using the [[Detect Magic]] exploration activity, you can roll initiative twice and use the better result so long as at least one opponent has a magical effect or magic item and is in range of your detect magic.
{{||SpellSummaryTable}}
You glimpse into the target’s future.
Roll a d20; when the target attempts a non-<<tag Secret>> saving throw or skill check, it can use the number you rolled instead of rolling, and the spell ends.
Alternatively, you can instead reveal the result of the die roll for one of the target’s secret checks during the duration, and the spell ends.
Casting it again ends any active diviner’s sight you have cast, as well as any active diviner’s sight on the target.
The magic of djinn runs through your blood.
You can cast [[Gust of Wind]] and [[Invisibility]] once per day each as 2nd-level arcane innate spells.
You move to provide immediate care to those who need it.
[[Stride]], then use one of the following: [[Battle Medicine]] or [[Treat Poison]].
You can spend a second action to instead Stride and then [[Administer First Aid]] or [[Treat Condition]] (if you have it).
''Trigger'' You are the target of a melee attack.
''Requirements'' You’re aware of the attack and aren’t [[Flat‑Footed]].
You use your acrobatic prowess to evade an attack, using momentum to keep yourself moving, if you choose.
You gain a +1 circumstance bonus to AC against the triggering attack.
If the attack misses you, you can [[Step]] after the [[Strike]].
If you’re a master in [[Acrobatics]], you can move 10 feet on this Step instead of 5 feet.
''Trigger'' You take damage from an area effect that allows a [[Reflex]] save.
You dodge a blow at the last possible moment.
You [[Step]] and gain resistance to all damage equal to your level against the triggering effect.
If your Step moves you out of the triggering effect’s area, this resistance is instead equal to your level plus your [[Dexterity]] modifier.
You can swing your beak to slash your foes when piercing attacks won’t do.
Your beak unarmed attack gains the versatile S weapon trait.
Your beak unarmed attack gains the deadly d8 trait.
<table>
<$list filter="[tag[Domain]sort[]]">
<tr><th><<currentTiddler>></th><td>{{!!dom-desc}}</td>
<td><$list filter="[tag[Spell]field:m-domain<currentTiddler>field:m-level[1]]"><$link /> </$list> </td>
<td><$list filter="[tag[Spell]field:m-domain<currentTiddler>field:m-level[4]]"><$link /> </$list> </td></tr>
</$list>
</table>
Every oracle’s mystery touches on a divine domain of the deities that fuel it; you can access that power.
Choose one of the domains associated with your mystery for which you don’t already have an initial domain spell. You gain an initial domain spell from that domain, which you cast as a revelation spell. It gains the <<tag Cursebound>> trait.
Increase the number of Focus Points in your focus pool by 1.
You command a deep understanding of the divine domains related to your mystery.
Choose one of the domains associated with your mystery for which you have an initial domain spell.
You gain an advanced domain spell from that domain, which you cast as a revelation spell, causing it to gain the <<tag Cursebound>> trait.
Increase the number of Focus Points in your focus pool by 1.
''Prerequisites'' one or more domain spells
Your devotion to your deity’s domains grows greater, and so does the power granted to you.
If you have spent at least 2 Focus Points since the last time you Refocused, you recover 2 Focus Points when you [[Refocus]] instead of 1.
Your deity bestows a special spell related to their powers.
Select one [[Domain]]—a subject of particular interest to you within your religion—from your deity’s list.
You gain an initial domain spell for that domain, a spell unique to the domain and not available to other clerics.
Domain spells are a type of focus spell. It costs 1 Focus Point to cast a focus spell, and you start with a focus pool of 1 Focus Point. You refill your focus pool during your daily preparations, and you can regain 1 Focus Point by spending 10 minutes using the [[Refocus]] activity to pray to your deity or do service toward their causes.
Focus spells are automatically heightened to half your level rounded up.
Focus spells don’t require spell slots, nor can you cast them using spell slots.
Certain feats can give you more focus spells and increase the size of your focus pool, though your focus pool can never hold more than 3 Focus Points.
''Special'' You can select this feat multiple times, selecting a different domain each time and gaining its domain spell.
The intensity of your focus grows from the investment you’ve placed in your domains.
If you have spent at least 3 Focus Points since the last time you [[Refocus]]ed, you recover 3 Focus Points when you Refocus instead of 1.
{{!!dom-desc}}
''Basic Domain Spell:'' <$list filter="[tag[Spell]field:m-domain<currentTiddler>field:m-level[1]]"><$link /></$list>
''Advanced Domain Spell:'' <$list filter="[tag[Spell]field:m-domain<currentTiddler>field:m-level[4]]"><$link /></$list>
{{||SpellSummaryTable}}
You take command of the target, forcing it to obey your orders.
The effect depends on its [[Will]] save.
If you issue an obviously self-destructive order, the target doesn’t act until you issue a new order.
//This does not give the target the Controlled status.//
''Heightened (10th)'' The duration is unlimited.
{{||SaveSuccessTable}}
A powerful force has gripped your soul, calling you closer to death.
Doomed always includes a value. The [[Dying]] value at which you die is reduced by your doomed value.
If your maximum dying value is reduced to 0, you instantly die.
When you die, you’re no longer doomed.
Your doomed value decreases by 1 each time you get a full night’s rest.
{{||SpellSummaryTable}}
Striking at thin air, you create hairline cracks in an unoccupied adjacent space that lead somewhere outside reality. Air rushes through the cracks, drawing Large or smaller creatures and objects of light Bulk or less toward the center.
Large or smaller creatures in the area must attempt a [[Fortitude]] save at the start of their turn; creatures that move into the area must attempt the save on entering.
{{||SaveSuccessTable}}
The cracks of the door to beyond are too thin for anything to fully slip through, but decompressive effects deal 4d6 slashing damage to any creature or object that ends its turn in the door’s space.
You are unaffected by your own door to beyond.
You can [[Dismiss]] the spell.
''Heightened (+1)'' The damage increases by 1d6.
You know your formulas so well that you can concoct two items at once.
When using the [[Quick Alchemy]] action, instead of spending one batch of infused reagents to create a single item, you can spend up to two batches of infused reagents to make up to two alchemical items as described in that action.
These items do not have to be the same.
Your opportunistic attacks are particularly detrimental.
When you use [[Debilitating Strike]], you can apply two debilitations simultaneously; removing one removes both.
You can focus on two foes at once, hunting both of them down.
When you use the [[Hunt Prey]] action, you can pick two creatures as your prey.
''Requirements'' You are wielding a ranged weapon with reload 0.
You shoot twice in blindingly fast succession.
Make two [[Strike]]s, each against a separate target and with a –2 penalty.
Both attacks count toward your multiple attack penalty, but the penalty doesn’t increase until after you’ve made both of them.
''Requirements'' You are wielding two melee weapons, each in a different hand.
You lash out at your foe with both weapons.
Make two [[Strikes]], one with each of your two melee weapons, each using your current multiple attack penalty.
Both Strikes must have the same target.
If the second Strike is made with a weapon that doesn’t have the [[Agile]] trait, it takes a –2 penalty.
If both attacks hit, combine their damage, and then add any other applicable effects from both weapons. Combine the damage from both Strikes and apply resistances and weaknesses only once.
You add any precision damage only once, to the attack of your choice.
This counts as two attacks when calculating your multiple attack penalty.
You are skilled at saying one thing while meaning something different.
You disguise your true meaning behind other words and phrases, relying on subtle emphasis and shared experience to convey meaning that only your allies understand.
Any allies who have traveled alongside you for at least 1 full week automatically discern your meaning.
Other observers must succeed at a [[Perception]] check against your [[Deception]] DC to realize you are passing a secret message, and they must critically succeed to understand the message itself.
{{||SpellSummaryTable}}
You call forth a torrential downpour, which extinguishes nonmagical flames.
Creatures in the area are [[Concealed]] and gain <<tag Fire>> resistance 10.
Creatures outside the area are [[Concealed]] to those inside the area.
Creatures with [[Weakness]] to water that end their turns in the area take damage equal to their weakness.
''Heightened (+1)'' The fire resistance increases by 2.
Your inborn arcane power manifests as your exemplar’s most time-honored spells.
Choose one 1st-level spell and one 2nd-level spell from those listed for a dragon spellcaster of your draconic exemplar’s type.
You can cast each of these spells once per day as arcane innate spells.
You gain the trained proficiency rank in arcane spell attack rolls and spell DCs, and your key spellcasting ability is [[Charisma]].
| !Dragon | !1st | !2nd |
| Black | [[Alarm]], [[Ray of Enfeeblement]], [[True Strike]] | [[Blur]], [[Glitterdust]], [[Invisibility]] |
| Blue | [[Alarm]], [[Charm]], [[Unseen Servant]] | [[Dispel Magic]], [[Invisibility]], [[Mirror Image]] |
| Green | [[Illusory Object]], [[True Strike]], [[Ventriloquism]] | [[Humanoid Form]], [[Mirror Image]], [[See Invisibility]] |
| Red | [[Charm]], [[Ray of Enfeeblement]], [[True Strike]] | [[Comprehend Language]], [[Resist Energy]], [[See Invisibility]] |
| White | [[Ray of Enfeeblement]], [[True Strike]] | [[Dispel Magic]], [[Invisibility]], [[Resist Energy]] |
| Brass | [[Alarm]], [[Sleep]], [[Ventriloquism]] | [[Humanoid Form]], [[Mirror Image]], [[Resist Energy]] |
| Bronze | [[Alarm]], [[Hydraulic Push]], [[True Strike]] | [[Comprehend Language]], [[Mirror Image]], [[Resist Energy]] |
| Copper | [[Fleet Steep]], [[Illusory Object]], [[Magic Aura]] | [[Glitterdust]], [[Invisibility]], [[See Invisibility]] |
| Gold | [[Alarm]], [[Mending]], [[Protection]], [[Spirit Link]] | [[Restoration]], [[Resist Energy]], [[See Invisibility]], [[Silence]] |
| Silver | [[Alarm]], [[Bless]], [[Protection]], [[True Strike]] | [[Augury]], [[Calm Emotions]], [[Restoration]], [[See Invisibility]] |
Few can sway you from your goals while the fury of combat fills you.
While raging, you gain a +2 status bonus to saving throws against <<tag Emotion>> effects.
{{||SpellSummaryTable}}
You shape energy into one [[Incorporeal]] tiny dragon (or serpentine creature) that flits around you.
The specific dragon is random; roll 1d6 on the table below for each dragon evoked to determine which type of dragon you create.
| !D6 | !Dragon | !Breath Strike Type |
|1 |Copper or black |<<tag Acid>> |
|2 |Silver or white |<<tag Cold>> |
|3 |Bronze or blue |<<tag Electricity>> |
|4 |Brass, gold, or red |<<tag Fire>> |
|5 |Green |<<tag Poison>> |
|6 |Your choice of dragon |As the dragon |
While the spell persists, you can command one of your dragons to spit a missile of energy at a creature within 60 feet by using a single action, which has the <<tag Concentrate>> trait. This is a ranged [[Strike]] that uses your spell attack bonus and deals 1d6 damage plus your spellcasting ability modifier, with the damage type depending on the dragon.
A dragon’s breath Strike uses and contributes to your multiple attack penalty.
Once a dragon has used its breath Strike, it winks out of existence; when you have no dragons remaining, the spell ends.
''Heightened (+1)'' You shape 1 additional dragon, and the Strike damage increases by 1d6.
You draw minor powers from your draconic exemplar.
Choose a type of chromatic or metallic dragon to be your exemplar. This determines your scale color and appearance, and dragons sometimes look more favorably upon those kobolds who resemble them, at the GM’s discretion.
Your exemplar may also determine details of other abilities you have, using the Draconic Exemplars table.
{{KoboldDragonTable}}
Your sense of smell is uncanny, much like a dragon’s.
You gain imprecise [[Scent]] with a range of 30 feet.
The GM might double the range if you’re downwind from the creature or halve the range if you’re upwind, at their discretion.
You have an affect that dragonkind find unusually pleasing—and when that fails, you know when to duck.
You gain a +2 circumstance bonus to [[Perception]] checks and saving throws against dragons.
In addition, whenever you meet a creature with the <<tag Dragon>> trait in a social situation, you can attempt a [[Diplomacy]] check to [[Make an Impression]] on that creature immediately, rather than after conversing for 1 minute; you take a –5 penalty to this check. If you fail, you can choose to engage in 1 minute of conversation and then attempt a new check rather than accept the failure or critical failure result.
''Special'' If you have the [[Glad-Hand]] skill feat, you don’t take the penalty to your immediate Diplomacy check if the target has the dragon trait.
While swimming in water at least 10 feet deep, you grab an adjacent creature (on nearby land or in the water) and pull it below the surface.
Attempt an [[Athletics]] check to [[Grapple]] the creature.
On a success, if the creature is on land, in addition to the normal effects of Grapple, you pull the creature into the water in a space adjacent to you.
If the creature is already in the water, on a success, in addition //to// the normal effects of Grapple, you drag the creature 10 feet deeper into the water, moving 10 feet with the creature.
Moving a creature into water or deeper into water using Drag Down is forced movement for the creature but not for you.
You aim your weapon to snag a foe’s armor, clothing, or flesh to pull them closer.
Make a melee [[Strike]].
If you hit a target that is your size or smaller, that creature is [[Flat-Footed]] until the end of your current turn, and you can move it 5 feet toward you.
When you move the creature, you can move the same distance in the same direction as it, even if you’re adjacent to the target.
This movement doesn’t trigger reactions.
This Strike has the following failure effect: the target becomes [[Flat-Footed]] until the end of your current turn.
Dragons are reptilian creatures, often winged or with the power of flight.
Most are able to use a breath weapon and are immune to sleep and the [[Paralyzed]] condition.
''Prerequisites'' ability to cast spells from spell slots.
You’ve discovered how to add the magic of dragons to your tradition.
Add the [[draconic bloodline|Draconic (Bloodline)]]’s granted spells to your spell list; you must still learn them or add them to your repertoire as normal.
A mix of digestive juices and green dragon poison glands nauseates the victim as its flesh is digested from within.
| !Saving Throw |DC 37 [[Fortitude]] |
| !Onset |1 minutes |
| !Maximum Duration |6 rounds |
| !Stage 1 |6d6 poison damage and [[Sickened]] 2 (1 round) |
| !Stage 2 |7d6 poison damage and [[Sickened]] 3 (1 round) |
| !Stage 3 |9d6 poison damage and [[Sickened]] 4 (1 round) |
{{||SpellSummaryTable}}
You spew energy from your mouth, dealing 5d6 damage.
The area, damage type, and //basic// save depend on the dragon type in your bloodline.
| !Dragon Type | !Area and Damage Type | !Saving Throw |
|Black or copper |60-foot [[Line]] of <<tag Acid>> |Reflex |
|Blue or bronze |60-foot [[Line]] of <<tag Electricity>> |Reflex |
|Brass |60-foot [[Line]] of <<tag Fire>> |Reflex |
|Green |30-foot [[Cone]] of <<tag Poison>> |Fortitude |
|Gold or red |30-foot [[Cone]] of <<tag Fire>> |Reflex |
|Silver or white |30-foot [[Cone]] of <<tag Cold>> |Reflex |
''Heightened (+1)'' The damage increases by 2d6.
{{||SpellSummaryTable}}
Vicious claws grow from your fingers.
They are [[Finesse]] [[Unarmed]] attacks that deal 1d4 slashing damage and 1d6 extra damage of a type determined by the dragon in your bloodline.
| !Dragon | !Damage Type |
|Black or Copper |<<tag Acid>> |
|Blue or Bronze |<<tag Electricity>> |
|Brass, Gold, or Red |<<tag Fire>> |
|Silver or White |<<tag Cold>> |
|Green |<<tag Poison>> |
Your scales from blood magic glow with faint energy, giving you resistance 5 to the same damage type.
''Heightened (5th)'' The extra damage increases to 2d6, and the resistance increases to 10.
''Heightened (9th)'' The extra damage increases to 3d6, and the resistance increases to 15.
''Access'' You are a kobold with the [[dragonscaled|Dragonscaled Kobold]] or [[spellscale|Spellscale Kobold]] heritage, a [[Dragon Instinct]] barbarian, or a [[Draconic Bloodline|Draconic (Bloodline)]] sorcerer.
You choose to study or worship one type of dragon, and your focus grants you a measure of its power.
Choose one color of dragon when you select this feat; if you are a sorcerer with the draconic bloodline, this must be the same type as your bloodline.
You gain resistance equal to half your level against one type of damage determined by the chosen dragon type.
The GM may allow you to choose a dragon type not listed below, and will determine the damage type appropriate for that dragon.
| !Dragon Type | !Element Resisted |
| Black or Copper | <<tag Acid>> |
| Blue or Bronze | <<tag Electricity>> |
| Brass, Gold, or Red | <<tag Fire>> |
| Green | <<tag Poison>> |
| Silver or White | <<tag Cold>> |
You also gain a +1 circumstance bonus to saving throws against <<tag Sleep>> effects and effects that would make you [[Paralyzed]].
''Special'' If you later take the Sorcerer archetype, you must choose the draconic bloodline.
<<archetypefeatlist "4 8 12 14 16 18" "[[Dragon Disciple]]">>
{{||SpellSummaryTable}}
Calling upon powerful transformative magic, you gain a <<tag Large>> dragon battle form. You must have space to expand or the spell is lost.
When you cast this spell, choose one type of chromatic or metallic dragon. While in this form, you gain the <<tag Dragon>> trait. You have hands in this battle form and can take <<tag Manipulate>> actions.
You can [[Dismiss]] the spell.
//The special statistics of a battle form can be adjusted only by circumstance bonuses, status bonuses, and penalties.
You can't cast spells, or speak, in your battle form.
Your gear is absorbed into you; the constant abilities of your gear still function, but you can’t activate any items.//
You gain the following statistics and abilities regardless of which battle form you choose:
* [[AC]] = 18 + your level. Ignore your armor’s check penalty and Speed reduction.
* 10 temporary [[Hit Points]].
* [[Speed]] 40 feet, [[Fly]] Speed 100 feet.
* [[Resistance]] 10 against the damage type of your breath weapon (see below).
* [[Darkvision]] and imprecise [[Scent]] 60 feet.
* One or more unarmed melee attacks specific to the battle form you choose, which are the only attacks you can use. You’re trained with them. Your attack modifier is +22, and your damage bonus is +6. These attacks are [[Strength]] based (for the purpose of the [[Enfeebled]] condition, for example). If your unarmed attack modifier is higher, you can use it instead. See below for more on these attacks.
* [[Athletics]] modifier of +23, unless your own modifier is higher.
* ''Breath Weapon'' {{TwoAction}} (<<tag Arcane>>, <<tag Evocation>>) The shape, damage, and damage type of your breath weapon depend on your specific dragon form (see below). A creature in the area attempts a basic save against your spell DC. This is a [[Reflex]] save unless stated otherwise in the special ability description for your specific dragon form. Once activated, your breath weapon can’t be used again for 1d4 rounds. Your breath weapon has the trait corresponding to the type of damage it deals.
You also gain specific abilities based on the type of dragon
you choose:
* ''Black'' swim Speed 60 feet;
** Melee {{OneAction}} jaws, Damage 2d12 piercing plus 2d6 acid;
** Melee {{OneAction}} claw (<<tag Agile>>), Damage 3d10 slashing;
** Melee {{OneAction}} tail (reach 10 feet), Damage 3d10 bludgeoning;
** Melee {{OneAction}} horns (reach 10 feet), Damage 3d8 piercing;
** Breath weapon 60-foot line, 11d6 acid.
* ''Blue'' burrow Speed 20 feet;
** Melee {{OneAction}} jaws, Damage 2d10 piercing plus 1d12 electricity;
** Melee {{OneAction}} claw (<<tag Agile>>), Damage 3d10 slashing;
** Melee {{OneAction}} tail (reach 10 feet), Damage 3d10 bludgeoning;
** Melee {{OneAction}} horns (reach 10 feet), Damage 3d8 piercing;
** Breath weapon 80-foot line, 6d12 electricity.
* ''Green'' swim Speed 40 feet, ignores difficult terrain from non-magical foliage;
** Melee {{OneAction}} jaws, Damage 2d12 piercing plus 2d6 poison;
** Melee {{OneAction}} claw (agile), Damage 3d10 slashing;
** Melee {{OneAction}} tail (reach 10 feet), Damage 3d10 bludgeoning;
** Melee {{OneAction}} horns (reach 10 feet), Damage 3d8 piercing;
** Breath weapon 30-foot cone, 10d6 poison ([[Fortitude]] save instead of Reflex).
* ''Red'' ignore concealed from smoke;
** Melee {{OneAction}} jaws, Damage 2d12 piercing plus 2d6 fire;
** Melee {{OneAction}} claw (agile), Damage 4d6 slashing;
** Melee {{OneAction}} tail (reach 10 feet), Damage 3d10 bludgeoning;
** Melee {{OneAction}} wing (reach 10 feet), Damage 3d8 bludgeoning;
** Breath weapon 30-foot cone, 10d6 fire.
* ''White'' climb Speed 25 feet on ice only;
** Melee {{OneAction}} jaws, Damage 3d6 piercing plus 2d6 cold;
** Melee {{OneAction}} claw (agile), Damage 3d10 slashing;
** Melee {{OneAction}} tail (reach 10 feet), Damage 3d10 bludgeoning;
** Breath weapon 30‑foot cone, 10d6 cold.
* ''Brass'' burrow Speed 20 feet;
** Melee {{OneAction}} jaws, Damage 3d8 piercing plus 2d4 fire;
** Melee {{OneAction}} claw (agile), 3d10 slashing;
** Melee {{OneAction}} tail (reach 10 feet), Damage 3d10 bludgeoning;
** Melee {{OneAction}} spikes (reach 10 feet), Damage 3d8 piercing;
** Breath weapon 60-foot line, 15d4 fire.
* ''Bronze'' swim Speed 40 feet;
** Melee {{OneAction}} jaws, Damage 2d10 piercing plus 1d12 electricity;
** Melee {{OneAction}} claw (agile), Damage 3d10 slashing;
** Melee {{OneAction}} tail (reach 10 feet), Damage 3d10 bludgeoning;
** Melee {{OneAction}} wing (reach 10 feet), Damage 3d8 slashing;
** Breath weapon 80-foot line, 6d12 electricity.
* ''Copper'' climb Speed 25 feet on stone only;
** Melee {{OneAction}} jaws, Damage 2d12 piercing plus 2d6 acid;
** Melee {{OneAction}} claw (agile), Damage 3d10 slashing;
** Melee {{OneAction}} tail (reach 10 feet), Damage 3d10 bludgeoning;
** Melee {{OneAction}} wing (reach 10 feet), Damage 3d8 bludgeoning;
** Breath weapon 60-foot line, 10d6 acid.
* ''Gold'' swim Speed 40 feet;
** Melee {{OneAction}} jaws, Damage 2d12 piercing plus 2d6 fire;
** Melee {{OneAction}} claw (agile), Damage 4d6 slashing;
** Melee {{OneAction}} tail (reach 10 feet), Damage 3d10 bludgeoning;
** Melee {{OneAction}} horns (reach 10 feet), Damage 3d8 piercing;
** Breath weapon 30-foot cone, 6d10 fire.
* ''Silver'' walk on clouds;
** Melee {{OneAction}} jaws, Damage 2d12 piercing plus 2d6 cold;
** Melee {{OneAction}} claw (agile), Damage 3d10 slashing;
** Melee {{OneAction}} tail (reach 10), Damage 3d10 bludgeoning;
** Breath weapon 30-foot cone, 8d8 cold.
''Heightened (8th)'' Your battle form is <<tag Huge>>, you gain a +20‑foot status bonus to your fly Speed, and your attacks have 10-foot reach (or 15-foot reach if they previously had 10 foot reach). You instead gain AC = 21 + your level, 15 temporary HP, an attack modifier of +28, a damage bonus of +12, Athletics +28, and a +14 status bonus to breath weapon damage.
//As written there are no alignment restrictions on the type of dragon you choose.//
Your hold has a unique draconic connection.
You gain a +2 circumstance bonus when you attempt to [[Make an Impression]] on a creature with the <<tag Dragon>> trait.
You gain access to the [[Riding Drake]] animal companion.
You summon the fury of a mighty dragon and manifest incredible abilities. Perhaps your culture reveres draconic majesty, or you gained your connection by drinking or bathing in dragon’s blood or after watching a marauding wyrm burn your village.
Chromatic dragons tend to be evil, and metallic dragons tend to be good.
| !Dragon | !Type | !Breath Weapon |
|Black |Chromatic |[[Line]] of <<tag Acid>> |
|Blue |Chromatic |[[Line]] of <<tag Electricity>> |
|Green |Chromatic |[[Cone]] of <<tag Poison>> |
|Red |Chromatic |[[Cone]] of <<tag Fire>> |
|White |Chromatic |[[Cone]] of <<tag <<Cold>> |
|Brass |Metallic |[[Line]] of <<tag Fire>> |
|Bronze |Metallic |[[Line]] of <<tag Electricity>>|
|Copper |Metallic |[[Line]] of <<tag Acid>>|
|Gold |Metallic |[[Cone]] of <<tag Fire>>|
|Silver |Metallic |[[Cone]] of <<tag Cold>>|
''Anathema'' Letting a personal insult against you slide is anathema to your instinct. Choose whether your character respects or abhors your dragon type. If you respect it, defying such a dragon is anathema, and if you abhor it, failing to defeat such a dragon you come across is anathema.
''Draconic Rage (Instinct Ability)'' While raging, you can increase the additional damage from [[Rage]] from 2 to 4 and change its damage type to match that of your dragon’s breath weapon instead of the damage type for your weapon or unarmed attack. If you do this, your Rage action gains the <<tag Arcane>> and <<tag Evocation>> traits, as well as the trait matching the damage type. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
''Specialization Ability'' When you use draconic rage, you increase the additional damage from Rage from 4 to 8. If you have greater weapon specialization, instead increase the damage from Rage when using draconic rage from 8 to 16. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
''Raging Resistance'' You resist piercing damage and the damage type of your dragon’s breath weapon. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
{{LOCGFeat}}
You can cast the [[Dragon Breath]] sorcerer bloodline spell as an innate arcane spell once per day, but you can use only the dragon breath that is associated with your heritage and that matches the energy type of your [[Dragon Spit]] feat.
At 12th level and every 3 levels thereafter, the spell is heightened by an additional spell level.
''Requirements'' You are in [[Dragon Stance]].
You bellow, instilling fear in your enemies.
Enemies within a 15-foot [[Emanation]] must succeed at a [[Will]] save against your [[Intimidation]] DC or be [[Frightened]] 1 (frightened 2 on a critical failure).
When a creature frightened by the roar begins its turn adjacent to you, it can’t reduce its [[Frightened]] value below 1 on that turn.
Your first attack that hits a frightened creature after you roar and before the end of your next turn gains a +4 circumstance bonus to damage.
After you use Dragon Roar, you can’t use it again for 1d4 rounds. Its effects end immediately if you leave [[Dragon Stance]].
Creatures in the area of your roar are then temporarily immune for 1 minute.
You can take on the form of some of the world’s most fearsome creatures.
Add the forms listed in [[Dragon Form]] to your [[Wild Shape]] list.
Whenever you’re polymorphed into another form using wild shape, you gain resistance 5 to your choice of acid, cold, electricity, fire, or poison.
{{LOCGFeat}}
You can spit energy, and you might have an especially visible sign of your draconic heritage.
Choose one of the following cantrips: [[Acid Splash]], [[Electric Arc]], [[Produce Flame]], or [[Ray of Frost]]. You can cast this spell as an innate arcane spell at will, and when you cast it, the spell’s energy emerges from your mouth.
''Requirements'' You are unarmored.
You enter the stance of a dragon and make powerful leg strikes like a lashing dragon’s tail.
You can make dragon tail attacks that deal 1d10 bludgeoning damage. They are in the brawling group and have the [[Backswing]], [[Nonlethal]], and [[Unarmed]] traits.
While in Dragon Stance, you can ignore the first square of [[Difficult Terrain]] while [[Striding|Stride]].
''Prerequisites'' [[Dragon Instinct]].
You transform into a ferocious Large dragon, gaining the effects of 6th-level [[Dragon Form]] except that you use your own AC and attack modifier; you also apply your extra damage from [[Rage]]. __You use your class DC as your Breath Weapon DC.__
The action to [[Dismiss]] the transformation gains the <<tag Rage>> trait.
At 18th level, you gain a +20-foot status bonus to your fly Speed, your damage bonus with dragon Strikes increases to +12, and you gain a +14 status bonus to your breath weapon damage.
Affix to armor.
''Requirements'' You’re an expert in [[Athletics]].
This shimmering green scale is usually attached to a golden clasp or chain.
When you activate ({{OneAction}} envision) the scale, for 1 minute you gain a swim Speed equal to half your land Speed.
{{||SpellSummaryTable}}
Leathery wings sprout from your back, giving you a fly Speed of 60 feet or your Speed, whichever is faster.
When this spell’s duration would end, if you’re still flying, you float to the ground, as [[Feather Fall]].
You can increase the Focus Point cost by 1 to gain the effects of [[Dragon Claws]] as long as the wings last.
''Heightened (8th)'' The duration increases to 10 minutes.
You can put more effort into your [[Kobold Breath]] to channel greater draconic power, though it takes more out of you.
When you use Kobold Breath, you can increase the damage dice to d8s and increase the area to 60 feet for a [[Line]] breath weapon or 30 feet for a [[Cone]].
If you do, you can’t use Kobold Breath again for 1 hour.
This viscous liquid contains blood from a certain type of dragon.
For 1 hour after you imbibe the concoction, you can unleash a breath weapon used by that type of dragon. The potency of the breath depends on the potion’s type, based on the age of the dragon whose blood was used to make the potion.
This potion has the trait matching the damage type of the breath weapon.
Exhaling dragon breath uses a single action. The damage type and the area of the dragon breath depend on the type of dragon blood in the potion, as shown in the table below.
| !Dragon Type | !Breath Weapon | !Save |
| Black or Copper | 30-foot line of <<tag Acid>> | [[Reflex]] |
| Blue or Bronze | 30-foot line of <<tag Electricity>> | [[Reflex]] |
| Brass | 30-foot line of <<tag Fire>> | [[Reflex]] |
| Green | 15-foot cone of <<tag Poison>> | [[Fortitude]] |
| Gold or Red | 15-foot cone of <<tag Fire>> | [[Reflex]] |
| Silver or White | 15-foot cone of <<tag Cold>> | [[Reflex]] |
Regardless of the dragon type, the //damage dealt by the breath weapon depends on the age of the dragon as shown below//.
| !Age | !Level | !Price | !Damage | !Save DC |
| Young | 7 | 700 | 4d6 | 23 |
| Adult | 12 | 4000 | 6d6 | 29 |
| Wyrm | 17 | 30000 | 10d6 | 37 |
After you use the breath weapon, you can’t do so again for 1d4 rounds.
As a member of dragonkind, you project unflappable confidence (that collapses catastrophically against the deadliest foes).
When you roll a success on a saving throw against a <<tag Fear>> effect, you get a critical success instead.
When you roll a failure against a fear effect, you get a critical failure instead.
In addition, when you attempt to [[Demoralize]] a foe of your level or lower, you gain a +1 circumstance bonus to the [[Intimidation]] check.
''Prerequisites'' [[Dragon Instinct]].
''Requirements'' You haven’t used this ability since you last Raged.
You breathe deeply and exhale powerful energy in a 30-foot [[Cone]] or 60-foot [[Line]], dealing 1d6 damage per level.
The area and damage type match those of your dragon.
If you used this ability in the last hour, the area and the damage are halved (15-foot cone or 30-foot line; 1d6 damage for every 2 levels).
Each creature in the area must attempt a basic [[Reflex]] save.
''Prerequisites'' [[Dragon Instinct]].
You sprout dragon wings from your back of the same color as your chosen dragon.
While you are raging, you gain a fly Speed equal to your land Speed.
If you are flying when your rage ends, you start to fall but the transformation only completes at the last moment, so you take no damage from the fall and land standing up.
Your draconic anatomy becomes especially pronounced. You increase the power of one of the following kobold heritages or feats you have.
[[Dracomancer]]: Increase the number of times you can cast each of the granted 1st- and 2nd-level innate spells by 1.
[[Kobold Breath]]: Creatures that critically fail their save against your Kobold Breath take 3d4 persistent damage of the type dealt by your draconic patron.
[[Strongjaw Kobold]]: Your jaws unarmed attack gains the deadly d6 trait.
[[Venomtail Kobold]]: You produce enough venom to use the [[Tail Toxin]] action twice per day.
The hide and scales of a dragon can be used to [[Craft]] any item normally made of ordinary leather or hide.
Dragonhide varies in color from blue to glittering gold, depending on the dragon it came from.
Due to the scales’ resiliency, it can also be used to [[Craft]] armor usually made out of metal plates (such as a breastplate, half plate, and full plate), allowing such armor to be made without metal.
Dragonhide objects are immune to one damage type, depending on the type of dragon (see the table below).
| !Dragon Type | !Resistance |
| Black or Copper | <<tag Acid>> |
| Blue or Bronze | <<tag Electricity>> |
| Brass, Gold, or Red | <<tag Fire>> |
| Green | <<tag Poison>> |
| Silver or White | <<tag Cold>> |
| !Grade | !Level | !Price |
| Standard | 8 | 3500/Bulk |
| High | 16 | 60000/Bulk |
| !Item | !Grade | !Hardness | !HP | !BT |
| Thin | Standard | 4 | 16 | 8 |
| Thin | High | 8 | 32 | 16 |
| Item | Standard | 7 | 28 | 14 |
| Item | High | 11 | 44 | 22 |
Dragonhide armor is immune to one damage type based on the type of dragon it is made from.
| !Dragon Type | !Resistance |
| Black or Copper | <<tag Acid>> |
| Blue or Bronze | <<tag Electricity>> |
| Brass, Gold, or Red | <<tag Fire>> |
| Green | <<tag Poison>> |
| Silver or White | <<tag Cold>> |
Wearing armor made from dragonhide also grants you a +1 circumstance bonus to your AC and saving throws against attacks and spells that deal the corresponding damage type.
Dragonhide can be used to Craft armor usually made out of metal plates (such as a breastplate, half plate, and full plate), allowing such armor to be made without metal.
| !Type | !Level | !Price | !Value of Dragonhide needed | !Hardness | !HP | !BT | !Magic Level Limit |
| Standard-Grade | 12 | 16000 + 1600/Bulk | 2000 + 200/Bulk | 7 | 28 | 14 | 15 |
| High-Grade | 19 | 320000 + 32000/Bulk | 160000 + 16000/Bulk | 11 | 44 | 22 | Any |
''Craft Requirements'' The initial raw materials must include 1,250 gp of dragonhide.
This suit of [[+2|Armor Potency]] greater [[Resilient]] [[dragonhide|Dragonhide Armor]] full plate makes you look like a fearsome dragon. The armor comes in 10 varieties corresponding to the 10 common dragon types, though other varieties undoubtedly exist.
''Activate'' {{TwoAction}} Interact; ''Frequency'' once per day; ''Effect'' You unleash a bout of dragon breath with a shape, damage type, and saving throw corresponding to the type of dragon used to make the armor (shown on the table below). The breath weapon deals 14d6 damage; each creature in the area must attempt a DC 36 basic saving throw.
| !Dragon Type | !Protects Against | !Breath Weapon (Save) |
| Black or Copper | <<tag Acid>> | 30-foot line of acid ([[Reflex]]) |
| Blue or Bronze | <<tag Electricity>> | 30-foot line of electricity ([[Reflex]]) |
| Brass | <<tag Fire>> | 30-foot line of fire ([[Reflex]]) |
| Green | <<tag Poison>> | 15-foot cone of poison ([[Fortitude]]) |
| Gold or Red | <<tag Fire>> | 15-foot cone of fire ([[Reflex]]) |
| Silver or White | <<tag Cold>> | 15-foot cone of cold ([[Reflex]]) |
//The "protects against" above refers to the resistance granted by this also being [[Dragonhide Armor]].//
You gain resistance equal to half your level (minimum 1) to the damage type associated with your [[Draconic Exemplar]]. Double this resistance against dragons’ Breath Weapons.
''Prerequisites'' Tenets of Good.
You’ve sworn to slay evil dragons.
Add the following tenet to your code after the others: “You must slay evil dragons you encounter as long as you have a reasonable chance of success.”
Your [[Retributive Strike]] gains a +4 circumstance bonus to damage against an evil dragon, or +6 if you have master proficiency with the weapon you used.
Your [[Glimpse of Redemption]]’s resistance against damage from an evil dragon is 7 + your level.
If you use [[Liberating Step]] triggered by an evil dragon, your ally gains a +4 circumstance bonus to checks granted by your Liberating Step, and the ally can [[Step]] twice afterward.
You don’t consider evil dragons to be legitimate authorities, even in nations they rule.
''Frequency'' once per day. //If you are a universalist wizard, you can use Drain Bonded Item once per day to recall a spell of each level you can cast. If you are a specialist, you can only use it once per day in total.//
You expend the power stored in your bonded item.
During your turn, you gain the ability to cast one spell you prepared today and already cast, without spending a spell slot.
You must still [[Cast the Spell|Cast a Spell]] and meet the spell’s other requirements.
//The requirement to do this when your turn begins was removed by errata.//
{{||SpellSummaryTable}}
You close your hand and pull life energy from another creature into yourself.
This deals 3d4 <<tag Negative>>damage; the target must attempt a basic [[Fortitude]] save.
You gain temporary Hit Points equal to the damage the target takes, after resolving its save and applying your blood magic if applicable.
If the target’s Hit Points were lower than the damage you dealt, you gain temporary Hit Points equal to their remaining Hit Points instead.
The temporary Hit Points last for 1 minute.
''Heightened (+1)'' The damage increases by 1d4.
When a creature successfully drains you of blood or life force, you become less healthy.
Drained always includes a value. You take a status penalty equal to your drained value on [[Constitution]]-based checks, such as [[Fortitude]] saves.
You also lose a number of [[Hit Points]] equal to your level (minimum 1) times the drained value, and your maximum Hit Points are reduced by the same amount. For example, if you’re hit by an effect that inflicts drained 3 and you’re a 3rd-level character, you lose 9 Hit Points and reduce your maximum Hit Points by 9.
Losing these Hit Points doesn’t count as taking damage.
Each time you get a full night’s rest, your drained value decreases by 1. //If you have the [[Fast Recovery]] Feat, it instead decreases by 2.// This increases your maximum Hit Points, but you don’t immediately recover the lost Hit Points
Your skin grows tough scales like a drake, your eyesight become sharp and your pupils slitted, and your limbs grow wiry and quick, but your mind and reflexes become slow.
''Benefit'' You gain the listed bonus to AC, a Dexterity cap of +2 (as usual, use your lowest [[Dexterity]] cap if you have more than one), and an item bonus to [[Perception]] checks. If you’re wearing armor, you still calculate your proficiency bonus to AC based on your proficiency in the armor you’re wearing, even if the drakeheart mutagen has a higher item bonus.
You also gain {{OneAction}} ''Final Surge'': You Stride twice. The drakeheart mutagen’s duration ends.
''Drawback'' You take a –1 penalty to [[Will]] saves, [[Reflex]] saves, and all skill checks to [[Recall Knowledge]].
| !Type | !Level | !Price | !Item bonus to AC | !Item bonus to Perception | !Duration |
| Lesser | 1 | 40 | +4 | +1 | 1 minute |
| Moderate | 3 | 120 | +5 | +2 | 10 minutes |
| Greater | 11 | 3000 | +6 | +3 | 1 hour |
| Major | 17 | 30000 | +7 | +4 | 1 hour |
You gain touch telepathy, allowing you to communicate silently and purely mentally with any creature you’re touching, as long as you share a language.
This flask is filled with a murky purple gas that briefly interferes with normal brain activity.
A dread ampoule deals the listed mental damage and mental splash damage.
On a hit, the target becomes [[Frightened]] 1, or [[Frightened]] 2 on a critical hit.
Many types also grant an item bonus to attack rolls.
| !Type | !Level | !Price | !Mental Damage | !Mental Splash Damage | !Item bonus to attack |
| Lesser | 1 | 30 | 1d6 | 1 | None |
| Moderate | 3 | 100 | 2d6 | 2 | +1 |
| Greater | 11 | 3000 | 3d6 | 3 | +2 |
| Major | 17 | 30000 | 4d6 | 4 | +3 |
{{||SpellSummaryTable}}
You emit an aura of terror.
Foes in the area are [[Frightened]] 1 and unable to reduce the condition.
Putting on a grim face for the battle ahead, you encourage your allies to strike fear into their foes with vicious attacks.
When you use this action, attempt an [[Intimidation]] check. The DC is usually a standard difficulty DC of your level, but the GM can assign a different DC based on the circumstances. The effect depends on the result of your check.
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
You utter a powerful secret at odds with the fundamental nature of the target creatures.
Choose a specific resistance or weakness that you believe one or more of the targets have due to [[Recall Knowledge]] or previous experience with the targets, such as resistance to <<tag Fire>> or weakness to [[Silver]].
If the information is incorrect for a given target, the spell has no effect on that target.
Affected targets must attempt a [[Will]] saving throw.
{{||SaveSuccessTable}}
You capitalize on your enemies’ fear to slip past their defenses.
Any creature that has the [[Frightened]] condition is also [[Flat-Footed]] against your attacks.
{{||SpellSummaryTable}}
When you Cast this Spell, any targets—including you—can choose to immediately fall asleep. The spell ends for any creatures that don’t choose to fall asleep.
Sleepers join a shared dream, where they can communicate with one another as though they were in the same room.
Individual targets leave this shared dream upon awakening, and if all the targets awaken, the spell ends.
You are the child of a night hag, making one of your eyes violet or even black.
Your mother’s powers over sleep and dreams have given you a degree of resistance to those effects, granting you a +2 circumstance bonus to all saving throws against <<tag Sleep>> effects and effects that cause or alter dreams.
In addition, sleep is more restorative for you. You regain HP equal to your Constitution modifier times double your level instead of just times your level, and you reduce any [[Drained]] and [[Doomed]] conditions you have by 2 instead of by 1.
{{||SpellSummaryTable}}
You send a message to your target’s dream.
The message is one-way, up to 1 minute of speech (roughly 150 words).
If the target is asleep, they receive the message instantly. If not, they receive it the next time they sleep.
As soon as they receive it, the spell ends, and you know the message was sent.
''Heightened (4th)'' You can target up to 10 creatures you know by name and have met in person. You must send the same message to all of them; the spell ends for each creature individually.
{{||SpellSummaryTable}}
The target becomes distracted and suggestible, inundated by vivid daydreams.
//It must make a [[Will]] save.//
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You draw the target into a lucid dream where it can explore the endless possibilities of its own potential within the everchanging backdrop of its dreamscape.
If it sleeps the full 8 hours uninterrupted, when it wakes, it counts as having spent a day of downtime [[Retraining]], though it can’t use dreaming potential for any retraining that would require either an instructor or specialized knowledge it can’t access within the dream.
''Size'' Small
''Melee'' {{OneAction}} jaws [[Finesse]], damage 1d8 piercing
''Melee'' {{OneAction}} talon ([[Agile]], [[Finesse]]), Damage 1d6 slashing
''Str'' +2, ''Dex'' +3, ''Con'' +2, ''Int'' –4, ''Wis'' +1, ''Cha'' +0
''Hit Points'' 6
''Skill'' [[Stealth]]
''Senses'' [[Low-Light Vision]], [[Scent]] (Imprecise, 30 feet)
''Speed'' 50 feet
''Support Benefit'' Your raptor constantly darts into flanking position. Until the start of your next turn, it counts as being in its space or an empty space of your choice within 10 feet when determining whether you and your companion are [[Flanking]]; you can choose a different space for each of your attacks).
''Advanced Maneuver'' [[Darting Attack]]
{{||SpellSummaryTable}}
''Trigger'' A creature within range is hit by an attack from an enemy.
The target appears to fall down dead, though it actually turns [[Invisible]].
Its illusory corpse remains where it fell, complete with a believable fatal wound. This illusion looks and feels like a dead body.
If the target’s death seems absurd—for instance, a barbarian at full health appears to be slain by 2 damage—the GM can grant the attacker an immediate [[Perception]] check to disbelieve the illusion.
If the target uses [[Hostile Action]]s, the spell ends. This ends the entire spell, so the illusory corpse disappears too.
''Heightened (7th)'' The spell doesn't end if the target uses hostile actions.
Subterranean kin of the elves, drow typically have darkvision and inborn magical abilities.
You can hold your breath for a number of rounds equal to 5 + your [[Constitution]] modifier.
Reduce your remaining air by 1 round at the end of each of your turns, or by 2 if you attacked or cast any spells that turn.
You also lose 1 round worth of air each time you are critically hit or critically fail a save against a damaging effect.
If you speak (including casting spells with <<tag Verbal>>components or activating items with <<tag Command>>components) you lose all remaining air.
When you run out of air, you fall [[Unconscious]] and start [[Suffocating]].
!! Splats
<$list filter="[tag<currentTiddler>tag[Splat]]" />
!! Class Features
| !Level | !Features |
| 1 | [[Druid Anathema]], Druidic Language, [[Shield Block]], [[Wild Empathy]], __5__ cantrips, 2 1st-level slots |
| 2 | +1 1st-level slot |
| 3 | [[Alertness]], [[Great Fortitude]], 2 2nd-level slots |
| 4 | +1 2nd-level slots |
| 5 | [[Lightning Reflexes]], 2 3rd-level slots |
| 6 | +1 3rd-level slots |
| 7 | [[Expert Spellcaster]], 2 4th-level slots |
| 8 | +1 4th-level slots |
| 9 | 2 5th-level slots |
| 10 | +1 5th-level slots |
| 11 | [[Druid Weapon Expertise]], [[Resolve]], 2 6th-level slots |
| 12 | +1 6th-level slots |
| 13 | [[Medium Armor Expertise]], [[Weapon Specialization]], 2 7th-level slots |
| 14 | +1 7th-level slots |
| 15 | [[Master Spellcaster]], 2 8th-level slots |
| 16 | +1 8th-level slots |
| 17 | 2 9th-level slots |
| 18 | +1 9th-level slot |
| 19 | [[Legendary Spellcaster]], [[Primal Hierophant]] |
| 20 | |
!! Class Feats
{{||ClassFeatList}}
As stewards of the natural order, druids find affronts to nature anathema.
If you perform enough acts that are anathema to nature, you lose your magical abilities that come from the druid class, including your primal spellcasting and the benefits of your order.
These abilities can be regained only if you demonstrate your repentance by conducting an [[Atone]] ritual.
The following acts are anathema to all druids:
* Using metal armor or shields.
* Despoiling natural places.
* Teaching the Druidic language to non-druids.
Each druidic order also has additional anathema acts, detailed in the order’s entry.
You cast spells like a druid.
You gain access to the [[Cast a Spell]] activity.
You can prepare two common cantrips each day from the core primal spell list or any other cantrips you learn or discover.
You’re trained in spell attack rolls and spell DCs for primal spells.
Your key spellcasting ability for druid archetype spells is [[Wisdom]], and they are primal druid spells.
You learn the Druidic language.
Choose an order as you would if you were a druid.
You become a member of that order and are bound by its anathema, allowing you to take the order’s feats.
You become trained in [[Nature]] and your order’s associated skill; for each of these skills in which you were already trained, you become trained in a skill of your choice.
You don’t gain any other abilities from your choice of order.
!! Orders
<$list filter="[tag[Druid]tag[Splat]]" />
<<levelfeatlist "4 6 8 12 18" "[tag[Archetype]field:feat-arch[Druid]]">>
You have become thoroughly familiar with the weapons of your trade.
Your proficiency ranks for all simple weapons and unarmed attacks increase to expert.
When you lash out with both weapons, you leave no room for the target to escape your attack.
When you use [[Double Slice]], if you miss with both Strikes, choose one of the two weapons and apply the effects of a hit with that weapon.
You can’t choose a weapon if your attack roll with that weapon was a critical failure, meaning you still miss entirely if both attack rolls were critical failures.
You know how to throw two weapons as easily as strike with them.
Whenever a dual-weapon warrior feat allows you to make a melee Strike, you can instead make a ranged Strike with a thrown weapon or a one-handed ranged weapon you are wielding.
Any effects from these feats that apply to one‑handed melee weapons or melee Strikes also apply to one‑handed ranged weapons and ranged Strikes.
''Requirements'' You are wielding a one-handed melee weapon and have a free hand.
You snap your free hand over to grip your weapon just long enough to add momentum and deliver a more powerful blow to your opponent.
Make a [[Strike]] with the required weapon.
You quickly switch your grip during the Strike in order to make the attack with two hands.
If the weapon doesn’t normally have the [[Two-Hand]] trait, increase its weapon damage die by one step for this attack.
If the weapon has the two-hand trait, you gain the benefit of that trait and a circumstance bonus to damage equal to the weapon’s number of damage dice.
When the Strike is complete, you resume gripping the weapon with only one hand.
This action doesn’t end any stance or fighter feat effect that requires you to have one hand free.
''Requirements'' You are wielding two one-handed melee weapons, each in a different hand.
You attack as you dash among foes.
[[Stride]] up to your Speed.
At any point during this movement, you can [[Strike]] once with each of the two required weapons.
These Strikes can be against the same or different targets, as you see fit.
''Requirements'' You are wielding two one-handed weapons, each in a different hand, one of which is a ranged weapon.
You carry your ammunition in a way that allows you to reload while holding two weapons.
You [[Interact]] to reload a one-handed ranged weapon you’re holding.
Unlike most Interact actions, you don’t need a free hand to reload your ranged weapon in this way.
You’re exceptional in your use of two weapons.
You gain the [[Double Slice]] fighter feat. This serves as Double Slice for the purpose of meeting prerequisites.
<<archetypefeatlist "4 6 8 10 12 14 16 18" "[[Dual-Weapon Warrior]]">>
Your suli heritage can be traced back to two geniekin ancestors of opposing elements, or to an elemental ancestor that embodied two combined elements.
Choose two of the following elements: air, earth, fire, and water. Once made, this choice can’t be changed.
You gain resistance equal to half your level (minimum 1) to all damaging effects with the traits of either of your chosen elements.
''Special'' If you take the [[Elemental Assault]] or [[Elemental Bulwark]] ancestry feats, you can use them only with your chosen elements. You can add your resistance from this feat to the resistance you gain from Elemental Bulwark against effects with your elements’ traits, for a total of 5 + half your level, or 10 + half your level with [[Improved Elemental Bulwark]]. If you take the [[Tetraelemental Assault]] feat, you can choose each of your two elements twice each, instead of choosing each of the four elements once each.
If your next action is to [[Cast a Spell]] from your spell slots, you gain a benefit.
If the spell is arcane, you can attempt a skill check to [[Recall Knowledge]] with a +1 status bonus to the check after casting the spell, or a +2 status bonus if the spell is 7th level or higher.
If the spell is primal, you gain a number of temporary Hit Points equal to the spell’s level for 1 round.
If the spell is a halcyon spell, you gain both benefits.
''Prerequisites'' Trained in a skill with the [[Recall Knowledge]] action.
You’re a treasure trove of information, but not all of it comes from reputable sources.
When you fail __(but not critically fail)__ a Recall Knowledge check using any skill, you learn a bit of true knowledge and a bit of erroneous knowledge, but you don’t have any way to differentiate which is which.
''Requirements'' You are wielding only a single one-handed melee weapon and have your other hand or hands free.
Using your free hand as pivot and balance, you both attack and defend with your weapon.
While you are in this stance, you constantly have the benefits of [[Dueling Parry]].
''Requirements'' You are wielding only a single one-handed melee weapon and have your other hand or hands free.
You can parry attacks against you with your one-handed weapon.
You gain a +2 circumstance bonus to AC until the start of your next turn as long as you continue to meet the requirements.
''Trigger'' A creature within your reach critically fails a Strike against you.
''Requirements'' You are benefiting from [[Dueling Parry]].
You riposte against your flailing enemy.
Make a melee [[Strike]] against or attempt to [[Disarm]] the triggering creature.
''Prerequisites'' trained in light armor and simple weapons
You are always ready to draw your weapon and begin a duel, no matter the circumstances.
You gain the [[Quick Draw]] ranger feat, enabling you to both draw and attack with a weapon as 1 action. This serves as Quick Draw for the purpose of meeting prerequisites.
<<archetypefeatlist "4 8 10 12 14 16" "Duelist">>
Select one foe that you can see and proclaim a challenge. That foe is your dueling opponent until they are defeated, flee, or the encounter ends.
Any time you hit that enemy using a single one-handed melee weapon while your other hand or hands are free, you gain a circumstance bonus to the Strike’s damage equal to the number of damage dice your weapon deals.
If you attack a creature other than your dueling opponent, you take a circumstance penalty to damage equal to the number of damage dice your weapon deals.
''Trigger'' You roll initiative, and you can observe at least one opponent.
You hone your reaction time through duels and learn to draw your weapon seamlessly as you begin a fight.
You gain a +2 circumstance bonus to the triggering initiative roll, and you can immediately [[Interact]] to draw your Aldori dueling sword.
Subterranean kin of the dwarves, duergars typically have [[Darkvision]] and immunity to <<tag Poison>>.
They are not easily fooled by illusions.
{{||SpellSummaryTable}}
You curse the target to fail in all avenues of its life that require drive and ambition, as it inadvertently undermines its own goals at every turn.
The effect is based on the target’s [[Will]] save.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You try to create a temporary duplicate of an enemy to fight on your behalf.
The target can attempt a [[Fortitude]] save to disrupt the spell.
The duplicate appears in an unoccupied space adjacent to the target and has the target’s attack modifier, [[AC]], saving throw modifiers, [[Perception]], and skill modifiers, but it
has only 70 [[Hit Points]] and lacks the target’s special abilities, including immunities, resistances, and weaknesses.
It has no magic items except weapon potency runes.
The duplicate gains the <<tag Minion>>trait, and it can only [[Stride]] and [[Strike]].
Its Strikes deal the target’s normal damage but don’t apply added effects, since it doesn’t have special abilities.
The spell automatically ends if the duplicate’s Hit Points drop to 0.
The duplicate attacks your enemies to the best of its abilities. You can also try to give it additional instructions; when you [[Sustain the Spell|Sustain a Spell]], you can also Command a Minion as part of your action, but the GM determines whether the duplicate follows your command. //This may be an error as there is no "Command a Minion" action.//
The duplicate is unstable, so each turn after it takes its actions, it loses 4d6 Hit Points. It’s not a living creature, and it can never regain its lost Hit Points in any way.
{{||SaveSuccessTable}}
Thanks to an ancient bargain, your soul has been reborn as a duskwalker, a planar scion with a connection to psychopomps and the Boneyard.
You gain the <<tag Duskwalker>> trait in addition to the traits from your ancestry.
You also gain [[Low-Light Vision]], or you gain [[Darkvision]] if your ancestry already has low light vision.
Neither your body nor your spirit can ever become <<tag Undead>>.
You can choose from <<tag Duskwalker>> feats and feats from your ancestry whenever you gain an ancestry feat.
{{||VHerFeatList}}
You either found another duskwalker who taught you the secrets of your kind, or you managed to research your unusual heritage.
You gain the trained proficiency rank in [[Medicine]] and [[Religion]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Boneyard [[Lore]].
Your connection to psychopomps gives you the power to glimpse the near future and protect corpses from the ravages of undeath.
You can cast [[Augury]] and [[Gentle Repose]] each once per day as 2nd-level divine innate spells.
Stored in a small reed, this powder looks like a fine metallic dust.
When you fling it in the air ({{OneAction}} Interact), it coats all creatures in a 10-foot burst centered on a point within 5 feet of you.
For 1 minute, the coated creatures can’t be [[Concealed]] or [[Invisible]], nor can they benefit from [[Mirror Image]] or similar abilities that create illusory duplicates.
Any illusions in the area of 3rd level or lower are revealed as such, although this does not end their effect.
This powder shimmers like a thousand tiny motes of light.
Activating the dust by sprinkling it on yourself or a creature within reach ({{OneAction}} Interact) casts a 4th-level [[Invisibility]] spell with a duration of 1 minute on that creature.
This invisibility can’t be negated or seen through by any spell of 3rd level or lower or any item of 5th level or lower.
{{||SpellSummaryTable}}
You call forth a swirling storm of dust.
The dust storm obscures vision, with the effect of [[Obscuring Mist]]. //(All creatures within the mist become [[Concealed]], and all creatures outside the mist become concealed to creatures within it.)//
The dust also makes the air unbreathable; creatures in the area must [[hold their breath|Drowning]], though wearing a scarf or similar clothing over the mouth increases the time the creature can hold its breath to 5 rounds.
Creatures entering or starting their turn in the dust storm take 1d6 slashing damage. Creatures that have the <<tag Water>> trait or that are made primarily of liquid take double damage.
''Heightened (+2)'' The damage increases by 1d6.
Your earth elemental ancestor’s influence manifests in you as dust and dirt, like the soil of a field or the hot desert sands.
You gain the trained proficiency rank in [[Survival]]. If you would automatically become trained in Survival (from your background or class, for example), you instead become trained in a skill of your choice.
You can sustain yourself on dirt and ash instead of normal food and water.
{{||SpellSummaryTable}}
As you challenge an enemy, you take some of its attention away from your allies.
The target takes a –1 status penalty to attack rolls, damage rolls, and skill checks against creatures other than you, and you take a –1 status penalty to attack rolls, damage rolls, and skill checks against creatures other than the target.
Each time a creature other than you uses a [[Hostile Action]] that affects the challenged enemy, the enemy can attempt a [[Will]] save. On a success, the enemy no longer takes the penalty against that creature.
You can [[Dismiss]] the spell, and it ends automatically if you or the target is defeated.
''Heightened (+3)'' The status penalties increase by 1.
You are either naturally calm and collected in the face of imminent danger, or you are very good at faking it.
At the end of your turn, reduce your [[Frightened]] condition by 2 instead of 1.
You eagerly absorbed the old stories and traditions of your ancestors, your gods, and your people, studying in subjects and techniques passed down for generation upon generation.
You gain the trained proficiency rank in [[Crafting]] and [[Religion]].
If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Dwarven [[Lore]].
''Prerequisites'' expert in [[Crafting]].
You can use your knowledge of engineering and metalwork to temporarily strengthen thick objects and structures.
By spending 1 hour working on an item, you can give it a +1 circumstance bonus to its Hardness for 24 hours. If you’re a master in Crafting, the bonus is +2, and if you’re legendary, the bonus is +3.
You can reinforce a portion of a structure, though 1 hour usually reinforces only a door, a few windows, or another section that fits within a 10-foot cube.
This [[+2|Weapon Potency]] [[Striking]] warhammer is inlaid with precious metals and decorated with geometric patterns in a dwarven style.
If you’re a dwarf, a dwarven thrower functions for you as a +2 greater striking [[Returning]] warhammer with the thrown 30 feet trait, and your attacks with the hammer deal 1d8 additional damage against giants.
You’ve learned cunning techniques to get the best effects out of your dwarven weapons.
Whenever you critically hit using a [[Battle Axe]], [[Pick]], [[Warhammer]], or a <<tag Dwarf>> weapon, you apply the weapon’s critical specialization effect.
Your dwarven affinity blends with your training, granting you great skill with dwarven weapons.
Whenever you gain a class feature that grants you expert or greater proficiency in certain weapons, you also gain that proficiency for [[Battle Axe]]s, [[Pick]]s, [[Warhammer]]s, and all dwarven weapons in which you are trained.
Your kin have instilled in you an affinity for hard-hitting weapons, and you prefer these to more elegant arms.
You are trained with the [[Battle Axe]], [[Pick]], and [[Warhammer]].
You also gain access to all uncommon dwarf weapons.
For the purpose of determining your proficiency, martial dwarf weapons are simple weapons and advanced dwarf weapons are martial weapons.
You are bleeding out or otherwise at death’s door.
While you have this condition, you are [[Unconscious]].
If you gain the Dying condition while [[Wounded]], increase your Dying condition by the amount of your Wounded condition.
Dying always includes a value, and if it ever reaches dying 4, you die. //If you have the [[Diehard]] feat, you instead die at dying 5.//
If you’re dying, you must attempt a [[Recovery Check]] at the start of your turn each round to determine whether you get better or worse.
Your dying condition increases by 1 if you take damage while dying, or by 2 if you take damage from an enemy’s critical hit or a critical failure on your save.
If you lose the dying condition by succeeding at a recovery check and are still at 0 Hit Points, you remain unconscious, but you can wake up as described in that condition.
You lose the dying condition automatically and wake up if you ever have 1 Hit Point or more.
Any time you lose the dying condition, you gain the [[Wounded]] 1 condition, or increase your wounded condition value by 1 if you already have that condition, //unless you lost the dying condition by spending [[Hero Point]]s.//
After you drink this elixir, you notice subtle visual details. For
For the next hour, you gain an item bonus to [[Perception]] checks that is greater when attempting to find secret doors and traps.
//If you're affected by a Major Eagle-Eye Elixir, each time you pass within 10 feet of a secret door or trap, the GM automatically rolls a secret check for you to find it.//
| !Type | !Level | !Price | !Bonus |
| Lesser | 1 | 40 | +1, or +2 to find secret doors and traps |
| Moderate | 5 | 270 | +2, or +3 to find secret doors and traps |
| Greater | 10 | 2000 | +3, or +4 to find secret doors and traps |
| Major | 16 | 20000 | As Greater, plus automatic checks as above |
You use one of your skills to make money during downtime.
The GM assigns a task level representing the most lucrative job available. You can search for lower-level tasks, with the GM determining whether you find any. Sometimes you can attempt to find better work than the initial offerings, though this takes time and requires using the [[Diplomacy]] skill to [[Gather Information]], doing some research, or socializing.
When you take on a job, the GM secretly sets the DC of your skill check. After your first day of work, you roll to determine your earnings. You gain an amount of income based on your result, the task’s level, and your proficiency rank.
You can continue working at the task on subsequent days without needing to roll again. For each day you spend after the first, you earn the same amount as the first day, up until the task’s completion.
The GM determines how long you can work at the task. Most tasks last a week or two, though some can take months or even years.
Using [[Crafting]], you can work at producing common items for the market. It’s usually easy to find work making basic items whose level is 1 or 2 below your settlement’s level. Higher-level tasks represent special commissions, which might require you to Craft a specific item using the Craft downtime activity and sell it to a buyer at full price. These opportunities don’t occur as often and might have special requirements—or serious consequences if you disappoint a prominent client.
You //can// apply the practical benefits of one of your [[Lore]] specialties during downtime by practicing your trade. This is most effective for Lore specialties such as business, law, or sailing, where there’s high demand for workers. The GM might increase the DC or determine only low-level tasks are available if you’re attempting to use an obscure Lore skill to Earn Income. You might also need specialized tools to accept a job, like mining tools to work in a mine or a merchant’s scale to buy and sell valuables in a market.
You //can use [[Performance]] to// perform for an audience to make money. The available audiences determine the level of your task, since more discerning audiences are harder to impress but provide a bigger payout. The GM determines the task level based on the audiences available. Performing for a typical audience of commoners on the street is a level 0 task, but a performance for a group of artisans with more refined tastes might be a 2nd- or 3rd-level task, and ones for merchants, nobility, and royalty are increasingly higher level. Your degree of success determines whether you moved your audience and whether you were rewarded with applause or rotten fruit.
When Earning Income, you might be able to spend days of downtime to prepare for your task, which adjusts the DC of the skill check. This might involve rehearsing a play, studying a topic, and so on. The GM determines how long preparation takes and how much the DC changes. This is most useful when you’re trying a task that’s higher level than you; otherwise such tasks have an increased DC!
When a task you’re doing is complete, or if you stop in the middle of one, you normally have to find a new task if you want to keep Earning Income. For instance, if you quit your job working at the docks, you’ll need to find another place of employment instead of picking up where you left off. This usually takes 1 day or more of downtime looking for leads on new jobs.
However, you might pause a task due to an adventure or event that wouldn’t prevent you from returning to the old job later. The GM might decide that you can pick up where you left off, assuming the task hasn’t been completed by others in your absence. Whether you roll a new skill check when you resume is also up to the GM. Generally speaking, if you had a good initial roll and want to keep it, you can, but if you had a bad initial roll, you can’t try for a better one by pausing to do something else. If your statistics changed during the break—usually because you leveled up while adventuring—you can attempt a new check.
|!Task Level|!Failure|!Trained|!Expert|!Master|!Legendary|
|0| 1 cp| 5 cp| 5 cp| 5 cp| 5 cp|
|1| 2 cp| 2 sp| 2 sp| 2 sp| 2 sp|
|2| 4 cp| 3 sp| 3 sp| 3 sp| 3 sp|
|3| 8 cp| 5 sp| 5 sp| 5 sp| 5 sp|
|4| 1 sp| 7 sp| 8 sp| 8 sp| 8 sp|
|5| 2 sp| 9 sp| 1 gp| 1 gp| 1 gp|
|6| 3 sp| 1 gp, 5 sp| 2 gp| 2 gp| 2 gp|
|7| 4 sp| 2 gp| 2 gp, 5 sp| 2 gp, 5 sp| 2 gp, 5 sp|
|8| 5 sp| 2 gp, 5 sp| 3 gp| 3 gp| 3 gp|
|9| 6 sp| 3 gp| 4 gp| 4 gp| 4 gp|
|10| 7 sp| 4 gp| 5 gp| 6 gp| 6 gp|
|11| 8 sp| 5 gp| 6 gp| 8 gp| 8 gp|
|12| 9 sp| 6 gp| 8 gp| 10 gp| 10 gp|
|13| 1 gp| 7 gp| 10 gp| 15 gp| 15 gp|
|14| 1 gp, 5 sp| 8 gp| 15 gp| 20 gp| 20 gp|
|15| 2 gp| 10 gp| 20 gp| 28 gp| 28 gp|
|16| 2 gp, 5 sp| 13 gp| 25 gp| 36 gp| 40 gp|
|17| 3 gp| 15 gp| 30 gp| 45 gp| 55 gp|
|18| 4 gp| 20 gp| 45 gp| 70 gp| 90 gp|
|19| 6 gp| 30 gp| 60 gp| 100 gp| 130 gp|
|20| 8 gp| 40 gp| 75 gp| 150 gp| 200 gp|
|20 (critical success)| —| 50 gp| 90 gp| 175 gp| 300 gp|
Elves are often skeptical of their half-elven kin, and you are experienced at telling stories of your accomplishments to gain their respect.
<<trainnodupe "Performance">>
You gain the [[Impressive Performance]] feat. When you attempt a [[Performance]] check to [[Make an Impression]] on an elf, if you roll a critical failure, you get a failure instead.
Effects with the earth trait either manipulate or conjure earth.
Those that manipulate earth have no effect in an area without earth.
Creatures with this trait consist primarily of earth or have a magical connection to that element.
{{||SpellSummaryTable}}
Using the weight of earth, you hamper a target’s flight, with effects based on its [[Fortitude]] save.
If the creature reaches the ground safely, it doesn’t take falling damage.
{{||SaveSuccessTable}}
You are a creature of the material world, with an affinity closer to the wilds than urban society. You gain a jaws unarmed attack that deals 1d6 piercing damage. Your jaws are in the brawling group and have the [[Finesse]] and [[Unarmed]] traits. Your alternate form is a fox, which has the statistics of 1st‑level [[Pest Form]].
{{||SpellSummaryTable}}
You shake the ground, topple creatures into fissures, and collapse structures. The GM might add additional effects in certain areas. Cliffs might collapse, causing creatures to fall, or a lake might drain as fissures open up below its surface, leaving a morass of quicksand.
* ''Shaking Ground'' The ground is [[Difficult Terrain]], and creatures on it take a –2 circumstance penalty to attack rolls, AC, and skill checks.
* ''Fissures'' Each creature on the ground must attempt a [[Reflex]] save at the start of its turn to keep its footing and avoid falling into 40-foot-deep fissures that open beneath it. The fissures are permanent, and their sides require DC 15 [[Athletics]] to [[Climb]].
* ''Collapse'' Structures and ceilings might collapse. The GM rolls a flat check for each (DC 16 for a sturdy structure, DC 14 for an average structure and most natural formations, DC 9 for a shoddy structure, all adjusted higher or lower as the GM sees fit). A collapse deals 11d6 bludgeoning damage; each creature caught in a collapse must attempt a [[Reflex]] save to avoid it.
''Heightened (10th)'' You create a massive earthquake that can devastate a settlement. The range increases to half a mile and the area to a quarter-mile burst.
{{||SaveSuccessTable}}
Your connection to earth and stone allows you to feel the slightest displacement that disturbs them, down to the shift of a pebble.
You gain [[Tremorsense]] as an [[Imprecise]] sense with a range of 30 feet.
By endlessly repeating a motif, you implant an earworm, a memorable song that repeats over and over again in your allies’ heads, preparing them to respond to it later.
Choose a composition cantrip and spend 10 minutes repeating a melody, chant, speech, series of motions, or a similar performance that embodies that cantrip. This activity gains the traits appropriate to the type of performance.
You implant the earworm within all allies who can see or hear you (as appropriate for the type of performance) for the entire activity.
Once you’ve created the earworm, you can attempt a [[Performance]] check as a free action to activate it. This check uses a very hard DC of a level equal to that of the highest level target of the earworm present at the time of activation.
On a success, you cast the cantrip on all allies who learned the earworm and can perceive your performance; on a failure, the earworm is corrupted and lost.
Because it is based on the earlier repetitions, you can’t use further free actions like [[Lingering Performance]] or [[Inspire Heroics]] to modify the activated earworm.
Allies forget the earworm after it is activated, if you spend 10 minutes to implant another earworm, or during your next daily preparations, whichever comes first.
{{LOCGFeat}}
You are practiced at blending into the background of the streets and halls of larger folk to ensure that you are overlooked.
When you are in a crowd or well trafficked urban area, you can attempt to [[Hide]] and [[Sneak]], even when observed.
On a success, you aren’t [[Hidden]] or [[Undetected]], but other creatures simply don’t take particular notice of you, even though they can see you.
You can’t use this ability on observers who have already seen you perform obtrusive or notable actions.
If you perform any action other than to Hide or Sneak or otherwise take particularly salient actions (GM’s discretion), observers notice you right away.
''Frequency'' once per day
''Trigger'' A creature within 60 feet uses a <<tag Fortune>> or <<tag Misfortune>> effect.
As someone tries to twist fate, you consume the interference.
The triggering effect is disrupted.
If it’s a misfortune effect, Eat Fortune gains the fortune trait; if it’s a fortune effect, Eat Fortune gains the misfortune trait. This fortune or misfortune applies to the same roll the triggering effect would have, so you couldn’t negate a fortune effect with Eat Fortune and then apply a misfortune effect to the same roll.
You can pull forth both positive and negative energy simultaneously to harm your enemies and heal your allies.
If your next action is to cast a 1-action or 2-action [[Heal]] or [[Harm]] spell, choose one creature in range that would be harmed by the spell, and choose another creature within range that would be healed by the spell. Your heal or harm targets both creatures.
''Requirements'' You are standing on a stone or earthen surface.
You pause a moment to attune your senses to the stone around you.
Until the start of your next turn, you gain a new sense: imprecise [[Tremorsense]] with a range of 20 feet.
When you pull forth positive or negative energy, you also create a smaller pocket of that energy.
If the next action you use is to cast a 2-action [[Harm]] or heal to [[Heal]] or damage a single creature, choose one additional creature adjacent to either you or the target.
Target that creature with a 1-action version of the same spell. This spell is the same level as the 2-action harm or heal you cast and doesn’t cost another spell slot.
You time the components of your spell with exacting precision, setting up a resonance that duplicates the spell’s effects.
If your next action is to [[Cast a Spell]] of 4th level or lower that has no duration, the spell’s energy reverberates and echoes.
You can Cast the Spell a second time before the end of your next turn without expending a spell slot.
''Frequency'' once per day.
Your desire for stimulation has led you from one pursuit to another and granted you a smattering of expertise with myriad crafts and professions.
You reflect on snippets you’ve learned to temporarily become trained in one [[Lore]] skill of your choice. This proficiency lasts for 10 minutes or until you critically fail a check with that skill.
Since this training is temporary, you can’t use it as a prerequisite for a permanent character option like a feat or a skill increase.
Your flexible mind can quickly shift spells.
If you add a spell to your repertoire during your daily preparations using [[Esoteric Polymath]], when you prepare again, you can choose to keep the new spell from Esoteric Polymath in your repertoire and instead lose access to another spell of the same level in your repertoire.
Your broad experiences translate to a range of skills.
__Your proficiency bonus to untrained skill checks is equal to your level.__
You can attempt any skill check that normally requires you to be trained, even if you are untrained.
If you have legendary proficiency in [[Occultism]], you can attempt any skill check that normally requires you to have expert proficiency, even if untrained or trained.
You instinctively learn how to use a sword with just a few practice swings.
You change one of the swords designated in your [[Tengu Weapon Familiarity]] to a new one that you’re wielding, provided the sword meets the specifications of Tengu Weapon Familiarity.
You can [[Interact]] to draw a sword as part of this activity, designating the sword as part of drawing it; disrupting that Interact action prevents you from designating it as one of your swords.
This designation lasts until your next daily preparations.
You were always taught that you needed to be able to use whatever weapon came your way.
You can change any of the swords designated in your [[Tengu Weapon Familiarity]] to different swords that meet the same specifications.
You have to practice with a sword during your daily preparations to designate it, and the designation only lasts until your next daily preparations.
This changes only your proficiency; it doesn’t change your access.
{{||SpellSummaryTable}}
A globe of freezing darkness explodes in the area, dealing 8d10 cold damage to creatures in the area, plus 8d4 additional negative damage to living creatures.
Creatures in the area must attempt a //basic// Reflex save. //On a critical failure, creatures are also [[Blinded]] by the darkness for an unlimited duration.//
If the globe overlaps with an area of magical <<tag Light>>or affects a creature affected by magical light, eclipse burst attempts to [[Counteract]] the light effect.
''Heightened (+1)'' The cold damage increases by 1d10 and the negative damage against the living increases by 1d4.
{{||SpellSummaryTable}}
You force the Material and Ethereal Planes to partially overlap, creating a zone that causes incorporeal and spiritual entities to take on many of the aspects of corporeal creatures.
Within the ectoplasmic interstice, [[Incorporeal]] creatures cannot pass through solid objects or corporeal creatures, and they can manipulate and attempt [[Strength]]-based checks against physical creatures and objects.
An incorporeal PC or other creature with a normal [[Strength]] modifier simply uses that modifier, but if the creature had a Strength modifier of –5, like most incorporeal monsters, it uses a +4 modifier instead, increasing its [[Athletics]] modifier by 9 accordingly.
Attacks against creatures that are within the interstice overcome resistances as if they were by [[Ghost Touch]] weapons.
''Trigger'' An ally benefiting from one of your composition spells is subject to an effect with the <<tag Auditory>>, <<tag Illusion>>, <<tag Linguistic>>, <<tag Sonic>>, or <<tag Visual>> trait.
You tweak the properties of your composition spell to convey a bit of your defensive knowledge.
All allies affected by your composition spell gain your +1 circumstance bonus from [[Well-Versed]] until the start of your next turn.
Teaching your allies also bolsters your own skills; your personal circumstance bonus from [[Well-Versed]] also increases to +2 until the start of your next turn.
You attempt to [[Recall Knowledge]] about a creature, and the GM uses the same secret roll result against the creature’s [[Deception]] or [[Stealth]] DC, giving you the information from a [[Battle Assessment]].
You might get a different degree of success on the Recall Knowledge check than what you get for the Battle Assessment.
If you have the [[Battle Assessment]] feat, you gain the effects of Educated Assessment whenever you Recall Knowledge (such as with the [[Automatic Knowledge]] feat).
Your limbs and even your torso can collapse in on themselves, allowing you to fit through tight spaces as though you were a Small creature.
You can move at full Speed while [[Squeezing|Squeeze]].
Affix to armor.
''Requirements'' You’re an expert in [[Acrobatics]].
Light spring water fizzes and bubbles within this small glass globe, spilling onto the affixed armor when activated ({{OneAction}} [[Interact]]).
Until the end of your turn, the armor lets you move across water and other liquids as if they were solid ground.
If you [[Stride]] or [[Step]] over a weight-sensitive pressure plate, you don’t cause the plate to depress, which prevents you from triggering any device or hazard attached to the pressure plate.
When the ampoule’s effect ends, you sink, fall, break through flimsy ground, or land on pressure plates as normal for your current location.
Thanks to the time you’ve spent studying and experimenting, you know how to scale your formulas into larger batches that don’t require any additional attention.
When spending downtime to [[Craft]] alchemical items, you can produce twice as many alchemical items in a single batch without spending additional preparatory time. For instance, if you are creating elixirs of life, you can craft up to eight elixirs in a single batch using downtime, rather than four.
This does not reduce the amount of alchemical reagents required or other ingredients needed to craft each item, nor does it increase your rate of progress for days past the base downtime spent.
This also does not change the number of items you can create in a batch using [[Advanced Alchemy]].
Your daily preparations are particularly efficient and plentiful.
When using your infused reagents to create alchemical items during your daily preparations (//ie [[Advanced Alchemy]]//), you make a batch of three of a given item instead of a batch of two, or a batch of four if your field normally lets you create three of that item.
You can perform some rituals in less time.
If the ritual normally requires 1 day to cast, you can cast it in 4 hours.
If it takes longer than 1 day, you cast it in half the number of days, rounded up.
''Requirement'' You haven’t acted yet on your turn.
You can maintain a spell with hardly a thought.
You immediately gain the effects of a [[Sustain a Spell]] action, allowing you to extend the duration of one of your active spells.
//You can only use this action on spells gained from the class which gave you this action.//
The magic of your efreeti ancestors flows through you.
You can cast [[Enlarge]] and [[Illusory Object]] once per day each as 2nd-level arcane innate spells.
{{||SpellSummaryTable}}
Your touch disrupts the connection between body and soul, possibly forcing the soul out of the body altogether.
The target must attempt a [[Fortitude]] save.
You can allow allies to choose the degree of success instead of rolling a saving throw.
''Heightened (+3)'' If a willing ally chooses to critically fail, it can stay in soul form for 1 additional round.
{{||SaveSuccessTable}}
You embellish your spellcasting with entrancing flourishes and grand pronouncements, making it harder to identify or counter.
If the next action you use is to [[Cast a Spell]], creatures with the ability to Cast that Spell don’t automatically know what the spell is.
In addition, creatures that witness your spellcasting take a –2 circumstance penalty to checks to identify the spell with [[Recall Knowledge]] and checks to counteract the spell during its casting (such as with [[Counterspell]]).
You can cause your body to twist and flow like the quicksilver within your mutagens.
Whenever you are under the effects of a [[Quicksilver Mutagen]], you can stretch your legs and [[Step]] up to 10 feet, and you can squish and compress your body, allowing you to make it through tight spaces as if you were one size smaller, in addition to any effect from [[Squeezing|Squeeze]].
''Prerequisites'' expert in at least one type of bow.
You blend magic with your archery, leading to powerful results.
If you don’t already cast spells from spell slots, you learn to cast spontaneous spells and gain the [[Cast a Spell]] activity. You gain a spell repertoire with one cantrip of your choice, from a spell list of your choice. You choose this cantrip from the common spells on your chosen spell list or from other spells to which you have access on that list. This cantrip must require a spell attack roll. You’re trained in spell attack rolls and spell DCs for that tradition. Your key spellcasting ability for these spells is [[Charisma]].
If you already cast spells from spell slots, you learn one additional cantrip from that tradition. If you’re a prepared caster, you can prepare this spell in addition to your usual cantrips per day; if you’re a spontaneous caster, you add this cantrip to your spell repertoire.
You also gain [[Eldritch Shot]].
<<archetypefeatlist "8 12 14 16 18 20" "[[Eldritch Archer]]">>
Your nails are supernaturally long and sharp.
You gain a nails unarmed attack that deals 1d6 slashing damage. Your nails are in the brawling group and have the [[Agile]] and [[Unarmed]] traits.
You can etch your nails with runes with the same cost and restrictions as for etching runes onto [[Handwraps of Mighty Blows]]; runes etched onto your nails apply to nails unarmed attacks with both hands but not to other unarmed attacks.
You can deliver hexes through your nails. When you successfully cast a non-cantrip hex that requires 2 actions or more to cast and that doesn’t require a spell attack roll, if your target is within your reach, as part of the spellcasting activity you can make a nails Strike against the foe before applying any effects of the hex. If this Strike misses, the hex has no effect.
''Requirements'' You are wielding a bow;
You [[Cast a Spell]] that takes 1 or 2 actions to cast and requires a spell attack roll. The effects of the spell do not occur immediately but are imbued into the bow you’re wielding.
Make a [[Strike]] with that bow.
Your spell flies with the ammunition, using your attack roll result to determine the effects of both the Strike and the spell.
This counts as two attacks for your [[Multiple Attack Penalty]], but you don’t apply the penalty until after you’ve completed both attacks.
When it comes to a big heist, every rogue worth their salt knows that magic can throw meticulous plans into chaos, whether in the form of arcane wards or pesky divinations. You dabble in magic just enough to help handle these problems by jury-rigging spells and throwing a bit of your own magic into the mix. You might be a solitary thief, performing burglaries that can’t be explained by skill alone, or a specialist called in by other rogues to deal with magical security measures. You might even be on the up-and-up, hired to test magical defenses or even build them yourself.
Choose a multiclass archetype that has a basic, expert, and master spellcasting feat.
You gain that archetype’s dedication feat as a bonus feat even though you don’t meet its level prerequisite, though you must meet its other prerequisites.
For you, the [[Magical Trickster]] rogue feat has a prerequisite of 2nd level instead of 4th level.
You can choose the spellcasting ability score for the multiclass archetype you chose as your key ability score.
{{||SpellSummaryTable}}
An arc of lightning leaps from one target to another.
You deal electricity damage equal to 1d4 plus your spellcasting ability modifier.
''Heightened (+1)'' The damage increases by 1d4.
''Craft Requirements'' Supply one casting of [[Shocking Grasp]].
Shining, slippery eelskin covers the plates of this [[+1|Armor Potency]] [[Resilient]] greater [[Slick]] leather armor.
The armor gives you the ability to breathe water and grants you a +2 item bonus to [[Athletics]] checks to [[Swim]] and [[Stealth]] checks you attempt in the water.
''Activate'' {{TwoAction}} command, interact; ''Frequency'' once per hour; ''Effect'' You cast a 2nd-level [[Shocking Grasp]] with a DC of 29.
Effects with this trait deal electricity damage.
A creature with this trait has a magical connection to electricity.
//Magical electrical effects may not be subject to real-world effects such as grounding, insulation, shorting etc.//
{{||SpellSummaryTable}}
You create an electric latch rune hazard on the target, creating a special crystalline lock on the object.
You can also substitute your spell DC for any of the hazard’s listed DCs.
You can have only one such hazard active at a time, and if you cast this spell while a previous electric latch rune is active, the older hazard discharges harmlessly.
''Heightened (+2)'' The hazard’s damage increases by 1d12.
//Implied by [[Tempest Form]].//
You can electrically charge yourself by taking a single action, which has the Manipulate trait.
Elementals are creatures directly tied to an element and are native to the Elemental Planes.
Elementals don’t need to breathe.
''Frequency'' once per day
You shroud your arms and held weapons in elemental magic.
Choose one element. Until the end of your next turn, your [[Strike]]s deal an additional 1d6 damage of the indicated type and have the trait corresponding to the element: electricity for air, bludgeoning for earth, fire for fire, or cold for water.
{{||SpellSummaryTable}}
You call upon the elements to undermine your foe.
When you Cast this Spell, choose <<tag Air>>, <<tag Earth>>, <<tag Fire>>, or <<tag Water>>.
Each time the target takes damage from a spell or effect with the chosen trait, it takes an additional 2 damage of one damage type dealt by the spell or effect.
If you chose fire or water, the target also takes this additional damage when taking fire or <<tag Cold>> damage, respectively, from effects or spells without the chosen trait.
''Heightened (+2)'' Increase the additional damage by 1.
''Trigger'' An enemy is about to damage you with cold, electricity, or fire, or with a spell that has the air, earth, fire, or water trait.
You call upon the corresponding elements of your suli heritage to resist the effect.
You gain resistance 5 against the triggering damage..
{{||SpellSummaryTable}}
You gather elemental energy and blast your foes in one of the various listed shapes of your choosing, dealing 8d6 bludgeoning damage (or <<tag Fire>> damage if your element is fire).
This spell has your element’s trait.
''Heightened (+1)'' The damage increases by 2d6.
You can summon a harmless but impressive elemental display.
You become trained in [[Intimidation]]. If you would automatically become trained in Intimidation (from your background or class, for example), you instead become trained in a skill of your choice.
When you [[Demoralize]] a foe, if you choose to Demoralize via an elemental display, Demoralize loses the auditory trait and gains the visual trait, and you don’t take a penalty when you attempt to Demoralize a creature that doesn’t understand your language.
''Prerequisites'' low-light vision
You can see in the darkness as easily as an elemental.
You gain [[Darkvision]].
''Special'' You can select this feat only at 1st level, and you can’t retrain into or out of this feat.
You call upon the power of the elements, infusing your ki with elemental energy and allowing your attacks to deal energy damage.
When you cast [[Ki Strike]], in addition to the damage types normally available, you can deliver the extra damage in the form of a gust of storm-tossed wind (dealing <<tag Electricity>> damage and gaining the <<tag Air>> trait), a chunk of stone (dealing <<tag Bludgeoning>> damage and gaining the <<tag Earth>> trait), a flickering flame (dealing <<tag Fire>> damage), or a crashing wave of frigid water (dealing <<tag Cold>> damage and gaining the <<tag Water>> trait).
{{||SpellSummaryTable}}
You call upon the power of the planes to transform into a <<tag Medium>>elemental battle form.
{{BattleFormWithHands}}
When you cast this spell, choose <<tag Air>>, <<tag Earth>>, <<tag Fire>>, or <<tag Water>>. While in this form, you gain the corresponding trait and the elemental trait.
You have hands in this battle form and can take [[Manipulate]] actions.
You can [[Dismiss]] the spell.
You gain the following statistics and abilities regardless of which battle form you choose:
* [[AC]] = 19 + your level. Ignore your armor’s check penalty and [[Speed]] reduction.
* 10 temporary [[Hit Points]].
* [[Darkvision]].
* One or more unarmed melee attacks specific to the battle form you choose, which are the only attacks you can use. You’re trained with them. Your attack modifier is +18, and your damage bonus is +9. These are [[Dexterity]] based (air or fire) or [[Strength]] based (earth or water). If your corresponding unarmed attack modifier is higher, you can use it instead.
* [[Acrobatics]] (air or fire) or [[Athletics]] (earth or water) modifier of +20; ignore this change if your own modifier is higher.
You also gain specific abilities based on the type of
elemental you choose:
* ''Air'' fly Speed 80 feet, movement doesn’t trigger reactions; Melee [one-action] gust, Damage 1d4 bludgeoning.
* ''Earth'' Speed 20 feet, burrow Speed 20 feet; Melee [one-action] fist, Damage 2d10 bludgeoning.
* ''Fire'' Speed 50 feet; fire resistance 10, weakness 5 to cold and 5 to water; Melee [one-action] tendril, Damage 1d8 fire plus 1d4 persistent fire.
* ''Water'' Speed 20 feet, swim Speed 60 feet; fire resistance 5; Melee [one-action] wave, Damage 1d12 bludgeoning, and you can spend an action immediately after a hit to push the target 5 feet with the effects of a successful [[Shove]].
''Heightened (6th)'' Your battle form is <<tag Large>>and your attacks have 10-foot reach. You must have space to expand or the spell is lost. You instead gain AC = 22 + your level, 15 temporary HP, an attack modifier of +23, a damage bonus of +13, and Acrobatics or Athletics +23.
''Heightened (7th)'' Your battle form is <<tag Huge>>and your attacks have 15-foot reach. You must have space to expand or the spell is lost. You instead gain AC = 22 + your level, 20 temporary HP, an attack modifier of +25, a damage bonus of +11, double the number of damage dice (including persistent damage), and Acrobatics or Athletics +25.
You shout the name of an elemental lord and dash this glassy gem against a hard surface to activate it ({{TwoAction}} Command, Interact).
It cracks open, casting a 5th-level [[Summon Elemental]] spell to summon forth an elemental you control as long as you spend an action each round to Sustain the Activation.
This gem comes in four varieties: transparent for a living whirlwind, light brown for a living landslide, reddish orange for a living wildfire, and blue-green for a living waterfall.
Choose one of the following damage types: <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, or <<tag Fire>>. Once chosen, this can’t be changed.
You gain the [[Energy Emanation]] activity.
You’ve devoted yourself to researching the secrets of the Inner Sphere.
You gain the trained proficiency in your choice of [[Survival]] and either [[Arcana]] or [[Nature]]. If you would automatically become trained in Survival (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in the [[Lore]] associated with your Elemental Plane of origin (such as Plane of Fire Lore).
{{||SpellSummaryTable}}
You call upon your element to propel you, improving your Speed depending on your element.
This spell has your element’s trait.
* ''Air'' You gain a fly Speed equal to your Speed.
* ''Earth'' You gain a burrow Speed of 10 feet.
* ''Fire'' You gain a fly Speed equal to your Speed.
* ''Water'' You gain a swim Speed equal to your Speed and can breathe underwater.
''Heightened (6th)'' You also gain a +10-foot status bonus to your Speeds.
''Heightened (9th)'' The status bonus increases to +20 feet.
You understand the fundamental elements of nature such that you can imbue them into your body and manifest as a living embodiment of those elements.
Add the forms in [[Elemental Form]] to your [[Wild Shape]] list.
Whenever you’re polymorphed into another form using wild shape, you gain resistance 5 to fire.
You can call the four elements to you.
You can spend 10 minutes in concert with nature to replace one of the spells you’ve prepared in one of your druid spell slots with a [[Summon Elemental]] spell of the same level.
{{||SpellSummaryTable}}
Your spellcasting surrounds you in a storm of elemental energy.
If the next action you take is to [[Cast a Spell]] from your wizard spell slots that’s an <<tag Evocation>> spell dealing <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, or <<tag Fire>> damage, a 10-foot [[Emanation]] of energy surrounds you as you cast the spell.
Foes in the area take 1d6 damage per spell level of the spell you just cast of the same damage type the spell deals (choose one if it deals multiple types). Combine the damage from both elemental tempest and the other spell against foes who take damage from both before applying bonuses, penalties, resistance, weakness, and the like.
{{||SpellSummaryTable}}
With a flick of your wrist, you fling a chunk of your elemental matter at your foe.
Make a spell attack roll, dealing 1d8 bludgeoning damage (or <<tag Fire>>damage if your element is fire) on a success, and double damage on a critical success.
This spell has your element’s trait.
''Heightened (+1)'' The damage increases by 1d8.
You have a strong connection with stone and metal.
You gain the trained proficiency rank in [[Crafting]]. If you would automatically become trained in Crafting (from your background or class, for example), you instead become trained in a skill of your choice.
You gain the [[Specialty Crafting]] skill feat for both Stonemasonry and Blacksmithing.
You are so attuned to the land that you can call forth a bolt of energy from your surroundings.
When you gain this feat, select <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, or <<tag Fire>>. You can call to the land to cast the [[Acid Splash]] cantrip as an innate primal spell at will, except the spell has only [[Verbal]] components and deals the type of damage you chose instead of <<tag Acid>> damage; the spell gains the trait appropriate to its damage instead of the acid trait.
A cantrip is heightened to a spell level equalto half your level rounded up.
Your elven blood runs particularly strong, granting you features far more elven than those of a typical half-elf. You may also have been raised among elves, steeped in your elven ancestors’ heritage.
You gain the benefits of the elf heritage of your elven parent or ancestors. You typically can’t select a heritage that depends on or improves an elven feature you don’t have. For example, you couldn’t gain the [[Cavern Elf]]’s darkvision ability if you didn’t have [[Low-Light Vision]]. In these cases, at the GM’s discretion, you might gain a different benefit.
''Special'' You can take this feat only at 1st level, and you can’t retrain out of this feat or into this feat.
You move in a graceful dance, and even your steps are broad.
You [[Step]] 5 feet twice.
You gain the [[Resist Elf Magic]] reaction. //(This resists all magic, not just that of elves.)//
Your magic rivals that of lesser dragons.
Choose one 3rd‑level spell and one 4th-level spell from those listed for a dragon spellcaster of your draconic exemplar’s type.
You can cast each of these spells once per day as arcane innate spells.
| !Dragon | !3rd | !4th |
| Black | [[Slow]], [[Stinking Cloud]], [[Paralyze]] | [[Clairvoyance]], [[Dimension Door]], [[Suggestion]] |
| Blue | [[Dream Message]], [[Hypnotic Pattern]], [[Paralyze]] | [[Dimension Door]], [[Hallucinatory Terrain]], [[Clairvoyance]] |
| Green | [[Dispel Magic]], [[Locate]], [[Mind Reading]] | [[Clairvoyance]], [[Dimension Door]], [[Stoneskin]] |
| Red | [[Grease]], [[Haste]], [[Mind Reading]] | [[Crushing Despair]], [[Invisibility]], [[Stoneskin]] |
| White | [[Earthbind]], [[Haste]], [[Vampiric Touch]] | [[Charm]], [[Dimension Door]], [[Freedom of Movement]] |
| Brass | [[Earthbind]], [[Paralyze]] | [[Confusion]], [[Dimensional Anchor]], [[Dimension Door]] |
| Bronze | [[Dispel Magic]], [[Mind Reading]], [[Slow]] | [[Dimension Door]], [[Solid Fog]], [[Suggestion]] |
| Copper | [[Dispel Magic]], [[Haste]], [[Meld into Stone]] | [[Confusion]], [[Creation (Spell)]], [[Stoneskin]] |
| Gold | [[Dispel Magic]], [[Haste]], [[Heal]] | [[Discern Lies]], [[Heal]], [[Restoration]] |
| Silver | [[Heal]], [[Paralyze]], [[Wall of Wind]] | [[Freedom of Movement]], [[Read Omens]], [[Restoration]] |
Elixirs of life accelerate a living creature’s natural healing processes and immune system.
Upon drinking this elixir, you regain the listed number of Hit Points and gain an item bonus to saving throws against diseases and poisons for 10 minutes.
| !Type | !Level | !Price | !HP gain | !Item Bonus |
| Minor | 1 | 30 | 1d6 | +1 |
| Lesser | 5 | 300 | 3d6+6 | +1 |
| Moderate | 9 | 1500 | 5d6+12 | +2 |
| Greater | 13 | 6000 | 7d6+18 | +2 |
| Major | 15 | 13000 | 8d6+21 | +3 |
| True | 19 | 80000 | 10d6+27 | +4 |
The elixir of rejuvenation restores a creature to full health and eradicates toxins affecting it. When you drink this elixir, you’re restored to your maximum Hit Points, and all afflictions of 20th level or lower affecting you are removed.
You can instead administer this elixir to a creature that has been dead for a week or less. When you do, that creature is instantly brought back to life with 1 Hit Point and no spell slots, Focus Points, or other daily resources.
''Craft Requirements'' [[Philosopher’s Stone]], true [[Elixir of Life]]
Your mercy grants clarity to those around you just when they need it most.
When you use [[Mercy]], you can instead attempt a [[Counteract]] check to remove the [[Confused]] or [[Stupefied]] conditions, using the source of that condition to determine the counteract level and DC.
If the condition was caused by an ongoing effect and you don’t remove that effect, the condition returns at the end of your next turn.
''Trigger'' A creature misses you with a melee attack.
You slip through your foe’s opening.
[[Stride]] up to your Speed.
This movement doesn’t trigger movement-based reactions from the creature that missed you.
As much as you might care for them, you’ve come to terms with the ephemeral nature of non elves, and it makes their threats feel less troublesome.
If a non-elf rolls a failure on a check to [[Coerce]] you using [[Intimidation]], it gets a critical failure instead (and thus can’t try to Coerce you again for 1 week).
When a non-elf attempts to [[Demoralize]] you, you become temporarily immune for 1 day, instead of 10 minutes.
Elven chain is a chain shirt made of mithral that glitters in even the faintest light.
It grants a +2 item bonus to AC and has no check penalty.
Created by elven artisans employing ancient crafting techniques, elven chain is exceptionally quiet. Unlike other chain shirts—even other mithral chain shirts—elven chain does not have the [[Noisy]] trait.
This suit of armor can be etched with runes like any other mithral chain shirt.
| !Type | !Level | !Price | !Value of Mithral needed | !Hardness | !HP | !BT | !Magic Level Limit |
| Standard-Grade | 13 | 25000 | 3125 | 9 | 36 | 18 | 15 |
| High-Grade | 20 | 520000 | 260000 | 12 | 48 | 24 | Any |
Your senses let you react rapidly.
You gain a +2 circumstance bonus to [[Perception]] checks made as initiative rolls.
Additionally, if your initiative roll result is tied with that of an opponent, you go first, regardless of whether you rolled Perception or not.
You’ve studied in traditional elven arts, learning about arcane magic and the world around you.
You gain the trained proficiency rank in [[Arcana]] and [[Nature]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice. You also become trained in Elven [[Lore]].
While all elves are immune to the paralyzing touch of ghouls, you can shake off flesh-numbing magic of all kinds.
You gain a +1 circumstance bonus to saves against effects that would impose the [[Immobilized]], [[Paralyzed]], or [[Slowed]] conditions.
When you would be immobilized, paralyzed, or slowed for at least 2 rounds, reduce that duration by 1 round.
You are attuned to the weapons of your elven ancestors and are particularly deadly when using them.
Whenever you critically hit using an <<tag Elf>> weapon or one of the weapons listed in [[Elven Weapon Familiarity]], you apply the weapon’s [[Critical Specialization Effect]].
Your elven affinity blends with your class training, granting you great skill with elven weapons.
Whenever you gain a class feature that grants you expert or greater proficiency in certain weapons, you also gain that proficiency in longbows, composite longbows, longswords, rapiers, shortbows, composite shortbows, and all elf weapons in which you are trained.
You favor bows and other elegant weapons. You are trained with longbows, composite longbows, longswords, rapiers, shortbows, and composite shortbows.
In addition, you gain access to all uncommon elf weapons. For the purpose of determining your proficiency, martial elf weapons are simple weapons and advanced elf weapons are martial weapons.
An emanation issues forth from each side of your space, extending out to a specified number of feet in all directions.
For instance, the bless spell’s emanation radiates 5 or more feet outward from the caster.
Because the sides of a target’s space are used as the starting point for the emanation, an emanation from a Large or larger creature affects a greater overall area than that of a Medium or smaller creature.
__An emanation effect includes the target of the emanation, but the creature creating the effect can exclude the target if desired.__
//If an emanation effect has a duration, it moves with the caster unless stated otherwise.//
A peri’s roaring spirit burns in your soul. Peris engage in constant struggle to right the wrongs of their fallen forebears, and that struggle has been passed on to you. You have a direct impulse to right wrongs and better the world.
You gain a +1 circumstance bonus to saving throws against <<tag Fire>> effects, and your perception is unaffected by non-magical flames, fog and smoke.
Your deity’s symbol protects against offensive magic.
When you [[Emblazon an Armament|Emblazon Armament]], you can choose from the following effects instead of the effects listed in that feat. These effects have the same restrictions as the base options.
* ''Shield'' When the wielder has the shield raised, they gain the shield’s circumstance bonus to saving throws against magic, and they can use [[Shield Block]] against damage from their enemies’ spells.
* ''Weapon'' When the weapon’s wielder critically hits with the weapon, they can attempt to [[Counteract]] a spell on their target. __Their counteract level is half their level, rounded up.__ If they attempt to do so, the emblazoned symbol immediately disappears.
Carefully etching a sacred image into a physical object, you steel yourself for battle.
You can spend 10 minutes emblazoning a symbol of your deity upon a weapon or shield.
The symbol doesn’t fade until 1 year has passed, but if you Emblazon an Armament, any symbol you previously emblazoned and any symbol already emblazoned on that item instantly disappears.
The item becomes a religious symbol of your deity and can be used as a divine focus while emblazoned, and it gains another benefit determined by the type of item. This benefit applies only to followers of the deity the symbol represents.
* ''Shield'' The shield gains a +1 status bonus to its Hardness. (This causes it to reduce more damage with the [[Shield Block]] reaction.)
* ''Weapon'' The wielder gains a +1 status bonus to damage rolls.
Your sacred etchings imbue objects with power.
It takes you only 1 minute to emblazon a symbol using [[Emblazon Armament]], and you can have up to four symbols emblazoned at a time. Each item can still have only one symbol emblazoned upon it, and if you exceed the limit of four, the oldest symbol disappears.
These symbols can benefit even those who don’t follow the deity, provided they aren’t directly opposed (as determined by the GM).
You can select a different benefit for each emblazoned symbol, chosen from any you have from [[Emblazon Armament]] or other feats such as [[Emblazon Energy]] or [[Emblazon Antimagic]].
With elemental forces, you make your emblazoned symbols more potent.
When you [[Emblazon an Armament|Emblazon Armament]], you can choose from the following effects instead of the effects listed in that feat. These effects have the same restrictions as the base options.
* ''Shield'' Choose <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, <<tag Fire>>, or <<tag Sonic>>. The wielder gain the shield’s circumstance bonus to saving throws against that damage type and can use [[Shield Block]] against damage of that type. The shield also gains resistance to that damage type equal to half your level if you have a domain spell with a trait matching that type (such as fire).
* ''Weapon'' Choose <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, <<tag Fire>>, or <<tag Sonic>>. The weapon deals an extra 1d4 damage of that type. Increase this extra damage to 1d6 if you have a domain spell with a trait matching that type (such as fire).
''Trigger'' A creature damages you with a melee attack.
Ignoring your pain, you reach out and grab the creature or weapon that caused you harm.
Attempt an [[Athletics]] check to [[Grapple]] the triggering creature or to [[Disarm]] the creature of the triggering weapon.
{{||SpellSummaryTable}}
Devil horns grow from your skull, and your skin takes on features of the devil responsible for your diabolic bloodline.
You gain resistance 5 to <<tag Evil>>, <<tag Fire>>, and <<tag Poison>>, and resistance 1 to physical damage (except silver).
You can take <<tag Good>> damage, even if you aren’t evil, and you gain weakness 5 to good damage.
''Heightened (+2)'' The resistance to evil, fire, and poison increases by 5, the resistance to physical damage (except silver) by 2, and the weakness to good damage by 5.
You are comfortable and socially capable in almost any cultural context.
When you use the [[Society]] skill to [[Subsist]], if you roll a critical failure, you get a failure instead; if you roll a success, you get a critical success instead; and if you roll a critical success, you can provide for another additional creature.
Furthermore, when you attempt a [[Society]] check to [[Recall Knowledge]] about cultural practices and roll a critical failure, you get a failure instead.
You use Emerald Bough techniques to create a small extradimensional space called a hideaway that lasts as long as you are conscious.
The hideaway functions as a type I [[Bag of Holding]], but has no Bulk and takes no hands; it holds one object with a maximum Bulk equal to your highest mental ability score modifier; as you open the hideaway with pure thought, activating it to retrieve an item is a free action with the [[Envision]] component instead of a single action with the Interact component.
The hideaway’s access point appears as an obviously magical gap within 1 foot of your body.
Only you can access the hideaway; you can you use an [[Interact]] action each round to physically hold it open for another person.
A successful [[Dispel Magic]] spell or similar effect against your spell DC and the hideaway’s counteract level of 2 expels the object; the object is also expelled if you become unconscious. After a successful dispel magic spell or when you become conscious again, the hideaway immediately reforms with no additional action from you.
You can also dismiss the hideaway (if it is empty) or re-form it using a single action with the [[Envision]] component.
Affix to armor.
This metal grasshopper studded with emeralds is usually clasped to the legs of a suit of armor.
''Requirements'' You’re an expert in [[Athletics]].
''Trigger'' You attempt a [[High Jump]] but haven't rolled yet.
''Activate'' {{FreeAction}} Envision: When you activate it, if you succeed at the [[Athletics]] check, you Leap up to 50 feet vertically and up to 10 feet horizontally. If you critically succeed, you can Leap up to 75 feet vertically and 20 feet horizontally.
If you don’t end your jump on solid ground, you flutter in the air until the end of your turn, then fall harmlessly at a rate of 60 feet per round until you reach the ground.
Your malfunctioning emotional processors make it difficult for you to feel strong emotions.
You gain a +1 circumstance bonus to saving throws against <<tag Emotion>> and <<tag Fear>> effects.
If you roll a success on a saving throw against an emotion or fear effect, you get a critical success instead.
''Prerequisites'' trained in Diplomacy
''Trigger'' You are attacked by a creature that you haven’t yet [[acted hostile|Hostile Action]] toward. You must use this reaction before the creature rolls its attack.
The way you cringe or use those puppydog eyes you’ve been practicing elicits an empathetic response in the attacker.
Attempt a [[Diplomacy]] check against your attacker’s [[Will]] DC.
{{||ActionSuccessTable}}
Everything comes down to data.
Calculating statistics, running numbers, and using inductive reasoning allows you to determine the most likely outcome of any scenario, and anything out of place draws your keen attention.
You are trained in one [[Intelligence]]-based skill of your choice.
You gain the [[That’s Odd]] investigator feat, and you gain the [[Expeditious Inspection]] free action.
{{||SpellSummaryTable}}
You turn ethereal, with the effects of [[Ethereal Jaunt]], but you don’t need to concentrate.
//Implied by [[Cheek Pounches]].//
You can empty your mouth with a single action, causing everything you had stored in your cheek pouches to fall to the ground in your square.
{{||SpellSummaryTable}}
You inject a sliver of the void into your mind, momentarily remaking it into a bleak and empty place.
Attempt a [[Counteract]] check against one <<tag Emotion>> effect affecting you.
''Heightened (5th)'' You can attempt counteract checks against any number of emotion effects affecting you.
Your spirit is open to the secrets of beyond, granting you greater access to kitsune magic. You gain the [[Kitsune Spell Familiarity]] ancestry feat. Your alternate form is a common Medium humanoid ancestry prevalent where you grew up (typically human), called a tailless form.
You can call forth a benediction upon your allies, whether you pray to a deity of the celestial realms or just find the power within yourself.
You can cast [[Bless]] once per day as a 1st-level divine innate spell.
With a single whisper carried on the wind, you enchant your ammunition to make a foe more vulnerable to your attacks.
Make a bow [[Strike]].
On a hit, the target takes an additional 2d6 <<tag Mental>> damage. On a critical hit, the target also becomes [[Stunned]] 1.
The mental damage increases to 3d6 if your bow has a greater [[Striking]] rune, or to 4d6 if your bow has a major [[Striking]] rune.
Enchantments affect the minds and emotions of other creatures—sometimes to influence and control them, and other times to bolster them to greater heights of courage.
Enchantment spells almost always have the <<tag Mental>> trait, and many have the <<tag Emotion>>trait or the <<tag Fear>>trait.
<<schoolspelllist "Enchantment">>
You are carrying more weight than you can manage.
While you’re encumbered, you’re [[Clumsy]] 1 and take a 10-foot penalty to all your Speeds. As with all penalties to your Speed, this can’t reduce your Speed below 5 feet.
During your daily preparations, you find medicinal plants endemic to your location.
Until your next preparations, you can spend an additional batch of herbs to add a benefit to an item you create with your herbalism.
The benefit of the special herbs affects the creature that the item is applied to; if the benefit is not immediate, it lasts for 1 minute unless otherwise stated.
This adjustment counts as an <<tag Additive>>, so you can’t include another additive without spoiling the item.
* ''Aquatic'' Gain a +1 circumstance bonus to [[Fortitude]] saves.
* ''Arctic'' For 1 hour, treat environmental cold effects as if they were one step less severe.
* ''Desert'' For 1 hour, treat environmental heat effects as if they were one step less severe.
* ''Forest'' Gain a +2 circumstance bonus to saves against disease and poison effects.
* ''Mountain'' Gain a +1 circumstance bonus to Reflex saves.
* ''Plains'' Gain a +1 circumstance bonus to Will saves.
* ''Swamp'' Remove one source of persistent bleed damage.
* ''Underground'' Gain a +1 circumstance bonus to Perception.
You don’t need to eat, drink, or breathe.
In addition, you can cast the [[Wholeness of Body]] ki spell almost effortlessly. You can cast it as a [[Free]] action that triggers at the start of your turn.
{{||SpellSummaryTable}}
You invigorate the touched creature’s mind and urge it to press on.
You grant the touched creature 5 temporary Hit Points.
''Heightened (+1)'' Increase the temporary Hit Points by 5.
{{LOCGFeat}}
''Prerequisites'' Expert in medium or heavy armor
''Trigger'' An undead hits you with an unarmed attack.
''Requirements'' You are wearing medium or heavy armor in which you have expert proficiency.
Your conviction redirects the undead’s attack through your armor and then harmlessly away.
You gain resistance 5 to physical damage and resistance 10 to negative damage against the triggering attack.
You gain a +2 circumstance bonus on any saving throws against effects from the undead’s natural attack; if you succeed at the saving throw, you get a critical success instead.
{{||SpellSummaryTable}}
You shield the target against dangerous temperatures.
Choose severe cold or heat. The target is protected from the temperature you chose (but not extreme cold or heat).
''Heightened (3rd)'' The target is protected from severe cold ''and'' heat.
''Heightened (5th)'' The target is protected from severe cold, severe heat, extreme cold, and extreme heat.
You’ve learned how to make your personal energy last just a little bit longer when quickly brewing ad hoc concoctions.
When using [[Quick Alchemy]] to create an alchemical tool or elixir, that tool or elixir remains potent until the end of your next turn, instead of losing its potency at the start of your next turn.
''Frequency'' once per minute
''Trigger'' You apply a <<tag Debilitation>> to a creature.
You can make your debilitation last an exceptionally long time.
The triggering debilitation lasts for 1 minute instead of until the end of your next turn.
{{||SpellSummaryTable}}
''Trigger'' An attack or effect would deal damage to you.
Your own might mingles with divine power to protect you.
You gain resistance equal to 8 plus your [[Strength]] modifier against all damage from the triggering attack or effect.
''Heightened (+1)'' The resistance increases by 2.
You move as fast and as high as the wind itself.
You’re permanently [[Quickened]].
You can use your extra action to [[Stride]] or [[Leap]], or to provide one of the actions needed for a [[High Jump]] or [[Long Jump]].
''Trigger'' You would take acid, cold, electricity, fire, or sonic damage from a spell.
''Requirements'' You have an unexpended spell slot of a level equal to or higher than the triggering spell.
Your blood resonates with magical energy, mitigating the effects of harmful spells.
Expend one of your spell slots of a level equal to or higher than that of the triggering spell.
You gain resistance to one of the triggering effect’s damage types equal to twice the expended spell slot’s level.
''Frequency'' once per hour
You stoke your magic to energize your wings, temporarily transforming them into glowing, majestic forms.
For 1 minute, you gain a fly Speed of 30 feet.
''Prerequisites'' focus pool, at least one innate spell from a gnome heritage or ancestry feat that shares a tradition with at least one of your focus spells.
''Frequency'' once per day.
The magic within you provides increased energy you can use to focus.
You regain 1 Focus Point, up to your usual maximum.
When you cast energy spells, you retain some of that energy as a protective barrier.
If your next action is to Cast a Spell that deals energy damage, whether or not it successfully deals damage, you gain resistance to that type of energy equal to the spell’s level (minimum 1) until the end of your next turn.
If the spell deals more than one type of energy damage, choose one and gain resistance to that type.
{{||SpellSummaryTable}}
''Trigger'' An effect would deal acid, cold, electricity, or fire damage to you.
You gain resistance 15 to <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, or <<tag Fire>> damage from the triggering effect (one type of your choice).
The resistance applies only to the triggering effect’s initial damage.
''Heightened (+1)'' The resistance increases by 5.
{{||SpellSummaryTable}}
You protect the target with a powerful, long-lasting energy barrier.
The target gains resistance 5 to <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, <<tag Fire>>, <<tag Force>>, <<tag Negative>>, <<tag Positive>>, and <<tag Sonic>>damage.
''Heightened (9th)'' The resistances increase to 10.
Energy runs through your blood more powerfully.
When you use [[Energy Emanation]], you can create an emanation of 5 feet, 10 feet, or 15 feet.
The damage increases to 6d6 plus an additional 1d6 for every level you have above 9th, instead of 1d6 plus an additional 1d6 for every 2 levels above 1st.
''Frequency'' Once per day.
Energy bursts forth from your body.
You deal 1d6 damage of //the type chosen when you picked [[Elemental Heart Dwarf]]// to all adjacent creatures (basic [[Reflex]] save using your class DC or spell DC, whichever is higher).
At 3rd level, and every 2 levels thereafter, this damage increases by 1d6.
You fuse two spells together, combining their energy types.
If the next action you use is to [[Cast a Spell]] that deals acid, cold, electricity, fire, or sonic damage, select a non-cantrip spell in your spell repertoire that deals a different type of energy damage from that list, and expend an additional spell slot of the same level as this secondary spell.
The spell you cast deals additional damage equal to the level of the secondary spell slot expended.
The spell’s total damage is divided evenly between the energy type of the spell you cast and the energy type of the secondary spell.
When created, this mutagen is attuned to your choice of one of four energy types: acid, cold, electricity, or fire.
When consumed, the mutagen suffuses your body with energy that spills out of you whenever you attack. At higher levels, it can even grant you the ability to unleash the energy in controlled bursts.
''Benefit'' You gain resistance to the attuned energy type. Whenever you score a hit with a melee weapon, add the listed amount of damage of the attuned energy type.
The more expensive versions of this mutagen allow you to end the benefit to unleash a 30-foot cone of energy that deals damage of the attuned type with a basic [[Reflex]] save.
''Drawback'' You gain weakness 5 to the other three energy types.
| !Type | !Level | !Price | !Resistance | !Extra Damage | !Duration | !Cone Damage | !Reflex DC |
| Lesser | 1 | 40 | 5 | 1 | 1 minute |
| Moderate | 3 | 120 | 10 | 1d4 | 10 minutes |
| Greater | 11 | 3000 | 15 | 1d6 | 1 hour | 2d6 per 10 mins remaining | 25 |
| Major | 17 | 30000 | 20 | 2d6 | 1 hour | 3d6 per 10 mins remaining | 32 |
''Frequency'' once per turn
''Requirements'' Your most recent action was to cast a non‑cantrip spell that dealt energy damage.
You trap energy from the last spell you cast within your body, coating your flesh in a protective ward.
Until the start of your next turn, you gain resistance 5 to one type of energy damage dealt by the spell you just cast.
''Usage'' etched onto armor.
These symbols convey protective forces from the Elemental Planes. You gain resistance to <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, or <<tag Fire>>. The crafter chooses the damage type when creating the rune.
Multiple energy-resistant runes can be etched onto a suit of armor; rather than using only the highest-level effect, each must provide resistance to a different damage type. For instance, a +2 acid-resistant greater fire-resistant breastplate would give you acid resistance 5 and fire resistance 10.
| !Type | !Level | !Price | !Resistance granted |
| (standard) | 8 | 4200 | 5 |
| Greater | 12 | 16500 | 10 |
{{||SpellSummaryTable}}
Extending a finger, you fire a beam of negative energy that weakens the life force of any creature it touches.
Each living creature in the line must attempt a [[Fortitude]] save.
{{||SaveSuccessTable}}
You’re physically weakened.
Enfeebled always includes a value. When you are enfeebled, you take a status penalty equal to the condition value to [[Strength]]-based rolls and DCs, including Strength-based melee attack rolls, Strength-based damage rolls, and [[Athletics]] checks.
''Frequency'' once per hour
''Prerequisites'' You’ve sworn to an oath against a specific type of creature.
You call on your oath to embolden you in combat.
When you Enforce your Oath, select one creature you can see that you’ve sworn to defeat as part of your oath.
You gain a +1 status bonus to AC and saves against attacks and effects by the chosen creature. You also gain a +1 status bonus to attack rolls against the chosen creature.
However, your dedication to Enforcing your Oath draws your focus away from all other foes.
While you are Enforcing your Oath, you take a –1 status penalty to AC, attack rolls, and saves against all other creatures until you stop Enforcing your Oath.
You stop Enforcing your Oath once the chosen creature is reduced to 0 Hit Points or offers a legitimate surrender to you or your allies.
You immediately stop Enforcing your Oath if you are [[Unconscious]] or if the chosen creature goes [[Unnoticed]] by you for more than 1 minute.
You can also stop Enforcing your Oath at any time during your turn as a free action.
You never fail to strike down the ever-expanding reaches of chaos.
All your weapon and unarmed Strikes deal 1 additional lawful damage and have the <<tag Lawful>> and <<tag Magical>> traits.
The monster [[Stride]]s up to double its Speed and can move through the spaces of any creatures in its path.
Any creature of the monster’s size or smaller whose space the monster moves through can attempt a [[Reflex]] save with the listed DC to avoid being engulfed. A creature unable to act automatically critically fails this save.
If a creature succeeds at its save, it can choose to be either pushed aside (out of the monster’s path) or pushed in front of the monster to the end of the monster’s movement.
The monster can attempt to Engulf the same creature only once in a single use of Engulf.
The monster can contain as many creatures as can fit in its space.
A creature that fails its save is pulled into the monster’s body. It is [[Grabbed]], is [[Slowed]] 1, and has to hold its breath or start suffocating.
The creature takes the listed amount of damage when first engulfed and at the end of each of its turns while it’s engulfed.
An engulfed creature can get free by [[Escaping|Escape]] against the listed escape DC.
An engulfed creature can attack the monster engulfing it, but only with unarmed attacks or with weapons of light Bulk or less. The engulfing creature is [[Flat-Footed]] against the attack.
If the monster takes piercing or slashing damage equaling or exceeding the listed Rupture value from a single attack or spell, the engulfed creature cuts itself free.
A creature that gets free by either method can immediately breathe and exits the swallowing monster’s space.
If the monster dies, all creatures it has engulfed are automatically released as the monster’s form loses cohesion.
{{||SpellSummaryTable}}
You transform the target into delicious fare, changing water into wine or another fine beverage or enhancing the food’s taste and ingredients to make it a gourmet treat.
Prior to the transformation, the spell attempts to [[Counteract]] any <<tag Poison>>s in the food or water.
The food turns back to normal if not consumed before the duration expires, though any poisons that were counteracted are still gone.
''Heightened (+1)'' The number of gallons of water you can target increases by 1, or the number of pounds of food you can target increases by 5.
''Prerequisites'' A [[Familiar|Familiar (Rule)]].
You infuse your familiar with additional magical energy.
You can select four familiar or master abilities each day, instead of two.
''Special'' If your arcane thesis is [[Improved Familiar Attunement]], your familiar’s base number of familiar abilities, before adding any extra abilities from the arcane thesis, is four.
Your muse is a mystery, driving you to uncover the hidden secrets of the multiverse. If your muse is a creature, it might be a dragon or otherworldly being; if a deity, it might be //the god of magic or knowledge//.
You gain the [[Bardic Lore]] feat and add [[True Strike]] to your spell repertoire.
Your muse whispers knowledge to you at all the right times.
You gain the benefits of the [[Automatic Knowledge]] skill feat with any skill you can use to [[Recall Knowledge]].
As per the special clause in the [[Automatic Knowledge]] feat, you can still only use [[Automatic Knowledge]] once per round.
{{||SpellSummaryTable}}
Bolstered by magical power, the target grows to size <<tag Large>>.
Its equipment grows with it but returns to natural size if removed.
The creature is [[Clumsy]] 1.
Its reach increases by 5 feet (or by 10 feet if it started out Tiny), and it gains a +2 status bonus to melee damage.
This spell has no effect on a Large or larger creature.
''Heightened (4th)'' The creature instead grows to size <<tag Huge>>. The status bonus to melee damage is +4 and the creature’s reach increases by 10 feet (or 15 feet if the creature started out Tiny). The spell has no effect on a Huge or larger creature.
''Heightened (6th)'' __Choose the 2nd-level or 4th-level version of this spell and apply its effects__ to up to 10 __willing__ creatures.
{{||SpellSummaryTable}}
Your animal companion grows much larger, towering over its foes in battle.
Your animal companion becomes <<tag Huge>>, gaining the effects of a 4th-level [[Enlarge]] spell.
You exude an aura of resolve.
You and allies within 15 feet of you gain a +2 status bonus to Will saving throws against mental effects.
{{||SpellSummaryTable}}
Plants in the area entangle creatures.
The area counts as [[Difficult Terrain]].
Each round that a creature starts its turn in the area, it must attempt a [[Reflex]] save.
On a failure, it takes a –10-foot circumstance penalty to its Speeds until it leaves the area, and
on a critical failure, it is also [[Immobilized]] for 1 round.
Creatures can attempt to [[Escape]] at entangle’s DC to remove these effects.
{{||SpellSummaryTable}}
Your words fascinate your targets.
You speak or sing without interruption throughout the casting and duration.
Targets who notice your speech or song might give their undivided attention; each target must attempt a [[Will]] save.
The GM might grant a circumstance bonus (to a maximum of +4) if the target is of an opposing religion, ancestry, or political leaning, or is otherwise unlikely to agree with what you’re saying.
Each creature that comes within range has to attempt a save when you [[Sustain the Spell|Sustain a Spell]].
If you’re speaking, enthrall gains the <<tag Linguistic>>trait.
{{||SaveSuccessTable}}
The powers of domination employed by your progenitors have manifested in you as well.
Once per day, you can cast [[Charm]] as a 1st-level divine innate spell.
You have a small group of admirers who tend to follow you around while you’re in civilized settlements.
Your admirers are helpful to you, allowing you to make simple [[Request]]s of them such as purchasing basic equipment with your funds or finding a room at an inn.
These admirers do not travel with you to places that are obviously dangerous, including most adventure locations, but they’ll wait for you at the nearest settlement.
Your admirers never use actions in encounter mode other than to retreat, and they abandon you if you intentionally bring them harm or at the GM’s discretion.
When you [[Gather Information]], you can use your admirers to assist you, granting a +1 circumstance bonus to your Diplomacy check and reducing the time it takes even further (typically to 30 minutes, rather than 1 hour with the Hobnobber feat alone).
If you have the [[Sow Rumor]] feat, you can have your admirers assist you, with the same benefits as Gather Information.
{{||SpellSummaryTable}}
Your eyes glow with an entrancing radiance that captivates those who meet your gaze.
Any creature that ends its turn within the emanation must attempt a [[Will]] save.
{{||SaveSuccessTable}}
During any round you Sustain the Spell, you can use a single action, which has the <<tag Manipulate>> trait, to focus your entrancing eyes on a single creature you can see within 30 feet. This creature must immediately make a Will save against the spell as if it were ending its turn in the emanation.
If the creature was already fascinated by your entrancing eyes before its save, a failed save causes it to be [[Paralyzed]] for 1 round. You can’t use this action to focus on the same creature more than once per round.
''Prerequisites'' a bloodline that corresponds with a creature trait.
Something about your presence causes creatures of your bloodline to, consciously or not, recognize you as one of their own, and you become inured to their tricks.
You gain a +1 circumstance bonus to [[Diplomacy]], [[Deception]], and [[Intimidation]] checks when interacting with creatures that have the trait corresponding to your bloodline, and you gain a +1 circumstance bonus to [[Perception]] and saving throws against such creatures.
For example, an aberrant bloodline sorcerer would gain this benefit against creatures with the aberration trait.
The GM is the final arbiter of which creatures match your bloodline.
You envenom your fangs.
If the next fangs [[Strike]] you make before the end of your next turn hits and deals damage, the Strike deals an additional 1d6 poison damage.
On a critical failure, the poison is wasted as normal. //The context of this sentence is unclear, and you do not need to be carrying poison to envenom your fangs.//
''Prerequisites'' Deity who grants the cold, fire, nature, or travel domain.
You rapidly adapt to environments through a combination of skill, meditation, and divine grace.
After spending an hour in an environment of severe cold or colder, you are protected from the effects of severe cold until you leave that environment.
After spending an hour in an environment of severe heat or hotter, you are protected from the effects of severe heat until you leave that environment.
{{||SpellSummaryTable}}
You create illusory hazards, such as spinning blades or a puddle of acid, in four 10-foot-by-10-foot spaces within range.
The hazards are merely a mental projection, and a creature receives a [[Will]] save each time it touches a hazard or is occupying one’s space at the start of its turn.
Depending on the result, the creature takes 4d6 mental damage and might have difficulty moving through the area. A creature can take this damage only once per turn, even if it moves through several hazards.
Choose <<tag Bludgeoning>>, <<tag Slashing>>, <<tag Piercing>>, <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, <<tag Fire>>, or <<tag Sonic>> damage when you cast ephemeral hazards; resistances and weaknesses to those damage types apply if the target thinks they do, as judged by the GM.
You can freely choose the appearance and damage type of each hazard as long as its appearance reflects the type of damage it deals (for instance, a hazard that deals piercing damage might take the form of sharpened spikes).
''Heightened (+1)'' The damage increases by 1d6.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You can look at currents in the air and water and see tracks that you can follow just as you would on land.
You can use [[Survival]] to [[Track]] through both air and water, noticing aerial or aquatic “tracks” of all creatures who passed nearby in the last hour.
It’s more difficult to Track in this way: the DC to Track through air or water is always at least 30, or higher after precipitation or wind (in the air) or heavy tides or currents (in the water).
It’s possible to [[Cover Tracks]] against this spell, but creatures might not realize they need to do so.
{{||SpellSummaryTable}}
A massive deluge of life energy causes the undead to fall apart.
Each <<tag Undead>>creature in the area takes 4d12 positive damage //with a basic [[Fortitude]] save.//
''Heightened (+1)'' The damage increases by 1d12.
You attempt to escape from being [[Grabbed]], [[Immobilized]], or [[Restrained]].
Choose one creature, object, spell effect, hazard, or other impediment imposing any of those conditions on you.
Attempt a check using your unarmed attack modifier against the DC of the effect. This is typically the [[Athletics]] DC of a creature grabbing you, the [[Thievery]] DC of a creature who tied you up, the spell DC for a spell effect, or the listed [[Escape]] DC of an object, hazard, or other impediment.
You can attempt an Acrobatics or Athletics check instead of using your attack modifier if you choose (but this action still has the attack trait).
{{||ActionSuccessTable}}
You can use clever workarounds to replicate the arcane essence of certain materials.
When [[Casting a Spell|Cast a Spell]] that requires material components, you can provide these material components without a spell component pouch by drawing intricate replacement sigils in the air.
Unlike when providing somatic components, you still must have a hand completely free.
This doesn’t remove the need for any materials listed in the spell’s cost entry.
''Prerequisites'' tenets of good.
You’ve sworn an oath to slay the alien abominations that lurk in the remote corners of Golarion.
Add the following tenet to your champion’s code, after the other tenets. “You must slay evil aberrations you encounter as long as you have a reasonable chance of success.”
Your [[Retributive Strike]] gains a +4 circumstance bonus to damage against an evil aberration, or +6 if you have master proficiency with the weapon you used.
The resistance you gain from [[Glimpse of Redemption]] against damage from an evil aberration is 7 + your level.
If you use [[Liberating Step]] triggered by an evil aberration, your ally gains a +4 circumstance bonus to checks granted by your Liberating Step, and the ally can Step twice afterward.
You don’t consider evil aberrations to be legitimate authorities, even in nations they rule.
You keep a book of occult spells, similar to a wizard’s spellbook, and can use its spells to
supplement your spell repertoire.
Add all the spells in your repertoire to this book for free.
You can use the [[Occultism]] skill to [[Learn Spell|Learn a Spell]]s and add them to your spellbook by paying the appropriate cost, similar to a wizard.
During your daily preparations, choose any one spell from your book of occult spells. If that spell is already in your spell repertoire, you can treat it as an additional [[Signature Spell|Signature Spells]] that day. If it isn’t in your repertoire, treat it as though it were until your next daily preparations.
{{||SpellSummaryTable}}
You bind a part of your essence to your surroundings, creating a warded area that grants you power within it, but drains you outside of it.
While within the area, you can make nature’s wrath [[Strike]]s by commanding plants, wind, rocks, and other natural features to attack enemies. These are melee Strikes that use your spell attack modifier, can target any creature within the ward, and deal bludgeoning, piercing, or slashing damage equal to 2d8 plus your spellcasting ability modifier.
Upon Casting the Spell, you can immediately make a single nature’s wrath Strike.
You are [[Quickened]] while inside the ward, and can use the additional action only to make nature’s wrath [[Strike]]s.
You are [[Slowed]] 1 while outside the area.
''Heightened (+2)'' The area increases by 5 feet, and the Strikes deal an additional 1d8 damage.
Your polite manners and natural ability to comfort others make it easy for you to break down cultural barriers and earn strangers’ trust.
While you are in a settlement, when you roll a critical failure on a [[Diplomacy]] check to [[Gather Information]] or [[Make an Impression]], you get a failure instead.
''Prerequisites'' evil alignment
A life of evil has made you a nexus for your deity’s vile power.
You’re continuously surrounded by a [[Bane]] spell with a spell level equal to half your level (rounded up).
The radius is 15 feet, and you can’t increase it.
You can [[Dismiss]] the spell; if you do, it returns automatically after 1 minute.
''Prerequisites'' good alignment
Your good deeds have brought your deity’s grace to you for all of eternity.
You’re continuously surrounded by a [[Bless]] spell with a spell level equal to half your level (rounded up).
The radius is 15 feet, and you can’t increase it.
You can [[Dismiss]] the spell; if you do, it returns automatically after 1 minute.
The world is a stage upon which you are always playing.
You are permanently [[Quickened]]; you can use your extra action only to cast a composition cantrip that requires 1 action to cast.
While in exploration mode, you can declare that you are performing an eligible composition cantrip while using any exploration tactic.
Even before your first turn in a combat encounter, that cantrip is active as if you had cast it on your previous turn.
As a swashbuckler at the peak of your skill, you swell with confidence and bravado in every attack.
Your proficiency rank for your swashbuckler class DC increases to master.
When you [[Strike]] as part of a finisher or [[Opportune Riposte]], you can give the Strike the failure effect from the [[Confident Finisher]] action, including the increase from [[Precise Finisher]] if you have that feat.
You can do so only if the Strike uses a weapon or unarmed attack that you could use for Confident Finisher.
''Prerequisite'' [[Extend Elixir]].
Your body readily accepts and retains minor changes.
When you drink one of your alchemical items that has the <<tag Elixir>> and <<tag Infused>> traits and a duration of 1 minute or more, you can make the elixir’s duration indefinite.
You can do so only if the elixir’s level is half your level or lower.
If you later consume a different elixir and make it indefinite, the effect of the previous indefinite elixir ends.
Your wings are now a permanent part of your body.
You gain the effects of [[Celestial Wings]] at all times, rather than just once per day for 10 minutes.
Your wings are now a permanent part of your body.
You gain the effects of Wings of Air at all times rather than just once per day for 10 minutes.
''Usage'' etched onto armor.
An ethereal rune replicates armor on the Ethereal Plane.
''Activate'' {{OneAction}} command; ''Frequency'' once per day; ''Effect'' You gain the effects of an [[Ethereal Jaunt]] spell. This doesn't require concentration and lasts for 10 minutes or until you choose to return to material form as a free action.
''Craft Requirements'' Supply a casting of 9th level [[Ethereal Jaunt]].
Ethereal creatures are natives of the Ethereal Plane.
They can survive the basic environmental effects of the Ethereal Plane.
{{||SpellSummaryTable}}
You travel to the Ethereal Plane, which overlaps the Material Plane.
Material Plane creatures can’t see you, and you can move through things on the Material Plane.
You move at half your normal Speeds, but can move in any direction (including up and down).
You can see onto the Material Plane within a radius of 60 feet; it is gray, hazy, and [[Concealed]] from you.
You can’t affect the Material Plane, and you can’t be affected by the Material Plane except by <<tag Force>> effects and <<tag Abjuration>>s originating there.
When the spell ends, you return to the Material Plane. If you’re in the air, you fall (unless you can fly), and if you’re inside an object, you’re pushed into the nearest open space and take 1d6 damage per 5 feet you were pushed.
If you cast this spell when not on the Material Plane, it is lost.
''Heightened (9th)'' You can target up to five additional willing creatures at a range of 30 feet. The duration is up to 10 minutes.
You can elude supernatural disaster.
When you would gain the [[Doomed]] condition, you can attempt a DC 17 flat check. On a success, you don’t gain the doomed condition.
You’ve manifested wings that can flutter for brief spurts.
You don’t need to spend any additional actions to reach something in your space that a Medium creature could reach. For instance, if you wanted to open a cookie jar located four feet off the ground, you only need to spend a single Interact action to do so.
When you use Evanescent Wings to flutter to a higher place in your space, your action gains the <<tag Move>> trait.
''Prerequisites'' You follow a deity or philosophy.
You point out a detail that incontrovertibly supports your faith, causing a listener’s mind to whirl.
Attempt a [[Diplomacy]] check and compare the result to the [[Will]] DC of a single target that can hear you and understands your language.
That target is then temporarily immune to Evangelize with respect to your deity or philosophy for 1 day.
A creature that already agrees with you is unaffected, and at the GM’s discretion, a target that genuinely changes its perspective to support your faith as a result of the argument is also otherwise unaffected.
{{||ActionSuccessTable}}
You’ve learned to move quickly to avoid explosions, dragon’s breath, and worse.
Your proficiency rank for [[Reflex]] saves increases to master. When you roll a success
on a Reflex save, you get a critical success instead.
''Prerequisites'' Expert in [[Reflex]] saves.
Your proficiency rank for [[Reflex]] saves increases to master.
An everburning torch is one of the most common applications of permanent magic.
This torch sheds light constantly, requiring no oxygen and generating no heat.
The flame can be covered or hidden, but can’t be smothered or quenched.
{{LOCGFeat}}
''Requirements'' You are wielding a shield.
You brace your shield with both hands, enhancing its potential for both offense and defense.
When in this stance, you wield the shield with both hands.
When wielding a shield this way, increase the weapon damage die of the shield’s boss or spikes by one step, and increase the shield’s Hardness by 2 when using the [[Shield Block]] reaction.
{{LOCGFeat}}
''Requirements'' You are wielding a shield in two hands.
Your follow-up blow leaves you an opening to set your shield.
Make a [[Strike]] with the wielded shield.
If the Strike hits and deals damage, you also [[Raise your Shield]].
''Trigger'' You fail, but don’t critically fail, an attempt to [[Disable a Device]] on a trap.
You intentionally set off the trap, but you take special precautions to protect yourself and your allies from the trap’s effects.
For the next 2 rounds, if the trap rolls a critical success on an attack roll, it gets a normal success instead, and if anyone rolls a critical failure on their saving throw against the trap, they get a normal failure instead.
You are so suspicious of everyone you meet that you keep mental notes on how to defeat them all—even your own allies.
After interacting with a creature for at least 1 minute, you automatically [[Pursue a Lead]] with that creature as the subject.
You can have any number of such leads at any given time, and when you Pursue a Lead again, you don’t give up any of these automatic subjects.
{{||SpellSummaryTable}}
Your fix your eye on the target, imposing a malevolent hex.
The target becomes [[Frightened]] based on the results of its [[Will]] save.
This condition value can’t be reduced below 1 while the spell is active and you can see the target.
Regardless of the outcome, the target is then temporarily immune for 1 minute.
{{||SaveSuccessTable}}
Evocations capture magical energy and then shape it to harm your foes or protect your allies.
Evocation spells often have a trait that comes from the type of damage they deal, such as <<tag Acid>>, <<tag Cold>>, <<tag Fire>>, <<tag Force>>, or <<tag Sonic>>.
You make a controlled attack, fully accounting for your momentum.
Make a [[Strike]]. The Strike gains the following failure effect: On failure, this attack does not count toward your [[Multiple Attack Penalty]].
{{AoA3Spell}}
{{||SpellSummaryTable}}
You must have the humanoid trait to cast this spell.
You trade appearances with the target, with the effects depending on the result of the target’s [[Will]] saving throw.
[[Willing]] and [[Unconscious]] targets automatically critically fail this saving throw.
{{||SaveSuccessTable}}
You execute your finishing moves with spectacular flair, adding special effects to your finishers.
If a [[Strike]] you make as part of a <<tag Finisher>> hits a foe, you add one of the following effects to the Strike, depending on your swashbuckler’s style.
[[Battledancer]]: You can [[Step]] as a free action immediately after the finisher.
[[Braggart]]: If the foe was temporarily immune to your [[Demoralize]], their temporary immunity ends.
[[Fencer]]: The foe is [[Flat-Footed]] until your next turn.
[[Gymnast]]: If the foe is [[Grabbed]], [[Restrained]], or [[Prone]], you gain a circumstance bonus to the damage roll equal to twice the number of weapon damage dice.
[[Wit]]: The foe takes a –2 circumstance penalty to attack rolls against you until the start of your next turn.
''Requirements'' You were within the area of an inhaled poison within the last minute.
''Frequency'' once per hour.
You sharply exhale the poison that previously surrounded you in a 15-foot cone.
Creatures in the area are affected by the poison; the poison’s DC and effects are unchanged.
''Prerequisites'' Follower of a specific religion.
Your knowledge of the tenets of your faith gives you insight into the best ways to get others of your faith to help you or to follow your directions.
When you [[Request]] something of or [[Coerce]] members of your own faith, you can attempt a [[Religion]] check instead of [[Diplomacy]] or [[Intimidation]], and you gain a +2 circumstance bonus to the check.
On a critically failed attempt to make a Request, the target’s attitude toward you doesn’t worsen.
''Prerequisites'' You have at least one [[Aura]] from a champion feat or feature.
You focus your divine power to extend your influence.
Select one aura you have from a champion feat or feature, such as [[Aura of Courage]] or [[Aura of Life]].
The radius of the aura is doubled until the start of your next turn.
//This action is implied by the text of multiple spells.//
[[Bane]]: Once per turn, starting the turn after you cast bane, you can use a single action, which has the Concentrate trait, to increase the emanation’s radius by 5 feet and force enemies in the area that weren’t yet affected to attempt another saving throw.
[[Bless]]: Once per turn, starting the turn after you cast bless, you can use a single action, which has the Concentrate trait, to increase the emanation’s radius by 5 feet.
[[Pied Piping]]: Once per turn, you can spend a single action, which has the Concentrate trait, to increase the emanation’s radius by 5 feet.
[[Reaper's Lantern]]: Once per turn, starting on the turn after you cast reaper’s lantern, you can use a single action, which has the concentrate trait, to increase the emanation’s radius by 5 feet. When you do so, you force creatures in the area that haven’t yet attempted a save against reaper’s lantern to attempt one.
You have long venerated one of your deity’s lesser-known aspects.
Select one domain from your deity’s alternate domains.
You gain access to that domain and an initial domain spell for that domain.
You are luckier even than most catfolk.
You can trigger [[Cat’s Luck]] when you fail or critically fail a [[Fortitude]] or [[Will]] saving throw in addition to [[Reflex]] saving throws.
You still can use Cat’s Luck only once per day.
''Prerequisite'' [[Calculated Splash]].
The particularly volatile compounds that you brew into your bombs result in them creating especially large and powerful explosions.
When you throw an alchemical bomb and that bomb has the <<tag Splash>> trait, you can add your Intelligence modifier to the bomb’s usual splash damage, and it deals splash damage to every creature within 10 feet of the target.
{{LOWGFeat}}
''Requirements'' You are unarmored or wearing light armor.
You advance and retreat quickly.
You gain a +10-foot status bonus to your speed.
{{||SpellSummaryTable}}
You remove loose dirt, dust, gravel, sand, and the like (though not solid stone) up to the size of a 5-foot cube.
Any Medium or smaller creature standing atop the earth when the spell is cast must attempt a [[Reflex]] save or [[Acrobatics]] check.
''Heightened (+2)'' The spell can excavate an additional 5-foot cube of earth. If you excavate all four 5-foot cubes beneath a Large creature, it must attempt a Reflex save or Acrobatics check, as above.
{{||SaveSuccessTable}}
''Frequency'' once per 10 minutes
You observe and assess your surroundings with great speed.
You [[Recall Knowledge]], [[Seek]], or [[Sense Motive]].
''Prerequisites'' Master in Perception.
You have a system that lets you search at great speed, finding details and secrets twice as quickly as others can.
When [[Search]]ing, you take half as long as usual to Search a given area.
This means that while exploring, you double the Speed you can move while ensuring you’ve Searched an area before walking into it (up to half your Speed).
If you’re legendary in Perception, you instead Search areas four times as quickly.
''Prerequisites'' Trained in [[Lore]].
You carefully safeguard your professional endeavors to prevent disaster.
When you use Lore to [[Earn Income]], if you roll a critical failure, you instead get a failure.
If you’re an expert in Lore, you gain twice as much income from a failed check to Earn Income,
unless it was originally a critical failure.
''Prerequisites'' Trained in [[Stealth]].
You often smuggle things past the authorities.
When the GM rolls your Stealth check to see if a passive observer notices a small item you have concealed, the GM uses the number rolled or 10—whichever is higher—as the result of your die roll, adding it to your Stealth modifier to determine your Stealth check result.
If you’re a master in Stealth, the GM uses the number rolled or 15, and if you’re legendary in Stealth, you automatically succeed at hiding a small concealed item from passive observers.
This provides no benefits when a creature attempts a Perception check while actively searching you for hidden items.
Due to your smuggling skill, you’re more likely to find more lucrative smuggling jobs when using Underworld [[Lore]] to [[Earn Income]].
''Prerequisites'' Trained in [[Survival]].
Tracking is second nature to you, and when necessary you can follow a trail without pause.
You can [[Track]] while moving at full Speed by taking a –5 penalty to your Survival check. If you’re a master in Survival, you don’t take the –5 penalty. If you’re legendary in Survival, you no longer need to roll a new Survival check every hour when tracking, though you still need to roll whenever there are significant changes in the trail.
Your [[Advanced Alchemy]] level increases to 3.
At 10th level, it increases to 5.
When you Strike a flat-footed foe with a weapon that has the [[Backstabber]] weapon trait, you deal 2 extra precision damage instead of 1.
If the weapon is a +3 weapon, you deal 4 extra precision damage instead of 2.
{{MulticlassExpertSpellcasting}}
{{MulticlassExpertSpellcasting}}
You can apply the same techniques you use to reverse engineer objects to disable them.
You can use [[Crafting]] instead of [[Thievery]] to [[Disable a Device]] or [[Pick a Lock]].
You know how to get the most out of your allies.
While exploring, when you are leading and allies are [[Following the Expert|Follow the Expert]], you grant a +3 circumstance bonus instead of +2 if you’re an expert in the applicable skill, and a +4 circumstance bonus if you’re a master.
{{MulticlassExpertSpellcasting}}
{{MulticlassExpertSpellcasting}}
Your [[Advanced Alchemy]] level for herbalism increases to your level – 3.
You gain the formulas for [[elixirs of life|Elixir of Life]] as soon as your advanced alchemy level is high enough to create them: lesser at 8th level, moderate at 12th level, greater at 16th level, and major at 18th level.
You’ve continued to refine the knowledge and skills you’ve gained through your life.
When you choose a skill in which to become trained with [[Ancestral Longevity]], you can also choose a skill in which you are already trained and become an expert in that skill. This lasts until your Ancestral Longevity expires.
When the effects of Ancestral Longevity and Expert Longevity expire, you can retrain one of your skill increases. The skill increase you gain from this retraining must either make you trained in the skill you chose with Ancestral Longevity or make you an expert in the skill you chose with Expert Longevity.
Your [[Advanced Alchemy]] level for poison increases to your level – 3.
Your scroll collection is more powerful.
In addition to your daily scrolls from [[Basic Scroll Cache]], add a scroll with a 3rd‑level spell.
At 14th level, add a scroll with a 4th-level spell.
At 16th level, add a scroll with a 5th-level spell.
''Prerequisite'' You must be a master in the skill associated with your bloodline.
{{MulticlassExpertSpellcasting}}
Your proficiency ranks for spell attack rolls and spell DCs in your class's magic tradition increase to expert.
You’ve practiced martial arts and have now surpassed your former skill.
Your proficiency ranks for unarmed attacks and simple weapons increase to expert.
{{MulticlassExpertSpellcasting}}
//Implied by [[Reflective Scales]].//
As a 2-action activity that has the Concentrate and Manipulate traits, you can explode your scales outward in a 20-foot radius around you.
''Additive 2''.
''Frequency'' once per round.
''Trigger'' You craft an alchemical bomb using [[Quick Alchemy]] that’s at least 2 levels lower than your advanced alchemy level.
You mix a substance into the bomb to foil resistances.
The bomb reduces any resistance the enemy has to its damage type by an amount equal to your level, but only for that attack.
<<bulletlist "[tag[Activity]tag[Exploration]]">>
Before activation, this item appears to be nothing more than a simple rolled-up tent, barely large enough to fit four Medium creatures. Despite attempts to clean it, the tent is perpetually smudged with dirt in various places.
''Activate'' {{ClockIcon}} 10 minutes ([[Interact]]); ''Frequency'' once per day; ''Effect'' The rolled-up tent expands into a spacious yurt complete with a fire pit, 10 bedrolls, various cooking utensils, and basic food and water.
The yurt can house and feed you and up to nine other Medium creatures that eat roughly as much as a human does; they need not attempt a Survival check to Subsist when you use the yurt.
Fires and light inside the yurt do not extend illumination into the area surrounding the yurt, making it harder to spot from a distance.
A large loop of red cloth hangs from one wall. If this loop is pulled, which takes an [[Interact]] action, the entire yurt immediately folds back up into its deactivated form, ready for further travel.
Any ammunition.
This piece of ammunition is coated in gritty black soot.
When activated ({{OneAction}} <<tag Interact>>) explosive ammunition hits a target, the missile explodes in a 10-foot burst, dealing 6d6 fire damage to each creature in the area (including the target).
Each creature must attempt a DC 25 basic Reflex save.
| !Type | !Level | !Price | !Damage | !Save DC |
| (Standard) | 9 | 1300 | 6d6 | 25 |
| Greater | 13 | 5200 | 10d6 | 30 |
You know how to encourage your mount to cover ground quickly.
When calculating your [[Travel Speed]] for the day while mounted, you can attempt a [[Nature]] check to [[Command an Animal]] to increase your mount’s travel speed.
The DC is determined by the GM, but is typically based on the mount’s level or the difficulty of the environment, whichever is harder.
On a success, increase your mount’s travel speed by half.
This has no effect on your mount’s movement in encounters.
The alignment you impose on a weapon lasts much longer.
The duration of [[Align Armament]] increases to 1 minute.
Integrating your own personal energy into the elixirs you create causes them to affect you for longer.
When you consume one of your alchemical items that has the <<tag Elixir>>and <<tag Infused>>traits and a duration of 1 minute or longer, that elixir’s duration is doubled.
{{||SpellSummaryTable}}
You call upon your blood’s knowledge of the ancients to extend your magic.
If your next action is to [[Cast a Spell]] with a duration of 1 minute on a single target, and the spell isn’t of the highest spell level you can cast, the spell instead lasts 10 minutes.
You can have only one active spell at a time extended in this way.
''Possible Spells:'' <$list filter="[tag[Spell]!has[m-area]has[m-targets]field:m-duration[1 minute]!field:m-targets[You]]"><$link/>, </$list>
''Frequency'' once every 10 minutes
You wrap shadow around a single unattended light source within 120 feet that’s no larger than a torch.
Any non-magical light source you target is automatically extinguished.
For magical light sources, attempt a [[Counteract]] check using your [[Fortitude]] or [[Thievery]] modifier against the target’s DC. Your counteract level is equal to half your level rounded up.
Successfully counteracting the light source suppresses its ability to produce light for 1 minute, but not any other effects.
If you’re in dim light or darkness when you Extinguish Light, its range is 240 feet.
Your rubbery physique makes it easier for you to wedge yourself into tight spaces and more difficult for your enemies to dislodge you.
You become trained in [[Acrobatics]]. If you would automatically become trained in Acrobatics (from your background or class, for example), you instead become trained in a skill of your choice.
If you roll a success to [[Squeeze]], you get a critical success instead.
While you’re Squeezing, you gain a +4 circumstance bonus to your [[Fortitude]] or [[Reflex]] DCs against attempts to [[Shove]] you or otherwise move you from your space.
You have mastered a perilous balance between the conflicting divine powers of your mystery, gaining the power to change your fate, but straining both body and soul.
When you cast a revelation spell while affected by your major curse, your curse intensifies to an extreme effect instead of overwhelming you. All mysteries share the same effects for their extreme curse.
When affected by your extreme curse, you become [[Doomed]] 2 (or increase your doomed condition by 2 if you were already doomed). Once every 10 minutes, when you fail an attack roll, skill or Perception check, or saving throw, you can reroll it and use the second result. The reroll has the <<tag Fortune>> trait and doesn’t require you to spend an action, meaning you can use the reroll even if you can’t act. These effects are in addition to all the effects of your major curse, and they can’t be removed by any means until you Refocus to reduce your curse to its minor effect.
If you cast a revelation spell while under the effects of this extreme curse, you are overwhelmed by your curse, and you remain doomed 2 even if you Refocus.
Additionally, if you spend at least 3 Focus Points before you again Refocus, you recover 3 Focus Points when you Refocus instead of 1.
You’ve learned to subitize, quickly estimating the number of items in a group with relative accuracy at only a glance.
You immediately learn the number of visually similar items in a group you can see (such as coins, books, or people), rounded to the first digit in the total number. For example, you could look at a case of potion vials and learn that it held about 30 vials, but you wouldn’t know that it was exactly 33 vials, how many different types of potions there were, or how many of which type. Similarly, you could look at a pile of 2,805 coins and know that there were about 3,000 coins in all.
You can use this ability only on items that can typically be counted, so you can’t use it on grains of sand or stars in the sky, for example.
In addition, when you attempt to [[Decipher Writing]] that is primarily numerical or mathematical, you gain a +2 circumstance bonus to your check.
You know good artisanship when you see it and can wax poetic about crafting techniques and forms.
You become trained in [[Crafting]] and gain a +1 circumstance bonus on all Crafting checks made to [[Recall Knowledge]]. If you would automatically become trained in Crafting (from your background or class, for example), you instead become trained in a skill of your choice.
In addition, you gain the [[Crafter's Appraisal]] skill feat, enabling you to identify magic items using the Crafting skill.
Affix to armor.
This round piece of cymophane’s silky inclusion makes it look like a cat’s eye. While affixed, it makes you jittery.
''Requirements'' You are a master in [[Perception]].
''Trigger'' You are about to roll [[Perception]] for initiative but haven’t rolled yet.
''Activate'' {{FreeAction}} Envision: roll Perception twice and use the higher result.
You’ve learned how to spot danger at a distance, allowing you to serve as a sentry with ease.
You gain a +2 circumstance bonus to initiative rolls when using Perception, and when you’re [[Scout]]ing, you grant your allies a +2 circumstance bonus instead of +1.
//This feat has special background requirements described in the Lost Omens World Guide.//
You open an incandescent third eye upon your forehead.
The eye can remain open for 1 minute, and you can close it before then with a single action with the <<tag Concentrate>> trait. It can remain open for 2 minutes if you’re a master in Arcana, or 5 minutes if you’re legendary.
While the eye is open, you gain the following benefits:
* You gain the effects of the [[Detect Magic]] arcane innate spell from your [[Arcane Sense]] at the start of each of your turns without needing to cast he spell;
* You gain [[Darkvision]];
* You gain a +2 status bonus to [[Perception]] checks to [[Seek]] [[Undetected]] and [[Hidden]] creatures and to your [[Perception]] DC against [[Hide]] and [[Sneak]].
After your third eye closes, you are [[Dazzled]] for an amount of time equal to how long you had it open.
''Prerequisites'' [[Low-Light Vision]]
You can see in the darkness as easily as a true vampire. You gain [[Darkvision]].
''Special'' You can select this feat only at 1st level, and you can’t retrain into or out of this feat.
You can lie about having taken an action so convincingly that you acquire all the tangible benefits of having successfully completed it.
You can roll [[Deception]] in place of a different skill when attempting to [[Earn Income]], [[Make an Impression]], [[Request]], or [[Subsist]].
You can use Fabricated Connections to [[Make an Impression]] or [[Request]] once per day, and you can also use it once per week to [[Earn Income]] or [[Subsist]].
{{||SpellSummaryTable}}
Choose a single statement you want the targets to believe. The fact could be narrow, such as “a dragon is circling overhead and wants to kill me”; wide-reaching, such as “all humanoids are disguised abominations”; or conceptual, such as “if I don’t live a kinder life, I’ll be punished in the afterlife.”
The targets’ experiences color how they react to this “truth” and how their behavior changes. If the statement changes what they perceive, they treat the change as a sudden revelation.
The effect of the spell depends on the targets’ [[Will]] saves.
If a target is already subject to fabricated truth, your spell tries to [[Counteract]] it. If the counteract check fails, the outcome of the target’s saving throw can’t be worse than a success.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
While in a crowd of roughly similar creatures, your appearance becomes bland and nondescript.
You gain a +2 status bonus to [[Deception]] and [[Stealth]] checks to go unnoticed among the crowd, and you ignore [[Difficult Terrain]] caused by the crowd.
''Heightened (3rd)'' The spell gains a range of 10 feet and can target up to 10 creatures.
Your ability to blend into the background allows you to fade away entirely or appear innocuous even to magical effects.
You gain [[Invisibility]] and [[Misdirection]] as 2nd-level innate occult spells. You can target only yourself with invisibility, and you must be the primary target of misdirection.
You can cast each spell once per day.
Affix to armor.
This thin, silvery wire wraps around your armor.
''Requirements'' You are a master in [[Stealth]].
''Trigger'' An attack misses you.
''Activate'' {{FreeAction}} Envision: when you activate the band, it casts a 2nd-level [[Invisibility]] spell on you.
{{||SpellSummaryTable}}
You sprinkle magical dust in the spell’s area, making those within easier to trick.
Each creature in the area must attempt a [[Will]] save.
For each additional action you use Casting the Spell, the burst’s radius increases by 5 feet. //No matter how many actions you use, the spell has Somatic and Verbal components.//
''Heightened (+3)'' The initial radius increases by 5 feet.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
All creatures in the area when you cast the spell are limned in colorful, heatless fire of a color of your choice for the duration.
Visible creatures can’t be [[Concealed]] while affected by faerie fire.
If the creatures are [[Invisible]], they are [[Concealed]] while affected by faerie fire, rather than being [[Undetected]].
When you fall more than 5 feet, you take bludgeoning damage equal to half the distance you fell when you land.
Treat falls longer than 1,500 feet as though they were 1,500 feet (750 damage).
If you take any damage from a fall, you land [[Prone]].
You fall about 500 feet in the first round of falling and about 1,500 feet each round thereafter.
You can [[Grab an Edge]] as a reaction to reduce the damage from some falls.
In addition, if you fall into water, snow, or another relatively soft substance, you can treat the fall as though it were 20 feet shorter, or 30 feet shorter if you intentionally dove in.
The effective reduction can’t be greater than the depth (so when falling into 10-foot-deep water, you treat the fall as 10 feet shorter).
If you land on a creature, that creature //takes half the bludgeoning damage you did, but with a basic DC 15 [[Reflex]] save.// Landing exactly on a creature after a long fall is almost impossible.
A dropped object takes damage just like a falling creature. If the object lands on a creature, that creature can attempt a Reflex save using the same rules as for a creature falling on a creature.
Hazards and spells that involve falling objects, such as a rock slide, have their own rules about how they interact with creatures and the damage they deal.
{{||SpellSummaryTable}}
A sickly yellow light fills the area as entropic forces prevent healing.
When a creature within the area would regain Hit Points, such as from a <<tag Healing>>effect or an ability like [[Fast Healing]] or [[Regeneration]], it must attempt a [[Will]] save.
{{||SaveSuccessTable}}
//This ritual has special plot requirements and is associated with only a particular evil god as described in Age of Ashes 4: Tomorrow Must Burn.//
After spending 1 hour in prayer to your god, you can cast spells using the religious symbol of a different deity as your divine focus, and you can address verbal prayers to that deity.
Your actual god intercepts your prayers and answers them without the named god knowing.
This ability applies to the religious symbol of only one god at a time—making a different religious symbol work in this fashion requires another hour of prayer and causes the old one to cease functioning. You can always use a religious symbol of your actual god without affecting this ability.
{{||SpellSummaryTable}}
You create a reservoir of vitality from necromantic energy, gaining a number of temporary Hit Points equal to 6 plus your spellcasting ability modifier.
''Heightened (+1)'' The temporary Hit Points increase by 3.
{{||SpellSummaryTable}}
You create a false image that fools any attempts to scry on an area.
Any <<tag Scrying>>spell sees, hears, smells, and otherwise detects whatever you wish within the area, rather than what is actually in the area.
You can [[Sustain the Spell|Sustain a Spell]] each round to change the illusion as you desire, including playing out a complex scene.
If the scrying spell is of a higher level than false vision, the scryer can attempt a [[Perception]] check to disbelieve the illusion, though even if they’re successful, they can’t learn what’s truly going on in the area.
You make a pact with creature that serves you and assists your spellcasting.
You gain a [[Familiar|Familiar (Rule)]].
Familiars are mystically bonded creatures tied to your magic. Most familiars were originally animals, though the ritual of becoming a familiar makes them something more.
You can choose a Tiny animal you want as your familiar, such as a bat, cat, raven, or snake. Some familiars are different, usually described in the ability that granted you a familiar; for example, a druid’s leshy familiar is a Tiny plant instead of an animal, formed from a minor nature spirit. Your familiar is always Tiny.
Familiars have the <<tag Minion>> trait, so duringan encounter, they gain 2 actions in a round if you spend an action to [[command|Command an Animal]] them.
If your familiar dies, you can spend a week of downtime to replace it at no cost.
You can have only one familiar at a time.
__A familiar has the same level you do.__
__A familiar can't make Strikes.__
Your familiar’s save modifiers and AC are equal to yours before applying circumstance or status bonuses or penalties.
Its [[Perception]], [[Acrobatics]], and [[Stealth]] modifiers are equal to your level plus your spellcasting ability modifier ([[Charisma]] if you don’t have one, unless otherwise specified).
If your familiar attempts an attack roll or other skill check, it uses your level as its modifier. It doesn’t have or use its own ability modifiers and can never benefit from item bonuses.
Your familiar has 5 Hit Points for each of your levels.
Your familiar has [[Low-Light Vision]] and can gain additional senses from familiar abilities.
It can communicate empathically with you as long as it’s within 1 mile of you, sharing emotions. It doesn’t understand or speak languages normally, but it can gain speech from a familiar ability.
Your familiar has either a Speed of 25 feet or a swim Speed of 25 feet (choose one upon gaining the familiar). It can gain other movement types from familiar abilities.
Each day, you channel your magic into two abilities, which can be either [[Familiar|Familiar Abilities]] or [[Master Abilities]]. If your familiar is an animal that naturally has one of these abilities (for instance, an owl has a fly Speed), you must select that ability.
Your familiar can’t be an animal that naturally has more familiar abilities than your daily maximum familiar abilities.
* ''Accompanist'': Your familiar helps you perform. Whenever you attempt a Performance check, if your familiar is nearby and can act, it accompanies you with chirps, claps, or its own miniature instrument. This grants you a +1 circumstance bonus, or +2 if you’re a master in Performance.
* ''Amphibious'': It gains a swim Speed of 25 feet (or Speed of 25 feet if it already has a swim Speed).
* ''Burrower'': It gains a burrow Speed of 5 feet, allowing it to dig Tiny holes.
* ''Climber'': It gains a climb Speed of 25 feet.
* ''Damage Avoidance'': Choose one type of save. It takes no damage when it succeeds at that type of save; this doesn’t prevent effects other than damage.
* ''Darkvision'': It gains [[Darkvision]].
* ''Fast Movement'': Increase one of the familiar’s Speeds from 25 feet to 40 feet.
* ''Focused Rejuvenation'': When you [[Refocus]], you generate magical energy that heals your familiar. Your familiar regains 1 Hit Point per level whenever you Refocus.
* ''Flier'': It gains a fly Speed of 25 feet.
* ''Independent'': In an encounter, if you don’t Command your familiar, it still gains 1 action each round. Typically, you still decide how it spends that action, but, the GM might determine that your familiar chooses its own tactics rather than performing your preferred action.
* ''Manual Dexterity'': It can use up to two of its limbs as if they were hands to use <<tag Manipulate>> actions.
** ''Lab Assistant'': It can use your [[Quick Alchemy]] action. You must have Quick Alchemy, and your familiar must be in your space. This has the same cost and requirement as if you used it. It must have the manual dexterity ability to select this.
** ''Toolbearer'': Your familiar can carry a set of tools of up to light Bulk. So long as your familiar is adjacent to you, you can draw and replace the tools as part of the action that uses them as if you were wearing them. Your familiar must have the manual dexterity ability to select this.
* ''Mask Freeze'': When in mask form, your familiar can hide its obvious supernatural qualities to pass as a simple, unassuming mask. It doesn’t need to [[Impersonate]] to fool a passing glance, and it gains a +4 circumstance bonus to its [[Deception]] DC against an active observer Seeking or otherwise studying it.
* ''Partner in Crime'': Your familiar is your criminal associate. Despite being a minion, your familiar gains 1 reaction at the start of its turns, which it can use only to [[Aid]] you on a [[Deception]] or [[Thievery]] skill check (it still has to prepare to help you as normal for the Aid reaction). It automatically succeeds at its check to [[Aid]] you with those skills or automatically critically succeeds if you’re a master of the skill in question.
* ''Plant Form'': Your plant familiar can change shape as a single action, transforming into a Tiny plant of a type roughly similar to the familiar’s nature. This otherwise uses the effects of [[Tree Shape]]. You must have a familiar with the <<tag Plant>> trait, such as a leshy, to select this ability.
* ''Poison Reservoir'': Your homunculus familiar has a reservoir for poison, allowing it to apply an injury poison to an adjacent ally’s exposed weapon with a single [[Interact]] action. You must supply the poison and instill it into this reservoir using two consecutive [[Interact]] actions. You must have a homunculus familiar to select this ability.
* ''Resistance'': Choose two of the following: acid, cold, electricity, fire, poison, or sonic. Your familiar gains resistance equal to half your level against the chosen damage types.
* ''Scent'': It gains scent (imprecise, 30 feet).
* ''Skilled'': Choose a skill other than [[Acrobatics]] or [[Stealth]]. Your familiar’s modifier for that skill is equal to your level plus your key spellcasting ability modifier, rather than just your level. You can select this ability repeatedly, choosing a different skill each time.
* ''Speech'': It understands and speaks a language you know.
** ''Kinspeech'': It can understand and speak with animals of the same species. To select this, your familiar must be an animal, it must have the speech ability, and you must be at least 6th level.
** ''Master’s Form'': Your familiar can change shape as a single action, transforming into a humanoid of your ancestry with the same age, gender, and build of its true form, though it always maintains a clearly unnatural remnant of its nature, such as a cat’s eyes or a serpent’s tongue. This form is always the same each time it uses this ability. This otherwise uses the effects of [[Humanoid Form]], except the change is purely cosmetic. It only appears humanoid and gains no new capabilities. Your familiar must have the manual dexterity and speech abilities to select this.
* ''Spellcasting'': Choose a spell in your repertoire or that you prepared today that is at least 5 levels lower than your highest-level spell slot. Your familiar can [[Cast that Spell|Cast a Spell]] once per day using your magical tradition, spell attack modifier, and spell DC. If the spell has a drawback that affects the caster, both you and your familiar are affected. You must be able to cast 6th-level spells using spell slots to select this ability.
* ''Touch Telepathy'': Your familiar can telepathically communicate with you via touch. If it also has the speech ability, it can telepathically communicate via touch with any creature if they share a language.
* ''Tough'': Your familiar’s maximum Hit Points increase by 2 per level.
* ''Valet'': You can command your familiar to deliver you items more efficiently. Your familiar doesn’t use its 2 actions immediately upon your command. Instead, up to twice before the end of your turn, you can have your familiar [[Interact]] to retrieve an item of light or negligible Bulk you are wearing and place it into one of your free hands. The familiar can’t use this ability to retrieve stowed items. If the familiar has a different number of actions, it can retrieve one item for each action it has when commanded this way.
''Prerequisites'' Able to cast spells.
''Requirements'' You have line of effect to your familiar.
Under your tutelage, your familiar has grown attuned to the hidden currents of the world and can serve as a conduit for your magic.
If the next action you use is to [[Cast a Spell]] that has a range, the spell uses the familiar as its origin point.
Your familiar is the heart and soul of your adventuring team.
When selecting [[Master Abilities]], you can choose an ally to benefit from any specific master ability.
Each master ability can benefit only a single character, and you can select a specific master ability only once unless the ability says otherwise.
You have forged a mystical bond with a creature. This might have involved complex rituals and invocations, such as meditating under the moon until something crept out of the forest. Or maybe you just did each other a good turn, such as rescuing the beast from a trap or a foe, and then being rescued in turn. Whatever the details, you are now comrades until the end.
You gain a [[Familiar|Familiar (Rule)]]. If you already have a familiar, you gain the [[Enhanced Familiar]] feat.
<<archetypefeatlist "4 6 8 10" "[[Familiar Master]]">>
You use your familiar’s senses as easily as your own.
You project your senses into your familiar.
When you do, you lose all sensory information from your own body, but you can sense through your familiar’s body until you [[Dismiss]] the effect.
While projecting your senses in this way, you can converse telepathically with your familiar if it understands a language.
''Special'' This feat has the trait corresponding to the tradition of spells you cast (arcane, divine, occult, or primal).
{{||SpellSummaryTable}}
You don’t need line of sight or line of effect to your target when you Cast this Spell.
The target becomes a scrying sensor, allowing you to see through its eyes, smell what it smells, and similarly use its other senses.
If you can cast a spell with the <<tag Revelation>> trait that affects your senses, such as [[See Invisibility]], while this spell is active, you gain the benefit of the spell through the target’s senses instead of your own.
You can also speak through the target, with a voice much like yours, though it takes on some of the timbre and character of the target’s growls or squawks.
You can use [[Command an Animal]] on the target as part of [[Sustaining this Spell|Sustain a Spell]].
You’ve learned to speak with your familiar and other creatures like it.
You can ask questions of, receive answers from, and use the [[Diplomacy]] skill with creatures of the same family of animals as your familiar. For example, if your familiar were a cat, you could gain the effects of speak with animals for any felines (including leopards, lions, and tigers, among others).
This ability doesn’t make them more friendly than normal.
If your familiar ever changes to a different creature, you can’t use this ability for 1 week while you absorb your new familiar’s language.
''Special'' This feat has the trait corresponding to the tradition of spells you cast (arcane, divine, occult, or primal).
You show off your fighting style to discourage your foes.
You can use [[Performance]] to [[Demoralize]].
You have filed your teeth into jagged points and have an unusually powerful jaw, making your mouth a dangerous weapon.
If you’re an [[Irongut Goblin]], you gain a jaws unarmed attack that deals 1d4 piercing damage, and if you’re a [[Razortooth Goblin]], your jaws unarmed attack deals 1d8 piercing damage and loses the [[Finesse]] trait.
Whenever you score a critical hit with your jaws unarmed attack, your target takes 1 persistent bleed damage per weapon damage die.
Your incisors have grown into true fangs: long, sharp, and well-suited to drawing blood.
You gain a fangs unarmed attack that deals 1d6 piercing damage. Your fangs are in the brawling group and have the [[Grapple]] and [[Unarmed]] traits.
{{||RitualSummaryTable}}
''Cost'' mystical paint, elaborate veils, and powdered minerals worth 20,000 gp total.
You draw a permanent series of complex illusions over the target settlement, choosing the look, sound, feel, and smell of the structures, terrain, and creatures within at the time the ritual is cast.
You can alter the appearance of existing structures and creatures, and you can add illusory structures or creatures. For example, you could cause everything and everyone in the target area to appear green, create an illusory forest with a thick canopy that obscures the settlement from outside view, or make empty ruins seem inhabited and pristine.
When you create the facade, you determine which illusory elements remain static (limited to basic natural movement, such as flags blowing in the breeze) and which follow a basic program (for example, a daily parade in the town square, complete with marching band). You’re unable to alter the programs after you create the facade.
You can disguise creatures as you please, with the same effects as a 3rd-level [[Illusory Disguise]]. If a creature affected by the facade leaves the area, any illusions affecting it fade after 1 day. You decide when casting the ritual whether newcomers are disguised by the illusions, and whether the disguise appears immediately or after a set period, up to 1 week.
A creature that interacts with the target settlement in a way that would suggest or reveal the illusory nature of the facade, such as by trying to paint a building affected by the facade or climbing an illusory structure, can attempt to disbelieve the illusion.
The illusions created by the spell are harmless, so an illusory river of lava wouldn’t cause damage, nor could thorns on an illusory rose bush prick someone.
''Heightened (10th)'' The cost increases to 100,000 gp and the radius can be up to 5 miles.
{{||ActionSuccessTable}}
You launch yourself through the air at a foe.
Attempt a [[High Jump]] or [[Long Jump]].
If you attempt a High Jump, determine the distance you can travel using the scale of a Long Jump.
At the end of your jump, you can make a melee [[Strike]].
After your Strike, you [[fall|Falling]] to the ground if you’re in the air.
If the distance of your fall is no more than the height of your jump, you take no damage and land upright.
You’ve learned how to throw a longer distance.
When you throw an alchemical bomb, it has a range increment of 30 feet instead of the usual 20 feet.
Your experience in the field has taught you how to focus your aim at a distance, increasing your accuracy.
Double your weapons’ range increments.
When you [[Strike]] with a thrown weapon, you take only a –1 penalty for each additional range increment between you and the target, rather than a –2 penalty.
You are compelled to focus your attention on something, distracting you from whatever else is going on around you.
You take a –2 status penalty to [[Perception]] and skill checks.
You can’t use actions with the [[Concentrate]] trait unless they or their intended consequences are related to the subject of your fascination (as determined by the GM). For instance, you might be able to [[Seek]] and [[Recall Knowledge]] about the subject, but you likely couldn’t cast a spell targeting a different creature.
This condition ends if a creature uses hostile actions against you or any of your allies.
//You're fascinated if you're [[Reading someone's Lips|Read Lips]] (using the feat).//
''Prerequisites'' Trained in [[Performance]].
When you [[Perform]], compare your result to the [[Will]] DC of one observer.
If you succeed, the target is [[Fascinated]] by you for 1 round.
If the observer is in a situation that demands immediate attention, such as combat, you must critically succeed to fascinate it and the Perform action gains the [[Incapacitation]] trait. //This means it is impossible to fascinate a creature higher level than you.//
You must choose which creature you’re trying to fascinate before you roll your check, and the target is then temporarily immune for 1 hour.
If you’re an expert in Performance, you can fascinate up to four observers; if you’re a master, you can fascinate up to 10 observers; and if you’re legendary, you can fascinate any number of observers at the same time.
Divine power is always at your fingertips, swiftly responding to your call.
When you cast [[Harm]] or [[Heal]] by spending 2 actions, you can get the effects of the 3-action version instead of the 2-action version.
You can do this with [[Harm]] if you have harmful font or [[Heal]] if you have healing font (or both if you have [[Versatile Font]]).
A creature with this ability regains the given number of [[Hit Points]] each round at the beginning of its turn.
Your rage is a frenzy of rapid movements.
While you are raging, you gain a +10-foot status bonus to your Speed.
''Prerequisites'' [[Constitution]] 14.
Your body quickly bounces back from afflictions.
You regain twice as many Hit Points from resting.
Each time you succeed at a Fortitude save against an ongoing [[Disease]] or [[Poison]], you reduce its stage by 2, or by 1 against a virulent disease or poison.
Each critical success you achieve against an ongoing disease or poison reduces its stage by 3, or by 2 against a virulent disease or poison.
In addition, you reduce the severity of your [[Drained]] condition by 2 when you rest for a night instead of by 1.
The fatal trait includes a die size.
On a critical hit, the weapon’s damage die increases to that die size instead of the normal die size, and the weapon adds one additional damage die of the listed size.
{{||SpellSummaryTable}}
You perform music so perfect that the target may die of joy or sorrow.
Once targeted, the creature becomes temporarily immune for 1 minute.
The effect of the spell depends on the target’s level and current Hit Points.
''16th or Lower'' The target dies instantly.
''17th'' If the target has 50 Hit Points or fewer, it dies instantly; otherwise, it drops to 0 Hit Points and becomes [[Dying]] 1.
''18th or Higher'' The target takes 50 damage. If this brings it to 0 Hit Points, it dies instantly.
You’re tired and can’t summon much energy.
You take a –1 status penalty to [[AC]] and saving throws ([[Fortitude]], [[Reflex]], [[Will]]).
__You can’t use exploration activities performed while traveling.__ //(You can still [[Refocus]], [[Treat Wounds]], and so on.)//
You recover from fatigue after a full night’s rest.
//You become Fatigued if you go without rest for 16 hours, or if you rest wearing armor.//
//You become Fatigued if you fail to [[Subsist]] in an environment without food or shelter.//
//You become Fatigued if you [[Sustain a Spell]] for more than 10 minutes, unless the spell has a longer maximum duration.//
You’re one of Hei Feng’s chosen people and have the authority of the Celestial Court on your side.
Once per day, you can cast a 6th-level [[Spirit Blast]] as a divine innate spell.
In addition, you gain resistance 5 to both good and evil damage.
{{||SpellSummaryTable}}
You enchant a creature to ensure they have only good things to say about your show.
Identify a single creature, location, or performance.
The target must attempt a [[Will]] save.
You can [[Dismiss]] the spell.
''Heightened (8th)'' The range increases to 60 feet and you can target up to 10 creatures.
{{||SaveSuccessTable}}
You wrap a shell of favorable wind around a weapon you wield.
On your next [[Strike]] with a ranged weapon before the start of your next turn, you don’t take circumstance penalties on the attack roll due to wind.
In addition, if that weapon has a range increment of 10 feet or less, increase its range increment by 10 feet for that Strike.
You have studied a specific type of wild creature and can hunt it more easily.
When you gain this feat, choose <<tag Animal>>s, <<tag Beast>>s, <<tag Dragon>>s, or both fungi and <<tag Plant>>s as your favored enemy.
When you roll initiative and can see an enemy that belongs to the chosen category, you can [[Hunt Prey]] as a free action, designating that enemy.
You can use this free action even if you haven’t identified the creature yet with [[Recall Knowledge]].
The benefit doesn’t apply against favored enemies disguised as other creatures, and the GM determines whether it applies against a creature disguised as a favored enemy.
You have studied a specific terrain to overcome its challenges.
Choose aquatic, arctic, desert, forest, mountain, plains, sky, swamp, or underground as your favored terrain.
When in that terrain, you can ignore the effects of non-magical difficult terrain.
If you have the [[Wild Stride]] class feature, you gain a second benefit while in your favored terrain, depending on your choice.
* ''Aquatic'' You gain a swim Speed equal to your Speed. If you already had a swim Speed, you gain a +10-foot status bonus to your swim Speed.
* ''Arctic'' You need to eat and drink only one-tenth as much as usual, you aren’t affected by severe or extreme cold, and you can walk across ice and snow at full Speed without needing to [[Balance]].
* ''Desert'' You need to eat and drink only one-tenth as much as usual, you aren’t affected by severe or extreme heat, and you can walk along sand at full Speed without needing to [[Balance]].
* ''Forest'', ''Mountain'', or ''Underground'' You gain a climb Speed equal to your Speed. If you already had a climb Speed, you gain a +10-foot status bonus to your climb Speed.
* ''Plains'' You gain a +10-foot status bonus to your land Speed.
* ''Sky'' You gain a +10-foot status bonus to your fly Speed, if you have one.
* ''Swamp'' You can move across bogs at full Speed, even if they are deep enough to be greater difficult terrain or to normally require you to Swim.
{{||SpellSummaryTable}}
You plant fear in the target; it must attempt a [[Will]] save.
''Heightened (3rd)'' You can target up to five creatures.
{{||SaveSuccessTable}}
Affix to a weapon.
Dark smoke seems to writhe within this obsidian gem.
When you activate the gem, you make an {{TwoAction}} [[Intimidating Strike]], as the fighter feat.
If you have the Intimidating Strike feat, increase the [[Frightened]] condition value from this Intimidating Strike to frightened 2, or frightened 3 on a critical hit.
When you roll a success on a save against a <<tag Fear>> effect, you get a critical success instead.
In addition, any time you gain the [[Frightened]] condition, reduce the condition’s value by 1.
As usual, this ability reduces the initial frightened condition by 1, so if you have multiple similar abilities, they don’t both take effect.
''Usage'' etched onto a weapon.
When you critically hit with this weapon, the target becomes [[Frightened]] 1.
''Greater Fearsome:'' When you critically hit with this weapon, the target becomes [[Frightened]] 2.
Fear makes your foes weak and more vulnerable to your attacks.
You gain a circumstance bonus to damage rolls for [[Strike]]s against frightened creatures. The bonus is equal to double the target’s [[Frightened]] value.
If you have master proficiency in [[Intimidation]], increase the bonus to triple the target’s frightened value.
{{||SpellSummaryTable}}
You curse the target with a hunger no food can sate.
You can [[Dismiss]] the spell.
The target must attempt a [[Fortitude]] save.
''Heightened (+1)'' The hunger becomes more unbearable, increasing the damage each day by 1d4, or by 2d4 on a critical failure.
{{||SaveSuccessTable}}
General feats are listed below.
Skill feats are listed with [[Skill]]s and on the page for their particular skill. In most cases, Skill feats can be taken in place of General feats.
Class feats are listed on the page for their particular class.
<table>
<tr><th>Feat</th><th>Level</th></tr>
<$list filter="[tag[Feat]tag[General]!tag[Skill]]">
<tr><td><$link /></td><td>{{!!feat-level}}</td></tr>
</$list>
</table>
{{||SpellSummaryTable}}
You cause the air itself to arrest a fall.
The target’s fall slows to 60 feet per round, and the portion of the fall during the spell’s duration doesn’t count when calculating [[Falling]] damage.
If the target reaches the ground while the spell is in effect, it takes no damage from the fall.
The spell ends as soon as the target lands.
''Prerequisites'' [[Dexterity]] 14.
You step carefully and quickly.
You can [[Step]] into difficult terrain.
Affix to armor.
''Trigger'' You [[Stride]] or [[Step]].
''Requirements'' You are an expert in [[Acrobatics]].
This stone, usually shaped as a cabochon, is a small chunk of amber with a bit of feather or a flying insect caught within it.
When you activate the stone, you ignore the effects of any [[Difficult Terrain]] and greater difficult terrain you move through until the end of your turn.
Each feather token appears to be a simple feather from some exotic bird. The feather’s shaft, dipped in gold, bears a single arcane rune.
Activating a feather token ({{OneAction}} Interact) causes it to transform into another object, which then can be used as normal for that object.
Each feather can be activated only once, with most of them permanently becoming the item in their description.
* ''Anchor''; Level 7; Price 55 gp; This feather can be activated only on a boat. When activated, this feather transforms into a massive anchor that causes the boat to immediately stop. After 1 day, the anchor vanishes and the boat can move as normal. The anchor is attached to the boat by a magical chain of force, but the chain can be removed by [[Dispel Magic]] or destroyed (Hardness 30, HP 40).
* ''Bird''; Level 3; Price 8 gp; When activated, this token transforms into a small sparrow that waits on your finger for you to relay a message up to 1 minute in length, along with the name and rough location of a recipient. The recipient must be someone you have met, and the location must be somewhere you have visited. After receiving the message, the bird flies off to deliver it, traveling at 30 miles per hour and then searching for the target in the location you provided. If the bird finds the target, it moves adjacent to them, your words emanate from the bird, and the bird then flies off and vanishes. The bird also vanishes if it fails to find your target after 10 hours of searching the location you specified.
* ''Chest''; Level 3; Price 10 gp; When you use this token, a small wooden chest appears and immediately opens. This chest can hold up to 10 Bulk worth of items. Once the chest is closed, it transforms again—this time into a key—taking all of the stored items with it. You can activate this key by spending an Interact action to turn it in an imaginary lock, which causes it to transform back into a chest with all of the items still inside. Once it has turned into a chest a second time, it forever remains a wooden chest.
* ''Fan''; Level 4; Price 15 gp; Activating this feather requires you to fan it in a given direction. If this direction is toward the sail of a vessel, the feather flutters up toward the sail and fans continuously, filling the sail with air and granting the vessel a +10-foot circumstance bonus to its Speed for 8 hours. If fanned in any other direction, it instead produces a single casting of [[Gust of Wind]] (DC 20).
* ''Holly Bush''; Level 2; Price 6 gp; When this feather is activated, it immediately transforms into a living holly bush, filling a single square. This bush can provide standard cover. In addition, the bush has 2d4 bright-red berries. While holly berries are usually poisonous, these berries are infused with beneficial magic. You can pick and eat a berry as an Interact action to recover 1 Hit Point. Once plucked from the bush, a berry becomes non-magical after a few seconds, so it doesn’t heal you if you don’t eat it within the span of your Interact action. If activated on soil, the plant continues to grow and thrive (although it doesn’t produce any more healing berries). If activated elsewhere, it withers and dies within 1d4 days.
* ''Ladder'';Level 1; Price 3 gp; When activated, this feather transforms permanently into a 20-foot-long wooden ladder.
* ''Swan Boat''; Level 8; Price 76 gp; This feather can be activated only when tossed into a large body of water, such as a lake or broad river. It transforms into a swan-shaped boat capable of carrying up to 32 Medium creatures, 8 Large creatures, or 2 Huge creatures. The boat moves on the water at a Speed of 50 feet, and lasts 1 day.
* ''Tree''; Level 6; Price 38 gp; This token can be activated only on an unoccupied patch of earth or soil. When activated, this token transforms into an oak tree, 60 feet tall with a 5-foot-wide trunk. The tree continues to live and grow if conditions are favorable.
* ''Whip''; Level 9; Price 130 gp; This feather transforms into a [[+1|Weapon Potency]] [[Striking]] [[Dancing]] whip when activated. The whip immediately jumps from your grasp and proceeds to attack your enemies until 1 minute has passed or it fails its flat check for dancing, at which point it vanishes. If the whip’s target isn’t [[Prone]], the whip uses its actions to attempt to [[Trip]] that creature instead of making a [[Strike]]. The whip’s total attack modifier for Striking or Tripping is +18 instead of the normal bonus for a dancing weapon.
To blend in with the grounded and wingless, you fold your wings just so on your back, creating the illusion of a feathered cloak.
You receive a +2 circumstance bonus to [[Deception]] checks to [[Impersonate]] a version of yourself who is not a strix.
Additionally, your folded wings help you obscure objects on your person, providing a +2 circumstance bonus to [[Stealth]] checks to [[Conceal an Object]].
<!--
Decoration icons-->
<$list filter="[all[current]field:a-actions[1]]">
{{OneAction}}
</$list>
<$list filter="[all[current]field:a-actions[2]]">
{{TwoAction}}
</$list>
<$list filter="[all[current]field:a-actions[3]]">
{{ThreeAction}}
</$list>
<$list filter="[all[current]tag[Reaction]]">
{{ReactionIcon}}
</$list>
<$list filter="[all[current]tag[Free]]">
{{FreeAction}}
</$list>
<$list filter="[all[current]tag[Focus Spell]]">
{{SpellIcon}}
</$list>
<!--
Feat link-->
<$link />
<!--
Aftertags -->
<$list filter="[all[current]tag[Focus Spell]!tag[Cantrip]]">
(Focus Spell)
</$list>
<$list filter="[all[current]tag[Focus Spell]tag[Cantrip]]">
(Focus Cantrip)
</$list>
<$list filter="[all[current]tag[Uncommon]]">
(Uncommon)
</$list>
<$list filter="[all[current]tag[Rare]]">
(Rare)
</$list>
<!--
Feat prereqs -->
<$list filter="[all[current]has[feat-fpre]]">
(Requires
<$list filter="[all[current]list[!!feat-fpre]]">
<$link/></$list>)</$list>
<!--
Splat prereqs -->
<$list filter="[all[current]has[feat-sppre]]">
(Requires
<$list filter="[all[current]list[!!feat-sppre]]">
<$link/></$list>)</$list>
<!--
Stat prereqs -->
<$list variable="checkAbpreExists" filter="[all[current]has[feat-abpre]]">
<$set name="statps" filter="[all[current]list[!!feat-abpre]count[]]">
<$list variable="index" filter="[all[current]range<statps>]">
(Requires <$list filter="[all[current]list[!!feat-abpre]nth<index>]"><$link /></$list>
<$list filter="[all[current]list[!!feat-abprel]nth<index>]"><<currentTiddler>></$list>)
</$list>
</$set>
</$list>
<!--
Skill prereqs -->
<$list filter="[all[current]list[!!feat-skill]]" variable="skill">
(Requires
<$transclude tiddler="SkillProficiencyLongName" index={{!!feat-spre}} />
<$link to=<<skill>> />)</$list>
<$list filter="[all[current]tag[Focus Spell]!tag[Cantrip]]">
//This Focus Spell is gained by taking a Feat, which grants the spell plus one focus point.//
</$list>
<$list filter="[all[current]tag[Focus Spell]tag[Cantrip]]">
//This Focus Cantrip is gained by taking a Feat.//
</$list>
<table>
<tr><th>Feat Type</th><td>
<$list filter="[all[current]tag[Class]]">Class</$list>
<$list filter="[all[current]tag[Skill]]">Skill</$list>
<$list filter="[all[current]tag[Dedication]]">Dedication</$list>
<$list filter="[all[current]!tag[Skill]tag[General]]">General</$list>
<$list filter="[all[current]has[feat-anc]]">Ancestry</$list>
<$list filter="[all[current]has[feat-vher]]">Versatile Heritage</$list>
<$list filter="[all[current]has[feat-arch]]">Archetype</$list>
</td></tr>
<$list filter="[list[!!feat-anc]]">
<tr><th>Ancestry</th><td><$link/></td></tr>
</$list>
<$list filter="[list[!!feat-vher]]">
<tr><th>Heritage</th><td><$link/></td></tr>
</$list>
<$list filter="[list[!!feat-arch]]">
<tr><th>Archetype</th><td><<currentTiddler>></td></tr>
</$list>
<$list filter="[all[current]tag[Class]]">
<$list filter="[list[!!feat-class]]">
<tr><th>Class</th><td><$link/></td></tr>
</$list>
</$list>
<$list filter="[list[!!feat-archadd]]">
<$set name="dedname" filter="[all[current]addsuffix[ Dedication]]" select="0">
<tr><th>Additional for</th><td><$link to=<<dedname>>><<currentTiddler>></$link></td></tr>
</$set>
</$list>
<tr><th>Level</th><td>{{!!feat-level}}</td></tr>
<$list filter="[all[current]has[feat-skill]]">
<tr><th>Skill</th><td>
<$list filter="[list[!!feat-skill]]"><$link/> </$list>
</td></tr>
<tr><th>Proficiency</th><td>
<$transclude tiddler="SkillProficiencyLongName" index={{!!feat-spre}} />
</td></tr>
</$list>
<tr><th>Requires</th><td>{{!!feat-fpre}}</td></tr>
<$list filter="[all[current]has[feat-sppre]]">
<tr><th><$transclude tiddler="SplatNameDict" index={{!!feat-class}} />
</th><td>
<$list filter="[list[!!feat-sppre]]">
<$link/>
</$list></td></tr>
</$list>
</table>
{{||SpellSummaryTable}}
You dramatically reduce the target's mental faculties. The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
''Frequency'' once per hour
''Trigger'' You deal <<tag Mental>> damage.
The psychic feedback of another creature’s pain fills you with false life.
You gain temporary Hit Points equal to half the mental damage you dealt from the triggering effect.
If the triggering action dealt mental damage to multiple creatures, calculate these temporary Hit Points using the creature that took the most damage.
You lose any remaining temporary Hit Points after 1 minute.
{{||SpellSummaryTable}}
The target’s feet transform into fins, improving mobility in the water but reducing it on land.
The target gains a swim Speed equal to its normal land Speed, but its land Speed becomes 5 feet.
''Heightened (6th)'' The spell lasts until the next time you make your [[daily preparations|Rest]].
''Requirements'' You are within melee reach of the opponent you attempt to Feint.
With a misleading flourish, you leave an opponent unprepared for your real attack. Attempt a [[Deception]] check against that opponent’s [[Perception]] DC.
{{||ActionSuccessTable}}
You have trained with your [[animal companion|Animal Companions]] to become a terrifying, unified juggernaut on the battlefield.
Your animal companion becomes trained in [[Intimidation]].
If your animal companion uses [[Support]] while serving as your mount, it grants you the effects of the [[Aid]] reaction on your first [[Intimidation]] check to [[Demoralize]] on the same turn, even though it can’t take reactions.
Your ranged attacks can shoot an unprepared foe right out of the air.
Make a [[Strike]] with a ranged weapon or a thrown weapon against a [[Flat-Footed]] creature.
If the Strike is a success and deals damage, the target must attempt a [[Reflex]] save against your class DC with the following effects.
{{||SaveSuccessTable}}
Your attack can ground an airborne foe.
Make a [[Strike]].
If it hits and deals damage to a flying target, the target falls up to 120 feet. The fall is gradual enough that if it causes the target to hit the ground, the target takes no damage from the fall.
If the attack is a critical hit, the target can’t [[Fly]], [[Leap]], [[Levitate]], or otherwise leave the ground until the end of your next turn.
You move carefully, feinting and creating false openings to lead your foes into inopportune attacks.
You are trained in [[Deception]].
You gain panache during an encounter whenever you successfully [[Feint]] or [[Create a Diversion]] against a foe.
Your bestial mutagen brings out the beast lurking within you, granting you especially sharp claws and teeth as well as a ferocious appearance.
Whenever you’re affected by a bestial mutagen, you gain the mutagen’s item bonus to your [[Intimidation]] checks. In addition, your claws and jaws are increasingly vicious, and they gain the [[Deadly]] d10 trait.
Finally, you can increase the mutagen’s penalty to [[AC]] from –1 to –2 and, in exchange, increase the damage die size of your claws and jaws by one step.
''Prerequisites'' [[Beast Trainer]] or [[Animal Companion]], [[Orc Ferocity]]
Since ancient times, the mightiest orc beast tamers would draw out the true fighting spirit of their companion beasts by feeding the creatures a draft incorporating the orc’s own blood.
Animal companions or bonded animals you have gain the [[Orc Ferocity]] feat, and they gain a reaction they can use only for Orc Ferocity.
If you have the [[Undying Ferocity]] ancestry feat, all animal companions or bonded animals you have also gain the benefits of that feat when using the Orc Ferocity reaction.
''Frequency'' once per 10 minutes
With heavy wing beats, you whip up a furious gust and direct it at your opponents.
This air blast has the effects of [[Gust of Wind]] with a DC equal to your class DC or spell DC, whichever is higher.
You have mastered the shape of ferocious dinosaurs.
Add the forms listed in [[Dinosaur Form]] to your wild shape list.
Whenever you use wild shape to take a form that grants you a specific [[Athletics]] modifier, you gain a +1 status bonus to your [[Athletics]] checks.
''Trigger'' The monster is reduced to 0 HP.
The monster avoids being knocked out and remains at 1 HP, but its [[Wounded]] value increases by 1.
When it is wounded 3, it can no longer use this ability.
You’ve learned obscure lessons about your fellow fetchlings.
You’re trained in [[Occultism]] and [[Stealth]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Shadow Plane [[Lore]].
Creatures of the First World are called the fey.
You have learned some of the tricks the fey use to bend primal magic toward illusions and trickery.
Add [[Illusory Disguise]], [[Illusory Object]], [[Illusory Scene]], and [[Veil]] to your spell list as primal spells.
You’ve learned the cantrips sprites have used since time immemorial.
You gain [[Dancing Lights]] and [[Ghost Sound]] as primal innate cantrips.
If you have the grig heritage, you also gain [[Detect Magic]], and if you have the draxie heritage, you gain [[Prestigitation]].
{{||SpellSummaryTable}}
You become [[Invisible]] and ignore natural [[Difficult Terrain]] (such as underbrush).
Any [[Hostile Action]] you use ends this invisibility, but you still ignore natural difficult terrain.
''Heightened (5th)'' If you use a hostile action, the invisibility doesn’t end.
You can disguise yourself with magical illusions.
You can cast [[Illusory Disguise]] once per day as a 1st-level primal innate spell.
At 7th level, the spell is heightened to 2nd level, and every 2 levels thereafter, the spell is heightened an additional spell level.
Your enhanced fey connection affords you a warmer reception from creatures of the First World as well as tools to foil their tricks.
You gain a +2 circumstance bonus to both [[Perception]] checks and saving throws against fey.
In addition, whenever you meet a fey creature in a social situation, you can immediately attempt a [[Diplomacy]] check to [[Make an Impression]] on that creature rather than needing to converse for 1 minute. You take a –5 penalty to the check.
If you fail, you can engage in 1 minute of conversation and attempt a new check at the end of that time rather than accepting the failure or critical failure result.
''Special'' If you have the Glad-Hand skill feat, you don’t take the penalty on your immediate Diplomacy check if the target is a fey.
{{||SpellSummaryTable}}
You call upon fey glamours to cloak an area or the targets in illusion.
This has the effect of either [[Illusory Scene]] on the area or [[Veil]] on the creatures, as if heightened to a level 1 level lower than fey glamour, using fey glamour’s range and duration.
You can use faerie magic to hide yourself and expose hidden foes.
You can cast [[Faerie Fire]] and [[Invisibility]] each once per day as primal innate spells.
While you are more susceptible to cold iron than most of the Wingless, you also have an incredible resilience and a deeper connection to the healing energies of the First World.
Increase your maximum Hit Points by an amount equal to your level.
If you rest for 10 minutes, brilliant light from the First World seeps into your form from your wings (or the spot where your wings would be), causing you to regain a number of Hit Points equal to your level; this is cumulative with any Hit Points you regain from [[Treat Wounds]].
However, you gain weakness 5 to cold iron.
You gain the <<tag Fey>> trait, in addition to the gnome and humanoid traits. Choose one cantrip from the primal spell list. You can cast this spell as a primal innate spell at will. A cantrip is heightened to a spell level equal to half your level rounded up. You can change this cantrip to a different one from the same list once per day by meditating to realign yourself with the First World; this is a 10-minute activity that has the <<tag Concentrate>> trait.
{{||SpellSummaryTable}}
A field of positive energy fills the area, exuding warmth and rejuvenating those within.
Each living creature that starts its turn in the area regains 1d8 Hit Points, and any <<tag Undead>>creature that starts its turn in the area takes 1d8 positive damage.
''Heightened (8th)'' The healing and damage increase to 1d10.
''Heightened (9th)'' The healing and damage increase to 1d12.
Creatures that hail from or have a strong connection to the evil-aligned planes are called fiends.
Fiends can survive the basic environmental effects of planes in the Outer Sphere.
Like many fiends, you have the supernatural ability to teleport yourself to safety.
Once per day, you can cast [[Dimension Door]] as a 5th-level divine innate spell.
''Prerequisites'' low-light vision
You can see in the darkness as easily as a fiend. You gain [[Darkvision]].
''Special'' You can select this feat only at 1st level, and you can’t retrain into or out of this feat.
''Prerequisites'' tenets of evil.
Your features reshape into those of a type of fiend who serves your deity; for example, as a demon you might have putrid scales, twisted horns, and red eyes.
You gain a fly Speed equal to your Speed.
You gain [[Darkvision]] if you don’t already have it, and you gain the <<tag Fiend>> trait and the trait appropriate to the type of servitor you’ve become (such as <<tag Daemon>>, <<tag Demon>>, or <<tag Devil>>).
//You don't get the abilities, skills, attacks, etc. of your fiend.//
You were raised by a tiefling or a fiendish relative, or you’ve devoted yourself to researching the secrets of the fiendish realms.
You gain the trained proficiency rank in [[Intimidation]] and [[Religion]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in a [[Lore]] skill related to the fiendish plane from which you trace your lineage (usually Abaddon Lore, Abyss Lore, or Hell Lore).
''Prerequisites'' [[Steed Ally|Divine Ally]], tenets of evil.
Your steed ally manifests a suite of powerful and sinister gifts granted to it by your deity.
It gains [[Darkvision]], its maximum Hit Points increase by 40, and it gains weakness 10 to good damage.
Additionally, it grows wings appropriate for a servitor of your deity (such as bat wings for a devil), granting it a fly Speed equal to its Speed.
It gains the <<tag Fiend>> trait and the trait appropriate to the type of servitor it has become (such as daemon, demon, or devil).
Your connection to your fiendish forebears has granted you one of their resistances as well.
Choose one of the following energy damage types: <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, <<tag Fire>>, or <<tag Sonic>>. You gain resistance 5 to that damage type.
Though you can choose any of these, the damage type typically matches a fiend associated with your bloodline. For instance, a [[Hellspawn]] might choose resistance to fire, or a pitborn with a vrock ancestor might choose resistance to electricity.
Your festering connection to the forces of evil infuses your weapons with debilitating malevolence, tearing down creatures of good with every attack.
All your weapon and unarmed [[Strike]]s deal 1 additional <<tag Evil>> damage and have the <<tag Evil>> and <<tag Magical>> traits.
''Frequency'' once per day.
You can strain to call forth bat-like or otherwise fiendish wings from your back, similar in appearance to those of your fiendish ancestors.
Once manifested, these wings remain for 10 minutes.
You gain a fly Speed equal to your land Speed while you’ve manifested your wings.
You can call forth a blasphemous word from the fiendish realms to punish your foes.
Once per day, you can cast [[Divine Decree]] as a 7th-level divine innate spell. You must choose evil for the spell, and you can [[Cast the Spell|Cast a Spell]] regardless of whether you have a deity or what their alignment is.
''Prerequisites'' Tenets of Good.
ou’ve sworn an oath to banish the corruption of fiends to the dark planes they call home.
Add the following tenet to your champion’s code after the other tenets: “You must banish or slay fiends you come across as long as you have a reasonable chance of success; in the incredibly unlikely event you find a good fiend, you don’t have to banish or kill it.”
Your [[Retributive Strike]] gains a +4 circumstance bonus to damage against a fiend, or +6 if you have master proficiency with the weapon you used.
Your [[Glimpse of Redemption]]’s resistance against damage from a fiend is 7 + your level.
If you use [[Liberating Step]] triggered by a fiend, your ally gains a +4 circumstance bonus to checks granted by your Liberating Step, and the ally can [[Step]] twice afterward.
You don’t consider fiends to be legitimate authorities, even in nations ruled by fiends.
{{||SpellSummaryTable}}
You become living flame, giving you <<tag Fire>> [[Immunity]], [[Resistance]] 10 to precision damage, and [[Weakness]] 5 to <<tag Cold>>and to <<tag Water>>.
Any creature that touches you or damages you with an unarmed attack or non-reach melee weapon takes 3d6 <<tag Fire>> damage.
Your unarmed attacks deal 1d4 additional fire damage, and your fire spells deal one additional die of fire damage (of the same damage die the spell uses).
You can cast [[Produce Flame]] as an [[Innate Spell]]; the casting is reduced from 2 actions to 1.
In fire form, you have a fly Speed of 40 feet and don’t need to breathe.
Heightened (9th) Creatures touching you take 4d6 fire damage instead of 3d6, your unarmed attacks deal 2d4 additional fire damage, and you have a fly Speed of 60 feet.
//This animal companion is a specific creature found in the Fall of Plaguestone adventure. It is not a generally available class of animal companion.//
''Size'' Small //(but a small tiger/jaguar or "Big cat", not Tiddles)//
''Immunities'' Fire
''Weaknesses'' Cold 5
''Melee'' {{OneAction}} jaws [[Finesse]], damage 1d6 piercing plus 1 fire, or 1d4 fire if nimble or savage.
''Melee'' {{OneAction}} talon ([[Agile]], [[Finesse]]), Damage 1d4 slashing
''Str'' +2, ''Dex'' +3, ''Con'' +1, ''Int'' –4, ''Wis'' +2, ''Cha'' +0
''Hit Points'' 4
''Skill'' [[Stealth]]
''Senses'' [[Low-Light Vision]], [[Scent]] (Imprecise, 30 feet)
''Speed'' 35 feet
''Fiery Pelt'' Creatures that start their turn grappled by the fiery leopard take 1d4 fire damage. Anyone attempting to grapple the fiery leopard takes 1d4 fire damage for each attempt.
''Burning Glow'' The fiery leopard sheds dim light in a 10-foot radius which gives it a –2 circumstance penalty on Stealth checks made at night or in a dark environment.
''Support Benefit'' Your fiery leopard throws your enemies off-balance when you create an opening. Until the start of your next turn, your [[Strike]]s that deal damage to a creature that your leopard threatens make the target [[Flat-Footed]] until the end of your next turn.
''Advanced Maneuver'' [[Cat Pounce]]
!! Splats
<$list filter="[tag<currentTiddler>tag[Splat]]" />
!! Class Features
| !Level | !Features |
| 1 | [[Attack of Opportunity]], [[Shield Block]] |
| 2 | |
| 3 | [[Bravery]] |
| 4 | |
| 5 | [[Fighter Weapon Mastery]] |
| 6 | |
| 7 | [[Battlefield Surveyor]], [[Weapon Specialization]] |
| 8 | |
| 9 | [[Combat Flexibility]], [[Juggernaut]] |
| 10 | |
| 11 | [[Armor Expertise]], [[Fighter Expertise]] |
| 12 | |
| 13 | [[Weapon Legend]] |
| 14 | |
| 15 | [[Evasion]], [[Greater Weapon Specialization]], [[Improved Flexibility]] |
| 16 | |
| 17 | [[Armor Mastery]] |
| 18 | |
| 19 | [[Versatile Legend]] |
| 20 | |
!! Class Feats
{{||ClassFeatList}}
You become trained in simple weapons and martial weapons.
You become trained in your choice of [[Acrobatics]] or [[Athletics]]; if you are already trained in both of these skills, you instead become trained in a skill of your choice.
You become trained in fighter class DC.
<<levelfeatlist "4 6 12" "[tag[Archetype]field:feat-arch[Fighter]]">>
You’ve practiced your techniques to make them harder to resist.
Your proficiency rank for your fighter class DC increases to expert.
''Prerequisite'' Class granting no more Hit Points per level than 8 + your Constitution modifier.
You gain 3 additional Hit Points for each fighter archetype class feat you have.
As you continue selecting fighter archetype class feats, you continue to gain additional Hit Points in this way.
Hours spent training with your preferred weapons, learning and developing new combat techniques, have made you particularly effective with your weapons of choice.
Choose one weapon group. Your proficiency rank increases to master with the simple and martial weapons in that group, and to expert with the advanced weapons in that group.
You gain access to the [[Critical Specialization Effect]]s of all weapons for which you have master proficiency.
This [[+1|Weapon Potency]] trident, usually engraved with a decorative pattern resembling fish scales, is a common weapon among warriors of aquatic ancestries.
''Activate'' {{OneAction}} [[Interact]]; ''Effect'' You extend or shorten the trident’s haft. When extended, the trident requires two hands to wield and gains the [[Reach]] trait, but loses the trident’s normal [[Thrown]] trait.
''Frequency'' once per day
You embrace your monstrous blood and make it your own, screaming out to the heavens and hells alike in rage, pain, and defiance. Reality buckles and twists under your sudden power—each tiefling has a unique transformation, but it might include sulfurous flames, choruses of shrieks, or twisting, serpentine lightning.
Every creature within 10 feet of you is [[Deafened]] and [[Dazzled]] for 1 round unless they
succeed at a [[Fortitude]] save using your class DC or spell DC, whichever is higher.
Your final form has the effects of [[Divine Vessel]] for a deity that shares an alignment with your fiendish lineage.
Your final form resembles a creature from your fiendish lineage, and you remain in that form for 1 minute.
While in your final form, you can cast [[Chilling Darkness]], [[Fireball]], and [[Lightning Bolt]] as 6th-level divine innate spells, once each per use of this feat.
When you emerge from your final form, you become [Drained]] 3.
In addition, if you have this feat, you gain weakness 10 to good even when not in your final form, and you take good damage even if you aren’t evil.
''Special'' At the GM’s discretion, the specific elements of this feat can be adjusted to better fit the tiefling’s lineage—for example, a GM might decide that a particular beastbrood tiefling could cast a 6th-level [[Phantasmal Killer]] instead of fireball.
{{||SpellSummaryTable}}
You channel disruptive energies through the bond between you and your minion, causing it to violently explode.
The target is immediately slain, and creatures within 20 feet of it take 6d6 fire damage (basic [[Reflex]] save).
If the target has the <<tag Cold>> or <<tag Water>> trait, the spell instead deals cold damage and gains the cold trait in place of the fire trait.
If used on a creature that isn’t <<tag Mindless>>, this spell has the <<tag Evil>> trait.
Attempting to cast this spell targeting a creature that you temporarily seized control of, such as an <<tag Undead>> commanded by [[Command Undead]], automatically fails and breaks the controlling effect.
''Heightened (+1)'' The damage increases by 2d6.
!! Spells with no levels
<$list filter="[tag[Spell]!has[m-level]]" />
!! Spells with m-components field not matching tags
!!! Tag but no list entry
Somatic
<$list filter="[tag[Somatic]!contains:m-components[Somatic]]" />
Verbal
<$list filter="[tag[Verbal]!contains:m-components[Verbal]]" />
Material
<$list filter="[tag[Material]!contains:m-components[Material]]" />
!!! List entry but no tag
Somatic
<$list filter="[!tag[Somatic]contains:m-components[Somatic]]" />
Verbal
<$list filter="[!tag[Verbal]contains:m-components[Verbal]]" />
Material
<$list filter="[!tag[Material]contains:m-components[Material]]" />
!! Spells with mismatched action tags
!!! Somatic and no Manipulate
<$list filter="[tag[Somatic]!tag[Manipulate]]" />
!!! Material and no Manipulate
<$list filter="[tag[Material]!tag[Manipulate]]" />
!!! Manipulate and no Somatic or Material
<$list filter="[tag[Spell]tag[Manipulate]!tag[Material]!tag[Somatic]]" />
!!! Verbal and no Concentrate
<$list filter="[tag[Verbal]!tag[Concentrate]]" />
!!! Concentrate and no Verbal
<$list filter="[tag[Spell]!tag[Verbal]tag[Concentrate]]" />
!! Skill actions without modifier trees
<$list filter="[has[a-skill]!has[modified-by]]" />
!! Feats with no levels
<$list filter="[tag[Feat]!has[feat-level]]" />
!! Broken links
<$list filter="[all[missing]sort[]]" />
You can use your [[Dexterity]] modifier instead of your [[Strength]] modifier on attack rolls using this melee weapon.
You still use your Strength modifier when calculating damage.
//Finesse is only listed for monster's Strikes if they normally choose to use their [[Dexterity]] modifier.//
Many fiends—rakshasa rajas and demonic succubi most famously—can take on the forms of others. With practice, you can do the same.
When you use [[Devil in Plain Sight]], you can alter your appearance to match a generic member of your base ancestry, rather than one that’s obviously you without your tieflings features.
In addition, you can imitate a specific person’s appearance (of any ancestry of the same size and kind as your base ancestry, typically a humanoid for most ancestries) if you consume a bit of their blood, a lock of their hair, or appropriate equivalents as part of the action.
You still must know what the creature looks like, and you must be aware that the consumed portion comes from their body.
{{||SpellSummaryTable}}
You point your finger toward the target and speak a word of slaying.
You deal 70 <<tag Negative>>damage to the target //with a basic [[Fortitude]] save//.
If the damage from finger of death reduces the target to 0 Hit Points, the target dies instantly.
''Heightened (+1)'' The damage increases by 10.
Finishers are spectacular finishing moves that use your [[Panache]].
You can use a finisher only if you have panache, and you lose your panache immediately after
performing a finisher.
Once you use a finisher, you can’t use actions that have the <<tag Attack>> trait for the rest of your turn.
Some actions with the finisher trait also grant an effect on a failure. Effects added on a failure don’t apply on a critical failure.
If your finisher action succeeds, you can still choose to apply the failure effect instead. For example, you might do this when an attack deals no damage due to resistance.
The ridges and flaps of your skin steer you through the water.
You gain a swim Speed of 15 feet.
Effects with the fire trait deal fire damage or either conjure or manipulate fire.
Those that manipulate fire have no effect in an area without fire.
Creatures with this trait are primarily constituted of fire or have a magical connection to that element.
''Trigger'' A creature moves into the hazard’s space.
//The bombs attached to an object (via [[Demolition Charge]])// explode, dealing the bombs’ damage and splash damage to the inanimate object.
Combine this damage for the purpose of resistances and weaknesses, and this damage ignores an amount of the object’s Hardness equal //to the level of the Alchemist that set the hazard//.
Any creatures adjacent to the hazard take the bombs’ splash damage, similarly combined for the purpose of resistances and weaknesses.
Since //the alchemist// didn’t throw the bombs, Calculated Splash and similar effects don’t apply.
{{||SpellSummaryTable}}
A blazing band of fire arcs through the air.
Make a spell attack roll.
The ray deals 2d6 <<tag Fire>> damage.
//On a critical hit, in addition to double damage, the ray deals 1d4 [[persistent|Persistent Damage]] fire damage.//
''Heightened (+1)'' The ray’s initial damage increases by 2d6, and the persistent fire damage on a critical success increases by 1d4.
{{||SpellSummaryTable}}
Four acorns grow in your hand, their shells streaked with pulsing red and orange patterns.
You or anyone else who has one of the acorns can toss it up to 30 feet with an [[Interact]] action.
It explodes in a 5-foot [[Burst]], dealing 4d6 fire damage //with a basic [[Reflex]] save//.
The save uses your spell DC, even if someone else throws the acorn.
Flames continue to burn on the ground in the burst for 1 minute, dealing 2d6 fire damage to any creature that enters the flames or ends its turn within them.
A creature can take damage from the continuing flames only once per round, even if it’s in overlapping areas of fire created by different acorns.
When the spell ends, any remaining acorns rot and turn to ordinary soil.
''Heightened (8th)'' The burst’s damage increases to 5d6, and the continuing flames damage increases to 3d6.
''Heightened (9th)'' The burst’s damage increases to 6d6, and the continuing flames damage increases to 3d6.
{{||SpellSummaryTable}}
You wreathe yourself in ghostly flames, gaining <<tag Cold>>[[Resistance]] 5.
Additionally, adjacent creatures that hit you with a melee attack, as well as creatures that touch you or hit you with an unarmed attack, take 2d6 fire damage each time they do.
''Heightened (+2)'' The cold resistance increases by 5, and the fire damage increases by 1d6.
{{||SpellSummaryTable}}
A roaring blast of fire appears at a spot you designate, dealing 6d6 fire damage //with a basic [[Reflex]] save.//
''Heightened (+1)'' The damage increases by 2d6.
//This Dedication has special plot requirements described in the Lost Omens Character Guide.//
You gain [[Boast]].
<<archetypefeatlist "6 8 10 12" "[[Firebrand Braggart]]">>
You can see through the haze of flame.
You automatically succeed at the flat check to target a [[Concealed]] creature if that creature is concealed only by smoke and fire.
''Prerequisites'' at least one primal innate spell
Over time your fey magic has grown stronger.
You gain [[Faerie Fire]] and [[Invisibility]] as 2nd-level primal innate spells. You can cast each of these primal innate spells once per day.
Your connection to the First World grants you a primal innate spell, much like those of the fey.
Choose one cantrip from the primal spell list. You can cast this spell as a primal innate spell at will. A cantrip is heightened to a spell level equal to half your level rounded up.
''Spells available:''
<<bulletlist "[tag[Primal]tag[Cantrip]]">>
If you roll a success on an attempt to [[Grab an Edge]], you get a critical success instead; if you roll a critical failure, you get a failure instead. A creature that rolls a failure on a check to [[Disarm]] you gets a critical failure instead.
You love to kick your enemies when they’re down, and you look fabulous when you do.
When you make a melee weapon [[Strike]] against a foe that has at least two of the following conditions, you gain a circumstance bonus to your damage roll equal to the number of
these conditions the foe has.
The qualifying conditions are [[Clumsy]], [[Drained]], [[Enfeebled]], [[Frightened]], [[Sickened]]], and [[Stupefied]].
If you hit such a foe, you gain a +1 circumstance bonus to skill checks to [[Tumble Through]] and to perform your style’s panache-granting actions until the end of your turn.
{{||SpellSummaryTable}}
''Trigger'' An effect would deal <<tag Fire>>damage to either you or an ally within range.
You swiftly deflect incoming flames. The target gains fire resistance 15 against the triggering effect.
''Heightened (+2)'' The resistance increases by 5.
''Frequency'' once per day
Your peri lineage has opened your mind to fire’s raw, purging essence.
You can spend 1 minute in focused preparation, then enter a fire your size or larger to instantly teleport to any fire that is your size or larger up to 5 miles away.
You take no damage from entering or exiting fires when using this ability.
Once you enter the fire, you instantly know the rough locations of other large fires within range and can exit from the original fire, if you prefer.
You can’t carry extradimensional spaces with you when you teleport; if you attempt to do so, the activity fails.
Affix to armor.
''Activate'' {{OneAction}} Envision.
''Requirements'' You are an expert in [[Will]] saves.
This piece of bronzite is shaped like an oval with points at both ends. It has a carved flame at its center and is traditionally worn over the heart.
You can activate only one flame navette per day.
When you activate the navette, you gain the benefit of the fighter’s [[Determination]] class feat, with a [[Counteract]] modifier of +22. If you have the Determination feat, you can use your own modifier if it’s better.
{{||SpellSummaryTable}}
You call a rain of divine fire that plummets down from above, dealing 8d6 fire damage //with a basic [[Reflex]] save.//
Because the flame is infused with divine energy, creatures in the area apply only half their usual
fire resistance.
Creatures that are immune to fire, instead of gaining the usual benefit of immunity, treat the results of their saving throws as one degree of success better.
''Heightened (+1)'' The damage increases by 2d6.
This longsword has an ornate brass hilt and a blade shaped like stylized flames.
When wielded, the blade projects illumination resembling shimmering firelight, emitting dim light in a 10-foot radius.
''Activate'' {{TwoAction}} Command, [[Interact]]; ''Effect'' You cast the [[Produce Flame]] cantrip from the sword, using your melee attack modifier with Flame Tongue as your spell attack modifier.
''Activate'' {{OneAction}} Command; ''Greater Flame Tongue only''; ''Effect'': A 10-foot emanation of flame radiates from the greater flame tongue for 1 minute. All weapon and unarmed attacks by you and your allies within the area gain the effect of the [[Flaming]] property rune.
| !Type | !Level | !Price | !Base Runes | !Produce Flame Level |
| Standard | 13 | 28000 | [[+2|Weapon Potency]] Greater [[Striking]] [[Flaming]] | 7th |
| Greater | 17 | 138000 | [[+3|Weapon Potency]] Greater [[Striking]] Greater [[Flaming]] | 9th |
{{||MysterySummary}}
You have expert proficiency in [[Reflex]] saves. At 13th level, if you gain the [[Lightning Reflexes]] class feature, your proficiency rank for Reflex saves increases to master, and when you roll a success on a Reflex save, you get a critical success instead.
!!! Curse of Engulfing Flames
''Minor Curse'' The smoke, heat, and crackling flames of your curse fill your vision and all your other senses. Creatures further than 30 feet are [[Concealed]] from you. You can’t benefit from effects that would allow you to ignore or mitigate this concealment, as normal for effects of an oracular curse.
''Moderate Curse'' Smoke and flickering visions of flame fill your senses more completely, and harmless flickers of obscuring flames also fill your space. You are concealed from other creatures, though as the other creatures aren’t cursed themselves, they can benefit from effects that would allow them to ignore or mitigate the concealed condition, as normal. All other creatures and objects are concealed from you regardless of distance; however, when casting a <<Tag Fire>> spell, you automatically succeed at the flat check for this [[Concealed]] condition for targets within 30 feet. All your senses become imprecise beyond 30 feet, meaning everything past 30 feet that you’d normally be able to see is [[Hidden]] from you.
''Major Curse'' The flames surrounding you are no longer simply visions. An aura of fire surrounds you in a 10-foot [[Emanation]], dealing 4d6 fire damage (basic [[Reflex]] save) to all other creatures in the aura at the end of each of your turns. You lose 1d6 Hit Points at the end of your turn eac round, with no save; if you have a weakness to fire, increase the number of HP you lose by that weakness. You can suppress your aura until the start of your next turn by spending a single action, which has the <<tag Concentrate>> trait, to diminish the flames, causing neither you nor anyone in the aura to take damage. While Refocusing to reduce your curse, you are continually diminishing the flames, so you don’t lose HP. The flames subside if you fall unconscious, but they resume when you wake up unless you rested for long enough to reset your curse. As usual for oracular curses, you can’t mitigate or reduce the lost Hit Points in any way, though you can still heal the lost HP normally after the fact.
''Usage'' etched onto a weapon.
This weapon is empowered by flickering flame.
The weapon deals an additional 1d6 <<tag Fire>> damage on a successful [[Strike]], plus 1d10 [[persistent fire damage|Persistent Damage]] on a critical hit.
''Greater Flaming'': Increase the persistent damage on a critical hit to 2d10. Fire damage dealt by this weapon (including the persistent fire damage) ignores the target’s fire resistance.
{{||SpellSummaryTable}}
You call upon an endless barrage of flames, producing miniature fireballs in your hands to hurl at foes.
You cast [[Produce Flame]] as part of casting flaming fusillade.
For the duration of flaming fusillade, produce flame’s casting time is reduced from 2 actions to 1.
''Heightened (9th)'' For the duration, you also gain a status bonus to the damage dealt by produce flame equal to flaming fusillade’s spell level.}
{{||SpellSummaryTable}}
You create a sphere of flame in a square within range.
The sphere must be supported by a solid surface, such as a stone floor.
The sphere deals 3d6 fire damage to each creature in the square where it first appears; each creature must attempt a basic [[Reflex]] save.
On subsequent rounds, you can [[Sustain this Spell|Sustain a Spell]], leaving the sphere in its square or rolling it to another square within range and dealing 3d6 fire damage; each creature in its square must attempt a basic Reflex save.
Creatures that succeed at their save take no damage (instead of half).
''Heightened (+1)'' The damage increases by 1d6.
When you and an ally are flanking a foe, it has a harder time defending against you.
A creature is [[Flat-Footed]] to creatures that are flanking it.
To flank a foe, you and your ally must be on opposites sides or corners of the creature. A line drawn between the center of your space and the center of your ally’s space must pass through opposite sides or opposite corners of the foe’s space.
Additionally, both you and the ally have to be able to act, must be wielding melee weapons or able to make an unarmed attack, can’t be under any effects that prevent you from attacking, and must have the enemy within reach. If you are wielding a <<tag Reach>> weapon, you use your reach with that weapon for this purpose.
//Implied by [[Ki Form]].//
As a single action, which has the concentrate trait, you can flare your corona out to become a 30-foot emanation.
You’re distracted or otherwise unable to focus your full attention on defense.
You take a –2 circumstance penalty to [[AC]].
Some effects give you the flat-footed condition only to certain creatures or against certain attacks. Others— especially conditions—can make you universally flatfooted against everything. If a rule doesn’t specify that the condition applies only to certain circumstances, it applies to all of them; for example, many effects simply say “The target is flat-footed.”
''Frequency'' once per round
You can fly through the air in short bursts at half your land Speed.
If you don’t end your movement on solid ground, you [[fall|Falling]] at the end of your turn.
You’re forced to run away due to fear or some other compulsion.
On your turn, you must spend each of your actions trying to escape the source of the fleeing condition as expediently as possible (such as by using move actions to flee, or opening doors barring your escape). The source is usually the effect or caster that gave you the condition, though some effects might define something else as the source.
You can’t [[Delay]] or [[Ready]] while fleeing.
You move more quickly on foot.
Your Speed increases by 5 feet.
{{||SpellSummaryTable}}
You gain a +30-foot status bonus to your Speed.
You’re able to quickly disappear and then move about stealthily.
You [[Hide]], then [[Sneak]] twice.
''Requirements'' Your last action was a [[Double Slice]], and both attacks hit the target.
When you hit with both attacks with Double Slice, you flense the target, making it bleed and creating a weak spot.
The target takes 1d8 persistent bleed damage per weapon damage die of whichever of the weapons you used that has the most weapon damage dice (maximum 4d8 for a major striking weapon).
The target becomes [[Flat-Footed]], and its resistances to any physical damage types are reduced by 5; these two effects last until the beginning of your next turn.
{{||SpellSummaryTable}}
You try to turn the target’s flesh into stone.
The target must attempt a [[Fortitude]] save.
{{||SaveSuccessTable}}
You don’t treat tight spaces (that don’t require you to [[Squeeze]]) as [[Difficult Terrain]]. In addition, you get a +1 circumstance bonus to checks when you attempt to Escape.
You broaden your ability to channel your power into halcyon magic.
You gain one more common halcyon spell of each level of halcyon spell you can cast other than your highest (you do not gain an additional cantrip).
You also gain one additional halcyon spell slot for each level of halcyon spell you can cast, other than the highest.
You can perform two aspects of a ritual yourself.
When you cast a ritual, you can reduce the number of secondary casters by 1.
When you do, you must fulfill any requirements for the secondary caster, and you attempt the secondary check normally performed by that secondary caster.
You can’t replace a secondary caster who is the target of the spell (as in the atone ritual).
You’ve collected a cross-section of information on various disciplines you can refer to when preparing for various tasks.
During your daily preparations, you can cram on a certain subject to become temporarily trained in one skill of your choice. This proficiency lasts until you prepare again.
As this proficiency is temporary, you can’t use it as a prerequisite for a skill increase or a permanent character option like a feat.
You can perform simple [[Interact]] actions with your tail, such as opening an unlocked door.
Your tail can’t perform actions that require fingers or significant manual dexterity, including any action that would require a check to accomplish, and you can’t use it to hold items.
{{LOWGFeat}}
You use your movements and disguises to make yourself a flickering blur.
You gain [[Concealment]] until your next turn.
As usual for concealment involving an obvious visual manifestation, you can’t use this concealment to [[Hide]].
You take a moment to center yourself, then unleash a powerful blow that sends your target tumbling away.
Make an unarmed [[Strike]].
If you hit, the target must succeed at a [[Fortitude]] save against your class DC or be pushed up to 10 feet directly away from you (or 20 feet, on a critical failure) and fall [[Prone]].
If another creature or physical object would prevent this movement, both your target and the blocking creature or object take 1d6 bludgeoning damage per 5 feet of movement that was prevented.
Increase the distance you [[Shove]] your opponent with [[Aggressive Block]] or [[Brutish Shove]] to 10 feet on a success or 20 feet on a critical success.
When you use [[Aggressive Block]], you can choose whether the target is [[Flat-Footed]] or Shoved.
When you make a [[Brutish Shove]], you also Shove the target 5 feet on a failure.
{{||SpellSummaryTable}}
A disk of magical force materializes adjacent to you.
This disk is 2 feet in diameter and follows 5 feet behind you, floating just above the ground.
It holds up to 5 [[Bulk]] of objects (though they must be able to fit and balance on its surface).
Any objects atop the disk fall to the ground when the spell ends.
The spell ends if a creature tries to ride atop the disk, if the disk is overloaded, if anyone tries to lift or force the disk higher above the ground, or if you move more than 30 feet away from the disk.
Actions with this trait are special techniques that require too much exertion for you to perform frequently. You can use only 1 action with the flourish trait per turn.
You can call upon the vital essence of your spirit to restore life to your allies and call forth vines to ensnare and bludgeon your foes.
You can cast [[Field of Life]] and [[Tangling Creepers]] as 6th-level primal innate spells once per day each.
You become an expert in primal spell attack rolls and primal spell DCs.
You can ignore [[Difficult Terrain]] caused by moving through tight spaces that aren’t tight enough to force you to [[Squeeze]].
When you roll a critical failure on a check to [[Squeeze]], you get a failure instead, and when you roll a success, you get a critical success instead.
You have trained to unleash a devastating flurry of attacks upon your prey.
Your [[Multiple Attack Penalty]] for attacks against your hunted prey is –3 (–2 with an [[Agile]] weapon) on your second attack of the turn instead of –5, and –6 (–4 with an agile weapon) on your third or subsequent attack of the turn, instead of –10.
When you gain [[Masterful Hunter]], you can blend your weapon mastery with skillful targeting to make a series of precise attacks. If you have master proficiency with your weapon, your multiple attack penalty for attacks against your hunted prey is –2 (–1 with an [[Agile]] weapon) on your second attack of the turn, and –4 (–2 with an agile weapon) on your third and subsequent attacks of the turn.
Make two unarmed [[Strike]]s.
If both hit the same creature, combine their damage for the purpose of resistances and weaknesses.
Apply your [[Multiple Attack Penalty]] to the Strikes normally.
As it has the flourish trait, you can use Flurry of Blows only once per turn.
Your flurry is a combination of maneuvers.
You can replace one or both of your attacks during a [[Flurry of Blows]] with [[Grapple]]s, [[Shove]]s, or [[Trip]]s.
''Requirements'' You have a fly Speed.
You move through the air up to your fly Speed.
Moving upward (straight up or diagonally) uses the rules for moving through [[Difficult Terrain]].
You can move straight down 10 feet for every 5 feet of movement you spend.
If you Fly to the ground, you don’t take [[Falling]] damage.
You can use an action to Fly 0 feet to hover in place.
If you’re airborne at the end of your turn and didn’t use a Fly action this round, you fall.
{{||SpellSummaryTable}}
The target can soar through the air, gaining a fly Speed equal to its Speed or 20 feet, whichever is greater.
''Heightened (7th)'' The duration increases to 1 hour.
The bird [[Flies|Fly]] and makes a talon [[Strike]] at any point along the way.
You launch yourself at a foe.
Make a [[Leap]] or attempt a [[High Jump]] or [[Long Jump]].
At the end of the jump, if you’re adjacent to a foe, you can immediately [[Strike]] that foe with an unarmed attack, even if the foe is in mid-air.
You fall to the ground after the Strike. If the distance you fall is no more than the height of
your jump, you land upright and take no damage.
A focus is an object that funnels the magical energy of the spell.
The spell gains the [[Manipulate]] trait and requires you to either have a free hand to retrieve the focus listed in the spell or already be holding the focus in your hand.
As part of Casting the Spell, you retrieve the focus (if necessary), manipulate it, and can stow it again if you so choose.
//You can't retrieve or stow a Focus component in the same action as Casting the Spell if you're substituting the Focus component for another type of component.//
Foci tend to be expensive, and you need to acquire them in advance to Cast the Spell.
Focus briefly calms your neurons, helping ease mental effects.
When you drink this elixir, the elixir attempts a [[Counteract]] check with the listed counteract modifier to remove the [[Confused]] or [[Stupefied]] condition from a single source, using the source of that condition to determine the counteract level and DC.
| !Type | !Level | !Price | !Counteract modifier |
| Lesser | 2 | 50 | +6 |
| Moderate | 4 | 150 | +8 |
| Greater | 12 | 3250 | +19 |
| Major | 18 | 32500 | +28 |
//Implied by [[Entrancing Eyes]].//
During any round you Sustain the Spell, you can use a single action, which has the manipulate trait, to focus your entrancing eyes on a single creature you can see within 30 feet.
Focus spells are a special type of spell attained directly from a branch of study, from a deity, or from another specific source.
You can learn focus spells only through special class features or feats, rather than choosing them from a spell list.
Furthermore, you cast focus spells using a special pool of Focus Points—you can’t prepare a focus spell in a spell slot or use your spell slots to cast focus spells; similarly, you can’t spend your Focus Points to cast spells that aren’t focus spells.
Even some classes that don’t normally grant spellcasting, such as the [[Champion]] and [[Monk]], can grant focus spells.
Focus spells are automatically heightened to half your level rounded up, just like cantrips are.
You can’t cast a focus spell if its minimum level is greater than half your level rounded up, even if you somehow gain access to it.
Casting any of your focus spells costs you 1 Focus Point.
You automatically gain a focus pool of 1 Focus Point the first time you gain an ability that gives you a focus spell.
You replenish all the Focus Points in your pool during your daily preparations. You can also use the [[Refocus]] activity to pray, study, meditate, or otherwise reattune yourself to the source of your focus magic and regain a Focus Point.
Some abilities allow you to increase the Focus Points in your pool beyond 1. Typically, these are feats that give you a new focus spell and increase the number of points in your pool by 1.
Your focus pool can’t have a capacity beyond 3 Focus Points, even if feats that increase your pool would cause it to exceed this number.
When you [[Cat Nap]], you can also [[Refocus]] as you dream of a relevant activity.
''Trigger'' Your turn begins.
You continue Juggling until the end of your next turn.
Increase the maximum number of items you can [[Juggle]] by one.
''Requirements'' You are in [[Monastic Archer Stance]].
You achieve a state of perfect calm before unleashing your attack, opening your mind to the minute movements of the world around you to increase your accuracy.
Make a ranged weapon [[Strike]] against a target within your weapon’s first range increment. This Strike ignores the target’s [[Concealed]] condition and all [[Cover]].
''Prerequisites'' Master in [[Stealth]].
You are adept at foiling creatures’ special senses and cautious enough to safeguard against them at all times.
Whenever you use the [[Avoid Notice]], [[Hide]], or [[Sneak]] actions, you are always considered to be taking precautions against special senses.
You are adept at disguising coded messages as folksy idioms.
Using slang, jokes, halfling loanwords, and the like, you convey a simple message consisting of three basic words (such as “Danger assassin flee” or “Meet me moonrise”).
Your intended listener can attempt a [[Perception]] check to discern the message (DC 20 if an ally, DC 15 if a halfling ally, DC 10 if a halfling ally with Folksy Patter).
Eavesdroppers can also attempt a [[Perception]] check against your [[Deception]] DC to discern your meaning. Any bonuses or penalties to Perception checks to [[Sense Motive]] apply.
Choose an ally attempting a recurring skill check while exploring, such as [[Climb]]ing, or performing a different exploration tactic that requires a skill check (like [[Avoid Notice]]).
The ally must be at least an expert in that skill and must be willing to provide assistance.
While Following the Expert, you match their tactic or attempt similar skill checks.
Thanks to your ally’s assistance, you can add your level as a proficiency bonus to the associated skill check, even if you’re untrained.
Additionally, you gain a circumstance bonus to your skill check based on your ally’s proficiency (+2 for expert, +3 for master, and +4 for legendary).
A skilled character can help out less skilled allies who choose to Follow the Expert. This is a good way to help a character with a low Stealth modifier sneak around, get a character with poor Athletics up a steep cliff, and so on.
Usually, a character who is Following the Expert can’t perform other exploration activities or follow more than one person at a time.
''Requirements'' You used your previous action to make a melee [[Strike]] that missed.
Even in the face of failure you press the attack, determined to succeed.
Make a [[Strike]] with the same weapon, adding the effects of the [[Backswing]] and [[Forceful]] weapon traits.
''Requirements'' Your last action was a missed Strike with a melee unarmed attack.
You have trained to use all parts of your body as a weapon, and when you miss with an attack, you can usually continue the attack with a different body part and still deal damage.
Make another [[Strike]] with a melee unarmed attack, using the same [[Multiple Attack Penalty]] as for the missed Strike, if any.
Experience or focused study have granted you mastery of a number of topics. When you know about something, you know about it in great detail.
When you succeed at a check to [[Recall Knowledge]], you gain additional information or context.
When you critically succeed at a check to Recall Knowledge, at the GM’s discretion, you might gain even more additional information or context than normal.
{{||SpellSummaryTable}}
A divine beacon radiates serenity, soothing nearby allies.
Allies within the area gain a +1 status bonus to saving throws against <<tag Emotion>> effects.
An ally can touch the font as an [[Interact]] action; if they do so, the spell attempts to [[Counteract]] one emotion effect affecting the ally of the ally’s choice, after which that emotion effect is temporarily immune for 1 day.
If the spell succeeds at the counteract check, it removes the emotion effect from your ally, though not from any other creatures the effect might be affecting.
''Heightened (+4)'' The bonus increases by 1.
''Prerequisites'' Trained in [[Survival]].
While using Survival to [[Subsist]], if you roll any result worse than a success, you get a success.
On a success, you can provide subsistence living for yourself and four additional creatures, and on a critical success, you can take care of twice as many creatures as on a success.
Each time your proficiency rank in Survival increases, double the number of additional creatures you can take care of on a success (to eight if you’re an expert, 16 if you’re a master, or 32 if you’re legendary). You can choose to care for half the number of additional creatures and provide a comfortable living instead of subsistence living.
Multiple smaller creatures or creatures with significantly smaller appetites than a human are counted as a single creature for this feat, and larger creatures or those with significantly greater appetites each count as multiple creatures. The GM determines how much a non-human creature needs to eat.
{{||SpellSummaryTable}}
You ward an ally against the attacks and hostile spells from the target enemy.
The target ally gains a +1 status bonus to [[Armor Class|AC]] and saving throws against the target enemy’s attacks, spells, and other effects.
''Heightened (6th)'' The status bonus increases to +2.
{{||SpellSummaryTable}}
You fire an unerring dart of force from your fingertips.
It automatically hits and deals 1d4+1 <<tag Force>> damage to the target.
''Heightened (+2)'' The damage increases by 1d4+1.
{{||SpellSummaryTable}}
You create an immobile, invisible prison of sheer force.
The cage is a 20-foot cube made of bands of force, each a half inch thick and a half inch apart, that extend to the Ethereal Plane.
Each creature in the area where you create the cage must attempt a [[Reflex]] save. If such a creature fails, it becomes trapped inside the cage. If it succeeds, it’s pushed outside the cage into a space of its choice. If a creature in the area is too big to fit inside the prison, the spell automatically fails.
The cage has AC 10, Hardness 20, and 40 Hit Points, and it’s immune to critical hits and precision damage.
A creature capable of passing through the space between the bars (typically a Tiny creature) can leave; all others are confined within.
Attacks with a weapon too large to fit between the bars can’t pass through the cage, and the bars provide standard [[Cover]] even against attacks that can pass through the gaps. Spells and breath weapons can pass through the cage uninhibited.
Force cage is immune to [[Counteract]]ing effects of its level or lower, but it is automatically destroyed by a [[Disintegrate]] spell of any level, or by contact with a [[Rod of Cancellation]] or [[Sphere of Annihilation]].
Using your body, a lever, or some other tool, you attempt to forcefully open a door, window, container or heavy gate. With a high enough result, you can even smash through walls.
Without a crowbar, prying something open takes a –2 item penalty to the [[Athletics]] check to Force Open.
{{||ActionSuccessTable}}
You are trained to preserve the archaeological value of your location when entering.
You don’t take a penalty to [[Force Open]] doors, windows, or containers without a crowbar.
If you roll a success on a check to Force Open, you get a critical success instead.
When an effect forces you to move, or if you start [[Falling]], the distance you move is defined by the effect that moved you, not by your Speed.
Because you’re not acting to move, this doesn’t trigger reactions triggered by movement.
{{||SpellSummaryTable}}
You quiet the target’s voice, preventing it from giving away valuable secrets.
This doesn’t prevent the target from talking or providing verbal spell components, but no creature more than 10 feet away can hear its whispers without succeeding at a [[Perception]] check against your spell DC, which might interfere with <<tag Auditory>> or <<tag Linguistic>> effects as well as communication.
The spell’s duration depends on the target’s [[Fortitude]] save.
After attempting its save, the target becomes temporarily immune for 24 hours.
{{||SaveSummaryTable}}
This weapon becomes more dangerous as you build momentum.
When you attack with it more than once on your turn, the second attack gains a circumstance bonus to damage equal to the number of weapon damage dice, and each subsequent attack gains a circumstance bonus to damage equal to double the number of weapon damage dice.
You perform complex manipulations to make the energy from your spells so powerful that your enemies remain vulnerable to it afterward.
If your next action is to [[Cast a Spell]] that deals acid, electricity, fire, or sonic damage, you can select one target that was damaged to gain weakness 5 to that damage type until the end of your next turn.
If a spell deals multiple types of energy damage, choose one that the target gains weakness to.
This has no effect on creatures with resistanceor immunity to the energy type you choose.
You understand the principles of forensic medicine, making you better at examining a body to determine the cause of death or injury.
You can perform a forensic examination on a body, as described under [[Recall Knowledge]] in the [[Medicine]] skill, in half the normal amount of time it would take (to a minimum of 5 minutes).
If you succeed at your check, you can attempt an immediate check to [[Recall Knowledge]] to follow up on something you found, with a +2 circumstance bonus. This check is usually related to the cause of injury or death, such as a [[Crafting]] check to identify a poison or weapon that was used or an additional [[Medicine]] check to identify a specific disease.
If you prefer, you can instead attempt to [[Recall Knowledge]] about the type of creature whose body you were examining, using the appropriate skill and gaining the same circumstance bonus.
The circumstance bonus increases to +3 if you have master proficiency in Medicine and +4 if you have legendary proficiency.
You’ve learned that in most cases, especially murders, criminals tend to leave more evidence of the crime on the body than they’d like to believe. Information from bruising, bone fractures, blood spatters, and even the life cycle of carrion insects can provide valuable clues that help reconstruct the scene.
You’re trained in [[Medicine]] and gain the [[Forensic Acumen]] and [[Battle Medicine]] skill feats. When you use Battle Medicine, on a success the target recovers additional Hit Points equal to your level, and the target becomes temporarily immune for only 1 hour, not 1 day.
''Trigger'' A creature targets you with an attack and you can see the attacker.
You perceive every possible way your foe’s attack could land and attempt to avoid them all.
The triggering attack roll targets your [[Perception]] DC instead of your AC.
Though this allows you to avoid taking penalties to your AC, it doesn’t remove any conditions or other effects causing such penalties. For example, an enemy with [[Sneak Attack]] would still deal extra damage to you for being [[Flat-Footed]], even though you wouldn’t take the –2 circumstance penalty when defending against the attack.
{{||SpellSummaryTable}}
You gain a sixth sense that warns you of danger that might befall the target of the spell.
If you choose a creature other than yourself as the target, you create a psychic link through which you can inform the target of danger. This link is a <<tag Mental>>effect.
Due to the amount of information this spell requires you to process, you can’t have more than one foresight spell in effect at a time. Casting foresight again ends the previous foresight.
While foresight is in effect, the target gains a +2 status bonus to [[Initiative]] rolls and isn’t [[Flat-Footed]] against [[Undetected]] creatures or when [[Flanked|Flanking]].
In addition, you gain the following reaction.
{{Activate Foresight}}
''Prerequisites'' Expert in [[Stealth]].
''Requirements'' You are in a forest or jungle environment near an environmental feature that would allow you to [[Take Cover]].
You are skilled at quickly hiding behind bits of underbrush or foliage.
You [[Take Cover]] and then use that cover to [[Hide]].
''Frequency'' Once per day
You’ve learned to forestall the effects of your curse somewhat.
If the next action you use is to cast a revelation spell, the severity of your curse doesn’t increase.
//You gain// <<tag Fire>> resistance equal to half your level (minimum 1), and you treat environmental heat effects as if they were one step less extreme (incredible heat becomes extreme, extreme heat becomes severe, and so on).
Your unusual rest cycle allows you to recover faster.
As long as you rest for 12 hours, you gain the effects of the [[Fast Recovery]] general feat and you can go 20 hours without resting before becoming [[Fatigued]].
{{AoA3Spell}}
{{||SpellSummaryTable}}
You learn one piece of information that was removed from the target text after its creation.
You can instead learn one piece of information from a text that had been destroyed, but you must have a fragment of the text, such as a piece of the cover, a page, or even a clasp or metal fittings.
''Heightened (6th)'' The spell reconstructs all missing information regarding a specific topic of your choice.
''Heightened (9th)'' The spell also reveals information the writer self-censored and didn’t commit to paper.
Watching your friends age and die fills you with moroseness that protects you against harmful emotions.
You gain a +1 circumstance bonus to saving throws against <<tag Emotion>> effects. If you roll a success on a saving throw against an emotion effect, you get a critical success instead.
''Prerequisites'' [[Strength]] 14.
With additional care and effort, you can take on an alternate form for a longer period of time.
If your next action is to cast [[Wild Shape]], wild shape’s spell level is 2 lower than normal (minimum 1st level), but you can remain transformed for up to 1 hour or the listed duration (whichever is longer).
You can still [[Dismiss]] the form at any time, as permitted by the spell.
Requirements You have a foe [[Grabbed]] or [[Restrained]].
Your ability to control your own ki empowers you to pressure other creatures into resuming their true forms.
Attempt an [[Athletics]] check to [[Counteract]] a <<tag Polymorph>> effect currently affecting your target.
If the target is somehow under the effect of multiple polymorph effects, you can choose which one to attempt to counteract, or the GM chooses randomly if the separate effects aren’t obvious.
The target is then temporarily immune for 1 day.
''Frequency'' once per hour.
You can transform into a harmless bat.
You gain the effects of a 4th-level [[Pest Form]], except you always transform into a bat.
Part of your body has an obvious, fiendish appearance. Your hands end in razor-sharp claws, you have hooves instead of feet, sharp teeth fill your mouth, or a whipping tail extends from your spine.
You gain your choice of one of the following unarmed attacks. The attack is in the brawling group and has the listed damage die and traits.
* ''Claw'': 1d4 slashing ([[Agile]], [[Finesse]], [[Unarmed]], [[Versatile]] piercing)
* ''Hoof'': 1d6 bludgeoning ([[Finesse]], [[Unarmed]])
* ''Jaws'': 1d6 piercing ([[Finesse]], [[Unarmed]])
* ''Tail'': 1d4 bludgeoning ([[Agile]], [[Finesse]], [[Unarmed]])
''Special'' You can select this feat only at 1st level, and you can’t retrain into or out of this feat, nor can you change the type of attack you gained.
You have trained your mind and body to tolerate polymorph magic for longer periods of time, so long as you prepare for the change appropriately.
When preparing a polymorph spell that lasts 1 minute and grants a battle form, you can prepare the spell in a slot 2 levels higher than normal.
This doesn’t grant any of the normal benefits of heightening a spell, but the spell lasts up to 10 minutes.
For example, if you prepared [[Animal Form]] in a 4th-level slot with Form Retention, you would cast a 2nd-level animal form that lasts for up to 10 minutes.
If the spell can be [[Dismiss]]ed, that doesn’t change.
The troop chooses one of the squares it currently occupies and redistributes its squares to any configuration in which all squares are contiguous and within 15 feet of the chosen square.
The troop can’t share its space with other creatures.
You can assemble a formation even with members of ancestries that lack the hobgoblins’ military discipline, and you can extend these benefits to your hobgoblin allies.
When you are adjacent to at least two humanoid allies, you gain the benefits of [[Formation Training]], even if they aren’t hobgoblin allies.
Hobgoblin allies adjacent to you and at least one other hobgoblin ally also gain the bonuses from your [[Formation Training]] feat.
''Prerequisites'' trained in all martial weapons.
You know how to fight in formation with your brethren.
When you are adjacent to at least two hobgoblin allies, you gain a +1 circumstance bonus to AC and saving throws. This bonus increases to +2 on [[Reflex]] saves against area effects.
''Usage'' etched onto medium or heavy armor.
A fortification rune wards against the most deadly attacks.
Each time you’re critically hit while wearing the etched armor, attempt a flat check. On a success, it becomes a normal hit.
This property thickens the armor, increasing its Bulk by 1 and the Strength required to reduce its penalties by 2.
| !Type | !Level | !Price | !Flat check DC |
| (standard) | 12 | 20000 | 17 |
| Greater | 18 | 240000 | 14 |
{{LOWGFeat}}
Your flesh takes on the hardness of stone.
You gain resistance to physical damage (except adamantine) equal to your number of class feats from the Living Monolith archetype.
''Frequency'' once per day
You reinforce your shield with a rocky outgrowth of metal and stone.
You [[Raise your Shield|Raise a Shield]].
If you use the [[Shield Block]] reaction before your next turn, add your character level to your shield’s Hardness when determining how much damage is blocked.
//A Fortitude save is used to avoid negative effects by toughing them out.//
//Fortitude is governed by [[Constitution]].//
//Being [[Drained]], [[Fatigued]], [[Sickened]] or [[Frightened]] reduces your Fortitude rolls.//
//Fortitude saves are used://
* //To avoid being damaged by being [[Constrict]]ed.//
* //To prevent a creature you are [[Immobilizing|Immobilized]] from being moved.//
* //To recover from being [[Sickened]].//
{{||DefenseList}}
{{||SpellSaveList}}
You have grown more comfortable with your penchant for supernatural disappearance.
The flat check DC of your //[[Unexpected Shift]]// feat decreases to 11, and you are no longer [[Dazzled]] if you succeed.
//The original text reads "your Fortuitous Shift feat.." which would refer back to this feat again.//
A fortune effect beneficially alters how you roll your dice.
You can never have more than one fortune effect alter a single roll. If multiple fortune
effects would apply, you have to pick which to use.
If a fortune effect and a misfortune effect would apply to the same roll, the two cancel each other out, and you roll normally.
{{||SpellSummaryTable}}
You multiply the disease within a creature, drawing it into an infectious mist outside their body where it can spread to other creatures.
The target must attempt a [[Will]] save.
If the target is [[Willing]], it can choose to take the effects of critical failure.
{{||SaveSuccessTable}}
''Frequency'' once per hour
You always have time for a joke or prank.
You [[Create a Diversion]], [[Conceal an Object]], or [[Hide]].
All creatures who witnessed your Fox Trick then wise up to it, becoming temporarily immune to your Fox Trick for 24 hours.
A crack of your tail sparks wisps of blue energy.
Choose either <<tag Electricity>> or <<tag Fire>> when you gain this feat.
You gain a foxfire ranged unarmed attack with a maximum range of 20 feet. The attack deals 1d4 damage of the chosen type (no ability modifier is added to the damage roll). Your foxfire attack is in the sling weapon group. Like other unarmed attacks, you can improve this attack with [[Handwraps of Mighty Blows]].
''Special'' If you are a [[Frozen Wind Kitsune]], your foxfire deals <<tag Cold>> damage instead of electricity or fire.
This weapon doesn’t take up your hand, usually because it is built into your armor.
A free-hand weapon can’t be [[Disarm]]ed.
You can use the hand covered by your free-hand weapon to wield other items, perform
manipulate actions, and so on.
You can’t attack with a free-hand weapon if you’re wielding anything in that hand or otherwise using that hand.
When you’re not wielding anything and not otherwise using the hand, you can use abilities that require you to have a hand free as well as those that require you to be wielding a weapon in that hand.
Each of your hands can have only one free‑hand weapon on it.
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 100 100">
<polygon points="50,0 100,50 50,100 0,50" stroke="black" fill="white" stroke-width="7" />
<polyline points="0,50 25,25 50,50 25,75" stroke="black" fill="white" stroke-width="7" />
</svg>
{{||RitualSummaryTable}}
You perform a ritual to free a creature imprisoned, [[Petrified]], or otherwise put into stasis by any magical effects from all such effects, even effects like [[Imprisonment]] that don’t have a duration, as long as freedom’s spell level is equal to or higher than the effect’s spell level.
To perform the ritual, you must be within 10 feet of the target, or within 10 feet of the place where the target was imprisoned (in the case of effects that trap the creature in an unreachable prison, like the oubliette form of imprisonment).
You must know the name of the creature and details of its background; if the creature is not a close associate, a failure or critical failure on a secondary Society check reduces even a critical success on the primary check to a failure.
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
You repel effects that would hinder a creature or slow its movement.
While under this spell’s effect, the target ignores effects that would give them a circumstance penalty to Speed.
When they attempt to [[Escape]] an effect that has them [[Immobilized]], [[Grabbed]], or [[Restrained]], they automatically succeed unless the effect is magical and of a higher level than the freedom of movement spell.
Frigid ice runs through your veins, and you can expel frost from your body to freeze your foes.
Attempt an [[Athletics]] check against the [[Fortitude]] DC of an adjacent foe.
If you have master proficiency in Athletics, you can affect up to two adjacent foes, rolling one Athletics check against each foe.
{{||ActionSuccessTable}}
When using [[Natural Medicine]] to Treat Wounds, you can spend a batch of herbs to gain the +2 circumstance bonus from having fresh ingredients, even if not in wilderness.
If you spend a batch of herbs in wilderness, you gain a +4 circumstance bonus instead.
//Though not clearly stated, "spending a batch of herbs" presumably means spending a batch of infused reagents from the Herbalist archetype.//
__This condition reflects a creature’s disposition toward a particular character, and only supernatural effects (like a spell) can impose these conditions on player characters.__
A creature that is friendly to a character likes that character.
The character can attempt to make a [[Request]] of a friendly creature, and the friendly
creature is likely to agree to a simple and safe request that doesn’t cost it much to fulfill.
If the character or one of their allies uses hostile actions against the creature, the creature gains a worse attitude condition depending on the severity of the hostile action, as determined by the GM.
''Requirements'' You are adjacent to an ally and have one or more hands free.
You toss your friends around the battlefield.
Pick up an adjacent ally of your size or smaller and throw them to an unoccupied space you can see within 30 feet.
Their movement doesn’t trigger reactions.
Your ally ends this movement on their feet and doesn’t take damage from the fall.
If your ally ends this movement within melee reach of at least one enemy, they can make a melee [[Strike]] against an enemy within their reach as a reaction.
You’re gripped by fear and struggle to control your nerves.
The frightened condition always includes a value. You take a status penalty equal to this value to all your checks and DCs.
Unless specified otherwise, at the end of each of your turns, the value of your frightened condition decreases by 1.
Your dramatic appearances can frighten bystanders.
When you make a [[Startling Appearance]], you can also attempt to [[Demoralize]] each opponent within 10 feet to whom you were unnoticed before your Strike.
A creature that first enters the area must attempt a [[Will]] save.
Regardless of the result of the saving throw, the creature is temporarily immune to this monster’s Frightful Presence for 1 minute.
{{||SaveSuccessTable}}
You can flare your neck frill and flex your dorsal spines, Demoralizing your foes.
When you do, [[Demoralize]] loses the <<tag Auditory>> trait and gains the <<tag Visual>> trait, and you don’t take a penalty when you attempt to [[Demoralize]] a creature that doesn’t
understand your language.
You also gain the [[Threatening Approach]] action.
''Usage'' etched onto a weapon.
This weapon is empowered with freezing ice.
It deals an additional 1d6 <<tag Cold>> damage on a successful [[Strike]].
On a critical hit, the target is also [[Slowed]] 1 until the end of your next turn unless it succeeds at a DC 24 [[Fortitude]] save.
''Greater Frost'': The save DC is 34. Cold damage dealt by this weapon ignores the target’s cold resistance.
The blade of this [[+2|Weapon Potency]] greater [[Striking]] greater [[Frost]] greatsword appears to be nothing but icy shards.
The frost brand automatically extinguishes non-magical fires in a 20-foot [[Emanation]].
While wielding it, you gain fire resistance 5.
''Activate'' {{TwoAction}} command, [[Interact]]; ''Effect'' You swing the frost brand into the area of an ongoing magical fire, and the blade attempts to [[Counteract]] the fire with a counteract modifier of +27. If it fails, it can’t attempt to counteract the same fire again.
The liquid reagents in this vial rapidly absorb heat when exposed to air. A frost vial deals the listed cold damage and cold splash damage. On a hit, the target takes a status penalty to its Speeds until the end of its next turn. Many types of frost vial also grant an item bonus to attack rolls.
| !Type | !Level | !Price | !Cold Damage | !Cold Splash Damage | !Penalty to Speed | !Item bonus to attack |
| Lesser | 1 | 30 | 1d6 | 1 | -5' | None |
| Moderate | 3 | 100 | 2d6 | 2 | -10' | +1 |
| Greater | 11 | 2500 | 3d6 | 3 | -10' | +2 |
| Major | 17 | 25000 | 4d6 | 4 | -15' | +3 |
Your ancestors crossed the Crown of the World or resided on snowy peaks. You gain cold resistance equal to half your level (minimum 1). You treat [[environmental cold effects|Temperature Effects]] as if they were one step less extreme (incredible cold becomes extreme, extreme cold becomes severe, and so on). Your alternate form is a common Medium humanoid ancestry prevalent where you grew up (typically human), called a tailless form.
At dawn each day, a new fruit ripens. You or an ally can remove this fruit as an [[Interact]] action. If a living creature that can derive sustenance from fruit consumes it as an Interact action within the next hour, they regain 1d8 Hit Points, plus an additional 1d8 Hit Points for every 2 of your levels beyond 1st. This effect has the <<tag Healing>>, <<tag Necromancy>>, and <<tag Positive>> traits.
You gain the effects of Juvenile Flight at all times, rather than just once per day for 10 minutes.
This includes the status bonus to your Speed if you have [[Fledgling Flight]].
When you draw upon your spells’ synergy, you create a physical manifestation of their magical resonance and invoke it to harm a foe.
When you use Dualistic Synergy, choose a damage type: acid, cold, electricity, or fire.
In addition to Dualistic Synergy’s normal effect, a foe within 30 feet of you takes an amount of damage of the chosen type equal to the spell’s level. If the spell already deals damage of the chosen type, combine the damage before applying weaknesses and resistances.
The air inside you asserts itself as a toxic miasma, inuring you to most poisons.
You gain resistance to poison equal to half your level (minimum 1).
{{||SpellSummaryTable}}
Thin hyphae grow from your feet and plunge into the earth, creating a symbiotic fungal network that attaches to plants within 30 feet and connects you to their root systems.
You gain an imprecise [[Tremorsense]] allowing you to sense anything directly touching plants within that distance. If you move, the hyphae snap and the spell ends.
''Heightened (4th)'' You can control plants in the area to a small degree, allowing you to make [[Strikes]] with tree branches, exposed roots, or similarly solid plants. To do so, you use a Strike action, but you can Strike any creature you can detect with your tremorsense. These are melee spell attacks that deal 2d8 bludgeoning damage plus your spellcasting ability modifier. Unusual plants, such as thorny vines, might deal a different type of damage at the GM’s discretion.
You can’t make any other attacks through these plants, or take any other actions through them, other than these Strikes.
''Heightened (6th)'' As 4th level, but you can use other simple <<tag Manipulate>>actions through the plants, including having a branch pick an object up or open a door, though more complex actions, such as picking a lock or disabling a trap, remain impossible.
{{||SpellSummaryTable}}
Toxic spores swarm over creatures in the area, causing them to erupt in grotesque fungal growths.
These noxious growths deal 2d6 [[persistent|Persistent Damage]] poison damage, and each creature must attempt a [[Fortitude]] save.
''Heightened (+2)'' The persistent damage increases by 2d6, and the weakness increases by 1, or by 2 on a critical failure.
{{||SaveSuccessTable}}
Fungal creatures have the fungus trait.
They are distinct from normal fungi.
You bully foes across the battlefield.
While raging, you gain a +2 circumstance bonus to [[Athletics]] checks for <<tag Attack>> actions.
Affected actions are:
<$list filter="[tag[Attack]a-skill[Athletics]]"/>
Desperate to finish the fight, you pour all your rage into one final blow.
Make a [[Strike]].
If it hits, you gain a circumstance bonus to damage equal to the number of rounds remaining in your Rage (maximum 10).
After this Strike, your Rage immediately ends, and you are [[Fatigued]] until you rest for at least 10 minutes.
You’ve learned to maintain your balance even when swinging furiously.
When you make a [[Power Attack]] with a melee weapon you’re wielding in two hands, it counts as one attack toward your multiple attack penalty instead of two.
''Requirements'' Your last action was a successful [[Strike]], and either you have a hand free or your Strike used a grapple weapon.
You grab your foe while it’s distracted by your attack.
The foe you hit becomes [[Grabbed]], as if you had succeeded at an [[Athletics]] check to [[Grapple]] the foe.
You rush forward.
[[Stride]] up to five times your Speed in a straight line.
You can increase the number of actions this activity takes to 3 to Stride up to eight times your Speed in a straight line instead.
''Trigger'' An enemy within your melee reach critically hits you with a melee [[Strike]].
Your enemy’s blow fuels your rage and provokes your immediate retaliation.
Make a melee [[Strike]] against the triggering enemy.
Your rage comes from a deep and purely personal well within you.
You use your rage as you choose.
You don’t have an anathema or an instinct ability. Instead, you gain an additional 1st-level barbarian feat. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
''Specialization Ability'': Increase the additional damage from Rage from 2 to 6. If you have [[Greater Weapon Specialization]], instead increase the additional damage from Rage to 12. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
''Raging Resistance'': You resist physical weapon damage, but not physical
damage from other sources (such as unarmed attacks). //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
''Prerequisites'' at least two stances.
You have combined two stances into a single stance all your own.
When you take this feat, choose two stances you know and combine them into a single fused stance. Give your new fused stance a unique name.
When you enter your fused stance, you gain all the effects of both stances, including the requirements and restrictions.
You can’t fuse stances with fundamentally incompatible requirements or restrictions (such as [[Ironblood Stance]] and [[Crane Stance]], which both require using only one type of Strike).
The horse [[Stride]]s twice at a +10-foot circumstance bonus to Speed.
Affix to a weapon.
''Requirements'' You're an master in [[Intimidation]].
''Trigger'' You attack an adjacent creature and haven't rolled your attack roll.
This grisly molar hangs from a cord threaded through a tiny hole just above its dried, exposed root.
When you activate this talisman, the creature you’re attacking becomes [[Flat-Footed]] until the end of the current turn.
You and your allies harry an opponent in concert.
Any enemy is [[Flat-Footed]] against your melee attacks due to [[Flanking]] as long as the enemy is within both your reach and your ally’s.
Your allies must still flank an enemy for it to be flat-footed to them.
Your blood is touched by primal chaos.
You gain the <<tag Ganzi>> trait in addition to the traits from your ancestry.
You gain resistance to a single damage type equal to half your level; at the beginning of each day, determine randomly whether this resistance applies to acid, electricity, or sonic damage.
You also gain a +1 circumstance bonus to saving throws against effects that would cause you to gain the [[Controlled]] condition.
You can choose from <<tag Ganzi>> feats and feats from your ancestry whenever you gain an ancestry feat.
{{||VHerFeatList}}
You have unusual sensory abilities passed down from your chaotic forebears.
You gain [[Low-Light Vision]]. If you already have [[Low-Light Vision]], you gain [[Darkvision]] instead.
''Special'' You can select this feat a second time to gain darkvision in addition to low-light vision.
''Frequency'' once per day
''Trigger'' A creature you are aware of damages you with a melee Strike.
Your wound yawns open, appalling your attacker.
The attacker must succeed at a [[Fortitude]] saving throw against your class DC or spell DC, whichever is higher, or become [[Sickened]] 1 ([[Sickened]] 2 on a critical failure).
It can’t recover from the sickened condition while it’s adjacent to you.
You can guide your crop to move without notice.
When you and any of your crop are [[Avoiding Notice|Avoid Notice]], you can choose one member of your crop to temporarily gain the benefits of the [[Quiet Allies]] skill feat until the group is no longer Avoiding Notice.
The group rolls two checks instead of one, using the higher die roll. This is a fortune effect.
You are descended from the wondrous garudas, and their keen senses manifest in your magical prowess.
You can cast [[Blur]] and [[See Invisibility]] each once per day as 2nd-level divine innate spells.
Garudas’ marksmanship and magic are second nature to you.
Whenever you critically hit using a bow, you apply the weapon’s critical specialization effect.
//The Ancestry Guide lists this as a Lineage feat, but this contradicts the rules for Lineage feats.//
{{||SpellSummaryTable}}
The target transforms into a vaporous state.
In this state, the target is amorphous and loses any item bonus to [[AC]].
It gains resistance 8 to physical damage and is immune to precision damage.
It can’t cast spells, activate items, or use actions that have the <<tag Attack>>or <<tag Manipulate>>trait.
It gains a fly Speed of 10 feet and can slip through tiny cracks.
The target can [[Dismiss]] the spell.
{{||SpellSummaryTable}}
You tear open a rift to another plane, creating a portal that creatures can travel through in either direction.
This portal is vertical and circular, with a radius of 40 feet.
The portal appears at a location of your choice on the destination plane, assuming you have a clear idea of both the destination’s location on the plane and what the destination looks like.
If you attempt to create a gate into or out of the realm of a deity or another powerful being, that being can prevent the gate from forming.
You canvass local markets, taverns, and gathering places in an attempt to learn about a specific individual or topic.
The GM determines the DC of the //[[Diplomacy]]// check and the amount of time it takes (typically 2 hours, but sometimes more), along with any benefit you might be able to gain by spending coin on bribes, drinks, or gifts.
{{||ActionSuccessTable}}
{{LOCGFeat}}
''Prerequisites'' Ability to cast focus spells.
You can channel your mask’s power to pierce through lies and see the truth in any situation.
Increase the number of Focus Points in your focus pool by 1.
While wearing your mask, you can cast the [[Glimpse the Truth]] cleric domain spell as a divine focus spell.
{{||RitualSummaryTable}}
You enforce a magic rule on a willing target, forcing it to either perform or refrain from carrying out a certain act.
A geas to perform an act is usually conditional, such as, “Always offer hospitality to strangers seeking a place to stay.” An unconditional geas to perform a certain act doesn’t require the target to perform that act exclusively, though it must prioritize the task above all leisurely pursuits.
The most common geas to refrain from carrying out an act is a specification to avoid violating a contract. In those cases, the secondary caster usually takes charge of making sure the wording of the contract is attuned correctly with the ritual’s magic.
If the target is unable to fulfill the geas, it becomes [[Sickened]] 1, and the sickened condition increases by 1 for each consecutive day it is prevented from following the geas, to a maximum of [[Sickened]] 4. The sickened condition ends immediately when it follows the geas again; it can’t remove the sickened condition in any other way. //Note that since this prevents them from ingesting anything, they may suffer from [[Thirst]] and [[Starvation]].//
//At level 3 this spell can be used only on a [[Willing]] target.// Because the target is willing, geas can have a duration that lasts for as long as the target agrees to. Only powerful magic such as a [[Wish]] spell can remove the effects of geas from a willing target.
''Heightened (5th)'' You can use geas on an unwilling creature; it can attempt a [[Will]] save to negate the effect. If the target fails this Will save, the geas lasts up to 1 week. A [[Remove Curse]] spell can [[Counteract]] a geas on an unwilling creature, in addition to powerful magic such as a [[Wish]] spell. A clever unwilling creature can subvert the geas by contriving situations that prevent it from complying, but in that case it becomes [[Sickened]] (as described above).
''Heightened (7th)'' As 5th level, but the geas lasts for up to 1 year on an unwilling creature.
''Heightened (9th)'' As 5th level, but the geas lasts for a duration you choose (even unlimited) on an unwilling creature.
{{||ActionSuccessTable}}
You stick to walls with a preternatural grip.
You gain a climb Speed of 15 feet.
The earth inside you asserts itself as crystallized gemstones or metals, like a cluster of quartz or veins of iron and gold. This shimmering presence inside your being inspires you to flashy and flamboyant performances.
You gain the trained proficiency rank in [[Performance]]. If you would automatically become trained in Performance (from your background or class, for example), you instead become trained in a skill of your choice.
You gain the [[Impressive Performance]] skill feat.
General feats can be taken by any class and don't relate to skills.
You can always take a [[Skill]] feat when you can take a general feat.
<ul>
<$list filter="[tag[General]!tag[Skill]]">
<li><$link/></li>
</$list>
</ul>
Your adaptability manifests in your mastery of a range of useful abilities.
You gain a 1st-level general feat.
You must meet the feat’s prerequisites, but if you select this feat during character creation, you can select the feat later in the process in order to determine which prerequisites you meet.
''Special'' You can select this feat multiple times, choosing a different feat each time.
The diverse families of genies hold positions of prominence on the Elemental Planes.
They have powerful magical abilities.
{{||BloodlineSummary}}
The level 2, 5, and 8 granted spells are determined by the type of genie you choose:
* ''Janni'': [[Create Food]], [[Banishment]], [[Scintillating Pattern]].
* ''Djinni''': [[Invisibility]], [[Illusory Scene]], [[Punishing Winds]].
* ''Efreeti'': [[Enlarge]], [[Elemental Form]] (Fire), [[Maze]].
* ''Marid'': [[Water Walk]], [[Control Water]], [[Horrid Wilting]].
* ''Shaitan'': [[Glitterdust]], [[Wall of Stone]], [[Earthquake]].
Whenever you gain a class feature that grants you expert or greater proficiency in certain weapons, you also gain that proficiency in falchions, ranseurs, scimitars, tridents, and all geniekin weapons in which you are trained.
You’ve trained with weapons used by your genie ancestors.
You are trained with [[Falchion]]s, [[Ranseur]]s, [[Scimitar]]s, and [[Trident]]s.
In addition, you gain access to all uncommon geniekin weapons.
For the purpose of determining your proficiency, martial geniekin weapons are simple weapons and advanced geniekin weapons are martial weapons.
Whenever you critically hit using a falchion, ranseur, scimitar, trident, or a geniekin weapon, you apply the weapon’s [[Critical Specialization Effect]].
{{||SpellSummaryTable}}
''Trigger'' A creature within range is attacked.
With a flourish, you fulfill a creature’s wish for protection, bending reality to keep them from harm.
The target vanishes in a burst of brightly colored smoke and sparkles, reappearing an instant later. They become [[Concealed]] against the triggering attack and until the end of the current creature’s turn.
Specialized tweaks to your formula that supplements your genius considerably broaden the benefits you gain from cognitive mutagens.
When you’re affected by a [[Cognitive Mutagen]], you also gain the mutagen’s item bonus to [[Deception]], [[Diplomacy]], [[Intimidation]], [[Medicine]], [[Nature]], [[Performance]], [[Religion]], and [[Survival]] checks.
In addition, you can communicate telepathically with creatures within 60 feet with whom you share a language. The communication is twoway once you establish it, so a creature you contact can also communicate with you.
{{||SpellSummaryTable}}
The targeted corpse doesn’t decay, nor can it be transformed into an undead.
If the corpse is subject to a spell that requires the corpse to have died within a certain amount of time (for example, [[Raise Dead]]), do not count the duration of gentle repose against that time.
This spell also prevents ordinary bugs and pests (such as maggots) from consuming the body.
''Heightened (5th)'' The spell’s duration is unlimited, but the spell takes one more action to cast and requires a material component and a cost (embalming fluid worth 6 gp).
Lost souls that haunt the world as incorporeal undead are called ghosts.
Any ammunition.
Ghost ammunition is cool to the touch.
This ammunition has the benefits of the [[Ghost Touch]] property rune and can fly through any obstacle except those that can block incorporeal creatures or effects.
Though the ammunition penetrates barriers and ignores all cover, the target still benefits from the flat check from being concealed or hidden.
You still can’t target an undetected creature without guessing.
After it is launched, the ammunition vanishes into mist.
However, in the dead of the night 1d4 days later, it reappears in the last quiver or other container it was taken from.
These spring-loaded metal canisters contain a mixture of chemicals and salts that drain and disintegrate nearby undead creatures.
A ghost charge deals the listed positive damage and splash damage, though as usual for positive damage, this damage harms only undead and creatures with negative healing.
Ghost charges are designed to explode even on contact with a spiritual substance, making them ideal for damaging incorporeal undead.
A primary target that takes damage from a ghost charge becomes [[Enfeebled]] until the start of your next turn.
Many types grant an item bonus to attack rolls.
| !Type | !Level | !Price | !Positive Damage | !Positive Splash Damage | !Enfeebled Level | !Item bonus to attack |
| Lesser | 1 | 30 | 1d8 | 1 | 1 | None |
| Moderate | 3 | 100 | 2d8 | 2 | 1 | +1 |
| Greater | 11 | 2500 | 3d8 | 3 | 2 | +2 |
| Major | 17 | 25000 | 4d8 | 4 | 2 | None |
//The book lists no attack bonus for Major Ghost Charge. This may be an error.//
Affix to armor.
''Requirements'' You are legendary in [[Stealth]].
''Trigger'' You use an action with the <<tag Move>> trait.
This small vial is filled with a grayish-green dust rendered from dried ectoplasm.
When you activate the dust, it casts a 4th-level [{Invisibility]] spell on you.
This comes into effect before you move during the triggering action.
Your connection to the Boneyard ensures that your blows strike true against spectral beings.
Your weapon and unarmed attack [[Strike]]s against <<tag Incorporeal>> creatures become <<tag Magical>>.
If they are already magical, they instead gain the effects of a [[Ghost Touch]] property rune.
{{||SpellSummaryTable}}
You create an auditory illusion of simple sounds that has a maximum volume equal to four normal humans shouting.
The sounds emanate from a square you designate within range.
You can’t create intelligible words or other intricate sounds (such as music).
''Heightened (3rd)'' The range increases to 60 feet.
''Heightened (5th)'' The range increases to 120 feet.
''Usage'' etched onto a melee weapon.
The weapon can harm creatures without physical form.
A ghost touch weapon is particularly effective against <<tag Incorporeal>> creatures, which almost always have a specific vulnerability to ghost touch weapons.
Incorporeal creatures can touch, hold, and wield ghost touch weapons (unlike most physical objects).
{{||SpellSummaryTable}}
This spell compels local spirits to reenact a violent event of the recent past that you’re aware of and name as you Cast the Spell.
You take the role of the primary victim.
The reenactment plays out the final 9 minutes leading up to the death or injury of the victim and the minute after their death or injury.
The spirits don’t change form, so this doesn’t help determine perpetrators by their look.
Spiritual forms of missing creatures necessary for the event manifest as needed, and missing items appear as shadowy outlines.
Once the scene ends, you take 2d6 <<tag Negative>> damage for each ghostly apparition that participated in the scene (typically equal to the number of creatures involved other than the victim).
Any creature that observed the ghostly recreation, including you, can attempt checks to investigate the event to discover new clues and information.
{{||SpellSummaryTable}}
Glowing letters assemble in the air, providing a transcription of the target’s speech in all languages you speak.
For the spell’s duration, any words spoken aloud by the target are spelled out in letters in front of them.
When you Cast the Spell, you can choose whether these letters are visible to all creatures or only certain creatures you specify.
Any words the target mouths silently are similarly spelled out, allowing the target to communicate silently or in areas where sound doesn’t carry. This even allows the target to provide verbal casting components in such areas, but only if you choose to make the letters visible to all creatures.
Furthermore, any of the target’s <<tag Auditory>> abilities can affect creatures even in areas where sound does not carry as long as you have made the glyphs visible to them and they have line of sight to the target; in this case, they gain the <<tag Visual>> trait.
You can [[Dismiss]] the spell.
{{||SpellSummaryTable}}
The target weapon becomes translucent and ghostly, and it can affect material and incorporeal creatures and objects.
It can be wielded by a corporeal or incorporeal creature and gains the effects of the [[Ghost Touch]] property rune.
''Level 3''
''Stage 1'' carrier with no ill effects (1 day);
''Stage 2'' 3d8 negative damage and the creature regains half as many Hit Points from all healing (1 day);
''Stage 3'' as stage 2 (1 day);
''Stage 4'' 3d8 negative damage and the creature gains no benefit from healing (1 day);
''Stage 5'' as stage 4 (1 day);
''Stage 6'' the creature dies and rises as a ghoul at the next midnight.
//The [[Fortitude]] DC is determined by the spell that inflicted this disease.//
Stitched together from pieces of ghoul skin, this suit of [[+1|Armor Potency]] hide armor grants you a +1 item bonus to saving throws against disease and paralysis and makes you immune to the paralysis of ghouls.
Ghoul hide with a [[Resilient]] rune increases the resilient rune’s item bonus to saving throws against disease and paralysis by 1 (maximum +4).
Ghoul hide hisses with sibilant hatred at the touch of elves. When worn by a creature with the <<tag Elf>> trait, the armor gains the [[Noisy]] trait.
{{||SpellSummaryTable}}
You touch the target to afflict it with ghoul fever, infesting it with hunger and a steadily decreasing connection to positive energy; the target must attempt a [[Fortitude]] save.
{{||SaveSuccessTable}}
{{Ghoul Fever}}
A mix of digestive juices and green dragon poison glands nauseates the victim as its flesh is digested from within.
| !Saving Throw |DC 17 [[Fortitude]] |
| !Onset |Immediate |
| !Maximum Duration |6 rounds |
| !Stage 1 |1d6 poison damage (1 round) |
| !Stage 2 |1d8 poison damage and [[Flat-Footed]] (1 round) |
| !Stage 3 |1d12 poison damage, [[Clumsy]] 1 and [[Flat-Footed]] (1 round) |
Your rage gives you the raw power and size of a giant. This doesn’t necessarily mean you revere giants—you might scoff at them or even aspire to slay them! You could instead seem like a giant to other people due to your exceptional strength or larger-than-life emotions and ego.
''Anathema'' Failing to face a personal challenge of strength is anathema.
''Titan Mauler (Instinct Ability)'': You can use a weapon built for a Large creature if you are Small or Medium (both normally and when raging). If you’re not Small or Medium, you can use a weapon built for a creature one size larger than you. You gain access to __this larger weapon__, of any weapon type otherwise available at character creation. It has the normal Price and Bulk for a weapon of its size. When wielding such a weapon in combat, increase your additional damage from Rage from 2 to 6, but you have the [[Clumsy]] 1 condition because of the weapon’s unwieldy size. You can’t remove this clumsy condition or ignore its penalties by any means while wielding the weapon. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
''Specialization Ability'' Increase the damage from Rage when using a larger weapon from 6 to 10; if you have greater weapon specialization, increase it from 10 to 18. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
''Raging Resistance'' You resist bludgeoning damage and your choice of <<tag Cold>>, <<tag Electricity>>, or <<tag Fire>>, chosen when you gain raging resistance. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
Scorpion venom is excruciating and its effects are somewhat debilitating.
| !Saving Throw |DC 22 [[Fortitude]] |
| !Onset |Immediate |
| !Maximum Duration |6 rounds |
| !Stage 1 |1d10 poison damage and [[Enfeebled]] 1 (1 round) |
| !Stage 2 |2d10 poison damage and [[Enfeebled]] 1 (1 round) |
| !Stage 3 |2d10 poison damage and [[Enfeebled]] 2 (1 round) |
You can create bigger snares for quick deployment, making it more likely for a creature to walk into your snares.
When you prepare snares for quick deployment, you can prepare some of them as giant snares.
A giant snare takes up a 10-foot-by-10-foot area but costs two of your quick deployment snares.
A giant snare can trigger from a creature entering any portion of its area, and all its effects apply over the full area.
Giant wasp venom interferes with a victim’s movement.
| !Saving Throw |DC 25 [[Fortitude]] |
| !Onset |Immediate |
| !Maximum Duration |6 rounds |
| !Stage 1 |2d6 poison damage and [[Clumsy]] 1 (1 round) |
| !Stage 2 |3d6 poison damage and [[Clumsy]] 2 (1 round) |
| !Stage 3 |4d6 poison damage and [[Clumsy]] 2 (1 round) |
''Prerequisites'' [[Giant Instinct]].
You extend your body and prepare to attack foes outside your normal reach.
Until your rage ends, all your melee weapons and unarmed attacks gain [[Reach]] 10.
This doesn’t increase the reach of any weapon or unarmed attack that already has the reach trait, but it does combine with abilities that increase your reach due to increased size, such as [[Giant’s Stature]].
''Prerequisites'' [[Giant Instinct]].
''Requirements'' You are Medium or smaller.
You grow to incredible size.
You become <<tag Large>>, increasing your reach by 5 feet and gaining the [[Clumsy]] 1 condition until you stop raging.
Your equipment grows with you.
You can share your power with others, but they can’t escape the werecreature’s curse as easily as you can.
You can cast a 5th-level [[Moon Frenzy]] as a primal innate spell once per day.
At 15th level, you cast a 6th-level moon frenzy instead.
At 17th level, your 6th-level moon frenzy grants its standard effects, except the temporary Hit Points increase to 15 and the silver weakness increases to 15.
At 20th level, you cast a 10th-level moon frenzy instead.
The spell uses your class DC or spell DC, whichever is higher.
{{||SpellSummaryTable}}
Ice and bone-deep cold assail the target, freezing it from the inside out.
The frosty assault deals 10d6 cold damage, subject to the target’s [[Fortitude]] save.
After the effects are resolved, the target is temporarily immune for 1 day.
''Heightened (+1)'' Increase the cold damage by 2d6.
{{||SaveSuccessTable}}
''Prerequisites'' Expert in [[Diplomacy]].
First impressions are your strong suit.
When you meet someone in a casual or social situation, you can immediately attempt a [[Diplomacy]] check to [[Make an Impression]] on that creature rather than needing to converse for 1 minute.
You take a –5 penalty to the check.
If you fail or critically fail, you can engage in 1 minute of conversation and attempt a new check at the end of that time rather than accepting the failure or critical failure result.
You know how to turn combat into a form of entertainment.
You become trained in Gladiatorial [[Lore]]; if already trained in Gladiatorial Lore, you instead become trained in another Lore skill of your choice.
If there are sapient creatures observing a combat encounter, and these onlookers are neither engaged in the combat themselves nor allied or affiliated with either side, the combatants have spectators. The GM is the final arbiter.
At the start of a combat encounter, if you have spectators, you gain a number of temporary HP equal to your character level for 1 minute and you can roll [[Performance]] for your initiative.
<<archetypefeatlist "4 6 8" "Gladiator">>
''Usage'' etched onto armor.
This armor can be disguised with a mere thought.
Activate {{OneAction}} envision; ''Effect'' You change the shape and appearance of this armor to appear as ordinary or fine clothes of your imagining. The armor’s statistics do not change. Only a creature that is benefiting from [[True Seeing]] or a similar effect can attempt to disbelieve this illusion, with a DC of 25.
You are adept at quickly scanning loose papers and carefully discerning the contents of sealed letters without damaging the seal.
You can attempt [[Society]] checks to [[Decipher Writing]] on a message that is only partially glimpsed, upside down or reversed from your perspective, or even sealed.
However, on a critical failure, the recipient is made aware of your efforts (for instance, you damage the seal or disturb the papers in some way).
When using this feat to decipher sealed letters, your attempt to Decipher Writing gains the <<tag Manipulate>> trait.
This feat doesn’t prevent witnesses from noticing your efforts, particularly with sealed letters which you must manipulate directly in order to read; you might need to attempt [[Deception]] or [[Stealth]] checks to avoid being noticed.
You tap into the collected lore of the divine, accessing a variety of potentially useful information.
Attempt a [[Religion]] check to understand the information you gain. The GM sets the DC (similar to the DC to [[Recall Knowledge]]), potentially adjusting the DC of the check for topics far removed from your mystery.
{{||ActionSuccessTable}}
Your [[Silvertongue Mutagen]] transcends languages and plausibility.
When affected by a silvertongue mutagen you have created, you ignore circumstance penalties to [[Deception]], [[Diplomacy]], [[Intimidation]], and [[Performance]] checks.
In addition, your words transcend linguistic barriers; everyone listening to you speak hears your words as if you were speaking in their own language (though you do not actually speak that language, nor does this ability allow you to understand any additional languages).
{{||SpellSummaryTable}}
Falsehoods pass your lips as smoothly as silk.
You gain a +4 status bonus to [[Deception]] checks to [[Lie]] and against Perception checks to discern if you are telling the truth, and you add your level even if you’re untrained.
If the implausibility of your lies prompts a circumstance penalty or a DC increase, reduce that penalty or increase by half.
''Trigger'' An enemy damages your ally, and both are within 15 feet of you.
Your foe hesitates under the weight of sin as visions of redemption play in their mind’s eye.
The foe must choose one of the following options:
* The ally is unharmed by the triggering damage.
* The ally gains resistance to all damage against the triggering damage equal to 2 + your level.
After the damaging effect is applied, the enemy becomes [[Enfeebled]] 2 until the end of its next turn.
If you have the Divine Smite ability, a foe that responds to your Glimpse of Redemption by dealing damage takes persistent good damage equal to your Charisma modifier.
If you have the Exalt ability, you can apply the resistance granted by Glimpse of Redemption to yourself and all allies within 15 feet of you, including the triggering ally, except the resistance is reduced by 2 for all.
//This ability does not have any alignment or Mental tags, so as written, a construct, an animal and another champion of good can all be affected by glimpses of redemption.//
{{||SpellSummaryTable}}
Divine insight lets you see things as they truly are.
The GM attempts a <<tag Secret>> [[Counteract]] check against each <<tag Illusion>>that is at least partially within the area.
Instead of counteracting the illusion, you see through it (for instance, if the check succeeds against an [[Illusory Disguise]] spell, you see the creature’s true form but illusory disguise doesn’t end).
The area moves with you for the duration of the spell, and the GM attempts a secret counteract check each time a new illusion is within the area.
''Heightened (7th)'' You can allow everyone to see through illusions you succeed against, not just yourself.
{{||SpellSummaryTable}}
Creatures in the area are outlined by glittering dust.
Each creature must attempt a Reflex save.
If a creature has its invisibility negated by this spell, it is [[Concealed]] instead of [[Invisible]].
This applies both if the creature was already invisible and if it benefits from new invisibility effects before the end of the invisibility negation effect from this spell.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You create an immobile globe around yourself that attempts to [[Counteract]] any spell from outside the globe whose area or targets enter into the globe, as if the globe were a [[Dispel Magic]] spell 1 level lower than its actual spell level.
If the counteract attempt succeeds, it prevents only the portion of the spell that would have entered the globe (so if the spell also has targets outside the globe, or part of its area is beyond the globe, those targets or that area is affected normally).
You must form the sphere in an unbroken open space, so its edges don’t pass through any creatures or objects, or the spell is lost (though creatures can enter the globe after the spell is cast).
As black as coal, this blade grows more potent in darkness.
While in bright light, it functions as a [[+1|Weapon Potency]] shortsword and doesn’t appear to radiate a magic aura to [[Detect Magic]] or similar spells unless the spells are 4th level or higher.
In [[Dim Light]] or darkness, the gloom blade becomes a [[+2|Weapon Potency]] [[Striking]] shortsword.
Whenever you use the gloom blade to attack a creature you’re [[Undetected]] by, you deal 1d6 additional precision damage.
To upgrade the gloom blade’s fundamental runes, start with the base +1 shortsword, but if you improve it beyond a +2 striking shortsword, the runes apply in [[Dim Light]] or darkness as well.
{{LOCGFeat}}
You gain [[Low-Light Vision]].
''Frequency'' once per day
You are descended from the einherji, the worthy warriors of chaos.
You call upon your ascendant blood with a mighty cry that fills you with a revitalizing energy for 1 minute or until you critically fail a [[Strike]], whichever comes first.
For the duration, the first time each round you successfully Strike a creature of your level or higher, you regain Hit Points equal to half your level.
{{||SpellSummaryTable}}
Your mouth transforms into a shadowy maw bristling with pointed teeth.
These jaws are an [[Unarmed]] attack with the [[Forceful]] trait dealing 1d8 piercing damage.
If you hit with your jaws and deal damage, you gain 1d6 temporary Hit Points.
''Heightened (+2)'' The temporary Hit Points increase by 1d6.
{{||SpellSummaryTable}}
You craft a trap by binding a hostile spell into a symbol.
While Casting this Spell, you also [[Cast a Spell]] of a lower spell level to store in the glyph.
The stored spell must take 3 actions or fewer to cast, have a hostile effect, and target one creature or have an area.
You can set a password, a trigger, or both for the glyph.
Any creature that moves, opens, or touches the target container or enters the target area that doesn’t speak the password or that matches the trigger activates the glyph, releasing the harmful spell within.
Once a spell is stored in the glyph, the glyph gains all the traits of that spell.
If the stored spell targets one or more creatures, it targets the creature that set off the glyph.
If it has an area, that area is centered on the creature that set off the glyph.
Glyph of warding’s duration ends when the glyph is triggered.
The glyph counts as a magical trap, using your spell DC for both the Perception check to notice it and the Thievery check to disable it; both checks require the creature attempting them to be trained in order to succeed.
You can [[Dismiss]] glyph of warding.
The maximum number of glyphs of warding you can have active at a time is equal to your spellcasting ability modifier.
With enough time and determination, you can chew through nearly anything.
You deal double your jaws damage to an unattended, inanimate object.
You might have a flighty nature, but when a topic captures your attention, you dive into it headfirst.
Pick a [[Lore]] skill. You gain the trained proficiency rank in that skill. At 2nd level, you gain expert proficiency in the chosen Lore as well as the Lore granted by your background, if any. At 7th level you gain master proficiency in these Lore skills, and at 15th level you gain legendary proficiency in them.
Your extensive travels, curiosity, and love of learning help you to learn languages quickly.
You learn three new languages, chosen from common languages and uncommon languages you have access to. These languages take the same form (signed or spoken) as your other languages.
When you select the [[Multilingual]] feat, you learn three new languages instead of two.
Your gnome affinity blends with your class training, granting you great skill with gnome weapons.
Whenever you gain a class feature that grants you expert or greater proficiency in a given weapon or weapons, you also gain that proficiency in the glaive, kukri, and all gnome weapons in which you are trained.
You favor unusual weapons tied to your people, such as blades with curved and peculiar shapes. You are trained with the [[Glaive]] and [[Kukri]].
In addition, you gain access to __kukris and__ all uncommon gnome weapons. For the purpose of determining your proficiency, martial gnome weapons are simple weapons and advanced gnome weapons are martial weapons.
You produce outstanding results when wielding unusual weapons.
Whenever you critically hit using a glaive, kukri, or gnome weapon, you apply the weapon’s [[Critical Specialization Effect]].
//"Goblin Lore" is a 1st level Ancestry feat for goblins. If you're just looking for the Lore skill regarding Goblins, look at [[Lore]].//
You’ve picked up skills and tales from your goblin community.
You gain the trained proficiency rank in [[Nature]] and [[Stealth]].
If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Goblin [[Lore]].
{{||SpellSummaryTable}}
Your touch afflicts the target with goblin pox, an irritating allergenic rash. The target must attempt a [[Fortitude]] save.
{{||SaveSuccessTable}}
Goblin Pox (disease); Level 1. Goblins and goblin dogs are immune.
''Stage 1'' sickened 1 (1 round).
''Stage 2'' sickened 1 and slowed 1 (1 round).
''Stage 3'' sickened 1 and the creature can’t reduce its sickened value below 1 (1 day).
''Trigger'' An ally ends a move action adjacent to you.
You take advantage of your ally’s movement to adjust your position. You [[Step]].
You sing annoying goblin songs, distracting your foes with silly and repetitive lyrics.
Attempt a [[Performance]] check against the [[Will]] DC of a single enemy within 30 feet. This has all the usual traits and restrictions of a [[Performance]] check.
You can affect up to two targets within range if you have expert proficiency in Performance, four if you have master proficiency, and eight if you have legendary proficiency.
Your goblin affinity blends with your class training, granting you great skill with goblin weapons.
Whenever you gain a class feature that grants you expert or greater proficiency in a given weapon or weapons, you also gain that proficiency in the dogslicer, horsechopper, and all goblin weapons in which you are trained.
Others might look upon them with disdain, but you know that the weapons of your people are as effective as they are sharp. You are trained with the [[Dogslicer]] and [[Horsechopper]].
In addition, you gain access to all uncommon goblin weapons. For the purpose of determining your proficiency, martial goblin weapons are simple weapons and advanced goblin weapons are martial weapons.
You know how to wield your people’s vicious weapons. Whenever you score a critical hit using a goblin weapon, you apply the weapon’s [[Critical Specialization Effect]].
''Prerequisites'' Can't have a patron deity.
You recover an additional 5 Hit Points from a successful attempt to [[Treat your Wounds|Treat Wounds]] or use [[Battle Medicine]] on you.
After you or an ally use Battle Medicine on you, you become temporarily immune to that Battle Medicine for only 1 hour, instead of 1 day.
You perfect your body, refining the flex of every muscle and the bend of every joint to maximum efficiency.
Your unarmed [[Strike]]s gain the [[Deadly]] d12 trait, and you have [[Fast Healing]] 20, causing you to regain 20 HP at the start of each of your turns provided you have at least 1 HP.
''Prerequisites'' expert in Arcana and Crafting, or an ally with expert proficiency in those skills willing to augment you
Your flesh has been specially treated with the same arcane and alchemical processes used to toughen the skin of flesh golems.
Increase your maximum Hit Points by an amount equal to your level.
You gain resistance to physical damage (except adamantine) equal to your number of class feats from the golem grafter archetype.
<<archetypefeatlist "10 12 14" "[[Golem Grafter]]">>
{{||SpellSummaryTable}}
You imbue the target berry with the bounty of nature, __turning it into a goodberry that can heal and sustain far beyond its normal capacity.__
A living __can eat__ the __goodberry__ with an [[Interact]] action to regain __1d6+4__ Hit Points.
__A berry not consumed during the duration__ withers away.
__Every six goodberries consumed gives as much nourishment as one square meal for a typical human.__
Heightened (+1) You can target an additional berry. __A creature can consume any number of goodberries from the same casting with a single Interact action.__
''Requirements'' You are in [[Gorilla Stance]].
You pound your chest before slamming into your foes.
Attempt an [[Intimidation]] check to [[Demoralize]], then make one gorilla slam [[Strike]] against the same target.
If your Strike hits, you gain a circumstance bonus to the damage roll equal to triple the value of the target’s frightened condition.
''Special'' If you have this feat, while you are in Gorilla Stance, you gain a climb Speed of 15 feet.
You lower yourself to the ground and take an imposing, knuckle‑walking stance.
While in this stance, the only Strikes you can make are gorilla slam unarmed attacks. These deal 1d8 bludgeoning damage; are in the brawling group; and have the [[Backswing]], [[Forceful]], [[Grapple]], [[Nonlethal]], and [[Unarmed]] traits.
While you are in Gorilla Stance, you gain a +2 circumstance bonus to Athletics checks to Climb, and if you roll a success on an Athletics check to Climb, you get a critical success instead.
Your time gossiping in fashionable salons keeps you informed on every topic.
You are trained in Gossip [[Lore]], a special Lore skill that can be used only to [[Recall Knowledge]], but on any topic.
If you fail a check to Recall Knowledge with Gossip Lore, you get the effects of the [[Dubious Knowledge]] skill feat.
If you have legendary proficiency in [[Society]], you gain expert proficiency in Gossip Lore, but you can’t increase your proficiency rank in Gossip Lore by any other means.
You can store a collection of up to 1 Bulk of objects within your head. The DC of checks to [[Steal]] objects from inside your head increases by 4. Additionally, if you store only one object within your head, you can draw it effortlessly into your hand as part of another action to use the object. Drawing the item grants this other action the <<tag Manipulate>> trait.
''Requirements'' The monster’s last action was a success with a [[Strike]] that lists Grab in its damage entry, or it has a creature grabbed using this action.
The monster automatically grabs the target until the end of the monster’s next turn. The creature is [[Grabbed]] by whichever body part the monster attacked with, and that body part can’t be used to [[Strike]] creatures until the grab is ended.
Using Grab extends the duration of the monster’s Grab until the end of its next turn for all creatures grabbed by it. A grabbed creature can use the [[Escape]] action to get out of the grab, and the Grab ends for a grabbed creatures if the monster moves away from it.
//Grab is a monster ability. The more normal equivalent ability for PCs is [[Grapple]].//
''Trigger'' You fall from or past an edge or handhold.
''Requirements'' Your hands are not tied behind your back or otherwise restrained.
When you fall off or past an edge or other handhold, you can try to grab it, potentially stopping your fall.
You must succeed at a [[Reflex]] save, usually at the [[Climb]] DC. //If you have [[Steady Balance]], you can make an [[Acrobatics]] check instead. If you have [[Rapid Mantel]], you can make an [[Athletics]] check instead.//
If you grab the edge or handhold, you can then [[Climb]] up using [[Athletics]]. //If you have [[Rapid Mantel]], you can immediately climb onto the surface and stand.//
{{||ActionSuccessTable}}
You’re held in place by another creature, giving you the [[Flat-Footed]] and [[Immobilized]] conditions.
If you attempt a [[Manipulate]] action while grabbed, you must succeed at a DC 5 flat check or it is lost; roll the check after spending the action, but before any effects are applied.
You can demonstrate how to quickly twist out of the way of dangerous effects.
You can use the [[Aid]] reaction to grant a bonus to an ally’s [[Reflex]] save.
As usual for Aid, you need to prepare by using an action on your turn to encourage the ally.
Mass and muscle are meaningless when you leap; only grace and balance matter.
You can roll an [[Acrobatics]] check instead of an Athletics check when making a [[High Jump]] or [[Long Jump]].
Your sublime movement grants you unparalleled protection and offense.
Your proficiency rank for unarmored defense increases to legendary, and your proficiency rank for your monk class DC increases to master.
If you have ki spells, your proficiency rank for spell attack rolls and spell DCs with the tradition of magic you use for your ki spells increases to master.
You move with perpetual grace in battle, eluding and turning aside blows.
Your proficiency rank for unarmored defense increases to master.
With the right positioning, your off-hand weapon can strike like a scorpion’s stinger.
While you are in this stance, if you make your second Strike from [[Double Slice]] with an agile weapon, Double Slice counts as one attack when calculating your multiple attack penalty.
''Requirements'' You have at least one free hand. Your target cannot be more than one size larger than you //unless you have [[Titan Wrestler]] in which case it can be two or three sizes larger, based on your Athletics.//
You attempt to grab an opponent with your free hand. You can also Grapple to keep your hold on a creature you already grabbed __or restrained__.
Attempt an [[Athletics]] check against their [[Fortitude]] DC.
{{||ActionSuccessTable}}
A weapon with the Grapple trait can be used to Grapple with the [[Athletics]] skill even if you don’t have a free hand.
This uses the weapon’s reach (if different from your own) and adds the weapon’s item bonus to attack rolls as an item bonus to the Athletics check.
If you critically fail a check to Grapple using the weapon, you can drop the weapon to take the effects of a failure instead of a critical failure.
{{||SpellSummaryTable}}
Hundreds of skeletal arms erupt from the ground in the area, clawing at creatures within and attempting to hold them in place.
The skeletal arms deal 6d6 <<tag Slashing>> damage.
Each creature in the area must attempt a [[Reflex]] save.
{{||SaveSuccessTable}}
You can extend a tangle of vines or tendrils to support your arms and extend your reach.
When you wield a melee weapon that requires two hands, doesn’t have [[Reach]], and deals at least 1d6 damage, you can change between a typical two-handed grip and an extended two-handed grasp using an [[Interact]] action.
Weapons wielded in your extended grasp gain reach of 10 feet.
This grasp is less stable and powerful than a typical grip, reducing the weapon’s damage die by 1 step.
You gain resistance to negative damage equal to half your level (minimum 1). You also gain a +1 circumstance bonus to saving throws against <<tag Necromancy>> effects.
Your time spent hunting the undead allows you to sense them.
You sense undead as a [[Vague]] sense similar to a human's sense of smell, an uncomfortable sensation akin to smelling something cloying and rotting.
When in proximity to the undead, you eventually sense their presence, though you might not do so instantly, and you can’t pinpoint their location.
An undead using a disguise or otherwise trying to hide its presence must attempt a [[Deception]] check against your [[Perception]] DC to hide its presence from you.
If the creature succeeds at its Deception check, it is then temporarily immune to your Grave Sense for 1 day.
The opaque white sap from the graveroot shrub clouds the mind.
| !Saving Throw |DC 19 [[Fortitude]] |
| !Onset |Immediate |
| !Maximum Duration |4 rounds |
| !Stage 1 |1d10 poison damage (1 round) |
| !Stage 2 |1d12 poison damage and [[Stupefied]] 1 (1 round) |
| !Stage 3 |2d6 poison damage and [[Stupefied]] 2 (1 round) |
''Prerequisites'' [[Low-Light Vision]].
You can see in the darkness as easily as a psychopomp. You gain [[Darkvision]].
''Special'' You can select this feat only at 1st level, and you can’t retrain into or out of this feat.
{{||SpellSummaryTable}}
You build up gravitational force and funnel it into your blows, leading to more powerful attacks with blade and bow alike.
On your first weapon [[Strike]] each round, you gain a status bonus to damage equal to twice the number of weapon damage dice.
{{||SpellSummaryTable}}
You create a sphere of altered gravity.
All creatures and unsecured objects in the area move towards the center, depending on their [[Reflex]] saving throws. This follows the rules for [[Forced Movement]].
If there’s not enough space near the center of the sphere, creatures and objects nearer to the center move first, and others move as far as they can without being blocked, up to the amount set by their saving throw outcomes.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You conjure grease, with effects based on choosing area or target.
* ''Area'' All solid ground in the area is covered with grease. Each creature standing on the greasy surface must succeed at a [[Reflex]] save or an [[Acrobatics]] check against your spell DC or fall [[Prone]]. Creatures using an action to move onto the greasy surface during the spell’s duration must attempt either a Reflex save or an Acrobatics check to [[Balance]]. A creature that [[Step]]s or [[Crawl]]s doesn’t have to attempt a check or save.
* ''Target'' If you cast the spell on an unattended object, anyone trying to pick up the object must succeed at an Acrobatics check or Reflex save against your spell DC to do so. If you target an attended object, the creature that has the object must attempt an Acrobatics check or Reflex save. On a failure, the holder or wielder takes a –2 circumstance penalty to all checks that involve using the object; on a critical failure, the holder or wielder releases the item. The object lands in an adjacent square of the GM’s choice. If you cast this spell on a worn object, the wearer gains a +2 circumstance bonus to [[Fortitude]] saves against attempts to grapple them.
Your bragging is particularly effective.
If you succeed at a boast, you can attempt a great boast about that same skill by using your Firebrand Braggart Dedication action ([[Boast]]) about the same action during the duration of your original boast’s circumstance bonus; this is an exception to the rule that you can’t make another boast about the same action until your next daily preparations.
A great boast uses the Firebrand Braggart Dedication action ([[Boast]]), except that if you succeed, your circumstance bonus increases to +2 and remains for 1 hour.
If you fail the great boast, you take a –2 circumstance penalty to attempt the same action for 4 hours.
Once you declare a great boast about a particular action, you can’t declare a great boast about the same action until the next time you make daily preparations, regardless of whether you succeed or fail at the check.
The minimum challenging task for a great boast is one with at least a hard DC for your level.
''Prerequisite'' [[Cleave]].
Your fury carries your weapon through multiple foes.
When you Cleave, if your Strike also kills or knocks the target unconscious, you can continue to make melee Strikes until you make a Strike that doesn’t kill or knock a creature unconscious, or until there are no creatures adjacent to the most recent creature you attacked while Cleaving, whichever comes first.
Your physique is incredibly hardy, granting you increased endurance.
Your proficiency rank for Fortitude saves increases to expert.
You take on the imposing form of a large, winged oni.
Once per day, as part of using [[Long-Nosed Form]], you also gain the benefits of 4th-level [[Enlarge]] and [[Fly]].
This lasts for 5 minutes or until you shift out of your Long-Nosed Form, whichever happens first.
Your senses advance to match those of your animal aspect.
You gain one of the following senses available to your inherent animal: echolocation (imprecise) 30 feet or [[Tremorsense]] (imprecise) 30 feet.
If your inherent animal doesn’t typically have a specific type of sense, you can’t gain the sense with this feat.
''Special'' You can select this feat multiple times, either choosing a different sense or improving an imprecise sense granted by this feat to a precise sense.
''Prerequisites'' bloodline spell
Further communion with the legacy of your bloodline has uncovered greater secrets.
You gain the greater bloodline spell associated with your bloodline.
Increase the number of Focus Points in your focus pool by 1.
The monster deals the listed amount of damage to any number of creatures [[Grabbed]] or [[Restrained]] by it.
Each of those creatures can attempt a basic [[Fortitude]] save with the listed DC.
A creature that fails this save falls [[Unconscious]], and a creature that succeeds is then temporarily immune to falling unconscious from Greater Constrict for 1 minute.
//Ordinary [[Constrict]] has the same effect but without the danger of falling unconscious.//
Your bloodline is extraordinarily complex.
You can have up to three spells from other traditions in your spell repertoire, rather than just one.
These spells must each be of a different spell level, but they don’t need to be from the same tradition.
The extent of the corruption within you does more than simply sap your foes’ strength, it devastates their minds and reflexes.
When you use Cruelty, choose whether you want to make the creature [[Enfeebled]] as normal, to make it [[Clumsy]] 1 on a failed save (clumsy 2 on a critical failure), or to make it [[Stupefied]] 1 on a failed save (stupefied 2 on a critical failure).
A creature with darkvision can see perfectly well in areas of darkness and dim light, though such vision is in black and white only.
//Greater Darkvision allows the creature to see in magical darkness that blocks normal [[Darkvision]].//
''Prerequisite'' [[Debilitating Bomb]].
You have learned enhanced techniques and alchemical secrets that allow you to expand the range of effects you can impose with your bombs.
When you use [[Debilitating Bomb]], add the following to the list you can choose from: [[Clumsy]] 1, [[Enfeebled]] 1, [[Stupefied]] 1, or –10-foot status penalty to Speeds.
Even a single missile can throw off your enemy’s balance, and more powerful attacks leave it flustered for longer.
If you hit your hunted prey with a ranged weapon, it’s [[Flat-Footed]] until the start of your next turn.
If you critically hit your prey or hit it twice on the same turn with a ranged weapon, it’s flat‑footed until the end of your next turn instead.
Your divine grace empowers you to avoid hits when you otherwise could not.
You can use [[Sacrifice Armor]] to reduce any type of damage from an attack or effect requiring a [[Reflex]] save.
When you use Sacrifice Armor against a critical hit or a critical failure on a Reflex save that would otherwise cause you to take double damage, you take the normal amount of damage instead.
You have a stalwart physiology.
Your proficiency rank for [[Fortitude]] saves increases to legendary.
When you roll a critical failure on a Fortitude save, you get a failure instead.
When you __roll a failure on__ a Fortitude save against an effect that deals damage, you halve the damage you take.
Your patron grants you greater knowledge.
Choose a greater or basic lesson from the list. You gain its associated hex, and your familiar learns the associated spell.
Increase the number of Focus Points in your focus pool by 1.
You’ve continued to expand your compendium of tools to compile knowledge.
You can cast [[Comprehend Language]], [[Mindlink]], and [[Secret Page]] as innate occult spells, each once per day.
When you cast secret page, it is automatically heightened to the same spell level as your cantrips from Magical Edification.
You broaden your magical studies, allowing you to find the right path, detect objects, and conceal those objects from unscrupulous rivals.
You can cast [[Augury]], [[Locate]], and [[Nondetection]] as occult innate spells, each once per day.
You can cast this nondetection spell only on an object, and it is automatically heightened to the same spell level as your cantrips from Magical Scholastics.
Your bloodline’s deep connection to mental essence greatly enhances your spell repertoire.
Add one spell to your spell repertoire for each spell level you can cast.
''Prerequisite'' [[Merciful Elixir]].
Your additives contain panaceas that can remedy a plethora of maladies.
When you use [[Merciful Elixir]], your elixir can instead attempt to [[Counteract]] the [[Blinded]], [[Deafened]], [[Sickened]], or [[Slowed]] condition.
Your faith enhances your ability to remove conditions.
When you use [[Mercy]], you can instead attempt to counteract the [[Blinded]], [[Deafened]], [[Sickened]], or [[Slowed]] conditions.
You hold a deep understanding of the innate fundamental structures of the physical world, and you can enforce your will upon that structure as far as your own blood is concerned.
Once per day, you can use a sorcerer spell slot to cast any common polymorph battle form spell of the spell slot’s level as if it were a signature spell in your repertoire.
If you have [[Arcane Evolution]], you can also choose from any battle form spell in your spellbook.
If you have [[Primal Evolution]], you can [[Cast a Spell]] listed in that feat using the extra spell slot the feat grants (instead of a sorcerer spell slot).
Your unbelievable training grants you mental resiliency.
Your proficiency rank for [[Will]] saves increases to legendary.
When you roll a success at a Will save, you get a critical success. When you roll a critical failure at a Will save, you get a failure instead.
When you __roll a failure on__ a Will save against a damaging effect, you take half damage.
You must have an initial revelation spell in order to take this feat.
You learn a greater revelation spell associated with your mystery.
Increase the number of Focus Points in your focus pool by 1.
{{LOWGFeat}}
You gain more powerful spell runes.
You gain a spell rune corresponding to a 4th-level arcane spell.
At 12th level, you gain a spell rune corresponding to a 5th-level arcane spell, and at 14th level, you gain a spell rune corresponding to a 6th-level arcane spell.
Your magical blood is rich with spiritual essence, and this infusion within you allows your spells to be fully effective against incorporeal creatures, spirits, and creatures on the Ethereal Plane.
Your spells have the effects of a [[Ghost Touch]] property rune.
They can target or affect a creature projecting its consciousness (such as via [[Project Image]]) or possessing another creature, even if its body is elsewhere, though you must know about the possession or projection and choose to do so.
Your spells can affect creatures on the Ethereal Plane, though this doesn’t grant you any particular ability to locate them.
Vital power surges through you like a font of energy.
Twice per day, you can [[Cast a Spell]] after you’ve run out of spell slots of the appropriate spell level; the two spells you cast with this feat must be of different spell levels.
The weapons you’ve mastered become truly fearsome in your hands.
Your damage from weapon specialization increases to 4 with weapons and unarmed attacks in which you’re an expert, 6 if you’re a master, and 8 if you’re legendary.
//If you are a [[Barbarian]], you gain a greater benefit from your instinct’s specialization ability. This does not apply if you have Barbarian Dedication.//
You can communicate with plants on a basic level and use [[Diplomacy]] to [[Make an Impression]] on them and to make very simple [[Request]]s of them.
Non-creature plants typically can’t fulfill most requests you might ask of them unless you have access to other magic such as [[Speak with Plants]].
Because of your affiliation with the leaf order, plants have a sense that you support them, so you gain a +2 circumstance bonus on your check to Make a [[Request]] of a plant using Green Empathy.
You share a special kinship with all things green and living.
You (and your leshy familiar, if you have one) are constantly under the effects of [[Speak with Plants]].
Most non-creature plants recognize you as a druid of the leaf order and are [[Friendly]] to you.
''Usage'' etched onto a weapon.
When your attack roll with this weapon is a critical hit and gains the critical specialization effect, you gain an additional benefit depending on the weapon group.
''Axe'' You can damage a third creature, with the same restrictions.
''Bow'' The Athletics check to pull the missile free is DC 20.
''Brawling'' The target takes a –4 circumstance penalty to its save.
''Club'' You can knock the target up to 15 feet away.
''Dart'' The base persistent bleed damage increases to 2d6.
''Flail'' You move the target 5 feet. You can’t move it away from you, but you can move it in another direction of your choice.
''Hammer'' You can also knock the target 5 feet away from you.
''Knife'' The target takes a –5-foot status penalty to its Speed while it has the persistent bleed damage.
''Pick'' The extra damage from the critical specialization effect increases to 4 per weapon damage die.
''Polearm'' You can move the target up to 10 feet.
''Shield'' You can knock the target up to 10 feet away.
''Sling'' The target also takes a –10-foot status penalty to its Speed for 1 round if it fails the save.
''Spear'' The [[Clumsy]] condition lasts for 2 rounds.
''Sword'' The target is [[Flat-Footed]] until the end of your next turn.
You know how to deliver focused, powerful blows that bypass your enemies’ resistances.
Make an unarmed melee [[Strike]].
This counts as two attacks when calculating your [[Multiple Attack Penalty]].
If this Strike hits, you deal two extra weapon damage dice. If you are at least 18th level, increase this to three extra weapon damage dice.
This attack also ignores an amount of resistance to physical damage, or to a specific physical damage type, equal to your level.
Your cricket legs grant you a +2 circumstance bonus on [[Athletics]] checks to [[High Jump]] or [[Long Jump]], and you gain [[Ghost Sound]] as a primal innate cantrip.
Others’ attempts to scare you often grant you insights about your would-be bullies that you can then exploit.
If you roll a success on a saving throw against a <<tag Fear>> effect, you get a critical success instead, and the source of the fear effect is [[Flat-Footed]] to you until the end of your next turn.
//(Presumably this flat-footing also happens if you roll a critical success.)//
{{||SpellSummaryTable}}
Tendrils of darkness curl out from your fingertips and race through the air.
You deal 2d4 negative damage and 1 persistent bleed damage to living creatures in the line.
Each living creature in the line must attempt a [[Fortitude]] save.
''Heightened (+1)'' The negative damage increases by 2d4, and the persistent bleed damage increases by 1.
{{||SaveSuccessTable}}
Affix to armor.
''Requirements'' You are an expert in [[Intimidation]].
''Trigger'' You attempt an [[Intimidation]] check to [[Coerce]] or [[Demoralize]], but you haven’t rolled yet.
This talisman comes in many forms, most often a severed piece of a humanoid creature displayed in some gruesome manner.
When you activate the trophy, select two targets and compare your [[Intimidation]] check result to both of their DCs.
Your lineage traces back to a daemon, one of the manifestations of horrific forms of death that devour souls within their foul home of Abaddon. As a result, you cling tenaciously to the last shreds of your own life force.
You gain the [[Diehard]] feat.
Nodules, hooks, or claws on your limbs allow you to cling to surfaces with ease.
You gain a climb Speed of 15 feet.
{{||SpellSummaryTable}}
This gruesome spell causes the target to grow excess limbs and organs, whether it be fingers multiplying until hands resemble bushes, eyes popping open in bizarre places, legs sprouting from the side of the body, or some other result.
The target takes 10d6 piercing damage (basic [[Fortitude]] save) as the new features erupt.
This spell has no effect on a target with a mutable anatomy or no limbs, such as an ooze or a protean. The growths rot rapidly and fall away after 1 round.
In addition, unless the initial target critically succeeds, creatures within 30 feet of the target, including the target, must attempt Will saves, after which they are temporarily immune to this secondary effect of grisly growths for 1 hour.
This additional effect is a <<tag Mental>> and <<tag Visual>> effect.
''Heightened (+1)'' The damage increases by 2d6.
{{||SaveSuccessTable}}
Your upbringing emphasized teamwork and helping your allies comes naturally to you.
After you [[Aid]] an ally at a skill check that doesn’t have the <<tag Attack>> trait, you can also Aid any other ally who attempts the same skill check for the same purpose that round. You do so as a free action rather than a reaction.
The preparation you did to help must still apply to the other allies, and you can Aid each ally only once. For example, if you helped lift up an ally to Aid them on an Athletics check to scale a wall, you could keep the same posture to give a boost to other allies attempting to scale the wall in the same round.
''Prerequisites'' Trained in [[Intimidation]].
When you [[Coerce]], you can compare your Intimidation check result to the [[Will]] DCs of two targets instead of one.
It’s possible to get a different degree of success for each target.
The number of targets you can Coerce in a single action increases to four if you’re an expert, 10 if you’re a master, and 25 if you’re legendary.
''Prerequisites'' Trained in [[Diplomacy]].
When you [[Make an Impression]], you can compare your Diplomacy check result to the [[Will]] DCs of two targets instead of one.
It’s possible to get a different degree of success for each target.
The number of targets increases to four if you’re an expert, 10 if you’re a master, and 25 if you’re legendary.
''Prerequisites'' Trained in [[Deception]].
With obsequious words and begging gestures, you convince your foe you’re less of a threat.
You attempt to [[Feint]] against a creature. Unlike a normal Feint, the creature can be within 30 feet instead of in your melee reach, and you make your check against its [[Will]] DC instead of its [[Perception]] DC.
''Prerequisites'' tenets of evil, champion’s reaction that grants extra damage with your Strikes.
''Requirements'' Your Strikes currently deal extra damage from your champion’s reaction.
Make a [[Strike]] against the creature that triggered your champion’s reaction.
If you hit, the target takes double the extra damage from your reaction and must succeed at a [[Fortitude]] save against your class DC or be [[Drained]] 1.
Regardless of the result, the creature is temporarily immune to your Gruesome Strike for 24 hours.
Your guard is up, even while moving.
You gain a +4 circumstance bonus to [[AC]] against reactions triggered by your movement.
''Trigger'' An ally within your melee reach is hit by an attack, you can see the attacker, and the ally gaining a +2 circumstance bonus to AC would turn the critical hit into a hit or the hit into a miss.
''Requirements'' You are wielding a single one-handed melee weapon and have your other hand or hands free.
You use your weapon to deflect the attack against your ally, granting a +2 circumstance bonus to their Armor Class against the triggering attack. This turns the triggering critical hit into a hit, or the triggering hit into a miss //(because if it wouldn't have done so you would not have met the Trigger)//.
{{||SpellSummaryTable}}
You ask for divine guidance, granting the target a +1 status bonus to one attack roll, Perception check, saving throw, or skill check the target attempts before the duration ends.
The target chooses which roll to use the bonus on before rolling.
If the target uses the bonus, the spell ends.
Either way, the target is then temporarily immune for 1 hour.
''Frequency'' once per day
''Trigger'' You are about to attempt a skill check or saving throw.
The stars grant you insights that guide your actions.
You roll twice and take the better result.
If it’s night and you can see the stars, you gain a +1 circumstance bonus to the triggering roll.
''Requirements'' You are wielding only a single one-handed melee weapon and have your other hand or hands free.
Using your weapon as a lever, you force your opponent to end up right where you want them.
Make a [[Strike]] with the required weapon.
If the Strike hits, you can move the target up to 10 feet into a space in your reach. You can move the target through your space during this movement.
Your Strike gains the following failure effect: you can force the creature to move as you would on a success, but you can move the target only 5 feet.
Your luck guides you to look the right way and aim your blows unerringly. You can use [[Halfling Luck]] twice per day: once in response to its normal trigger, and once when you fail a [[Perception]] check or attack roll instead of the normal trigger.
By shifting your weight and angling your weapon, you guide your opponent to a more favorable position.
When you use [[Dueling Riposte]] to Strike and you hit, you can move the target up to 10 feet into a space in your reach.
{{||SpellSummaryTable}}
A violent wind issues forth from your palm, blowing from the point where you are when you cast the spell to the line’s opposite end.
The wind extinguishes small non-magical fires, disperses fog and mist, blows objects of light [[Bulk]] or less around, and pushes larger objects.
Large or smaller creatures in the area must attempt a [[Fortitude]] save.
Large or smaller creatures that later move into the gust must attempt the save on entering.
{{||SaveSuccessTable}}
When you roll a success on a saving throw against an <<tag Emotion>> effect, you get a critical success instead.
You reposition, maneuver, and bewilder your foes with daring feats of physical prowess.
You are trained in [[Athletics]].
You gain panache during an encounter whenever you successfully [[Grapple]], [[Shove]], or [[Trip]] a foe.
When you came of age, your fingernails grew long and sharp.
You gain a claw unarmed attack that deals 1d4 slashing damage. Your claws are in the brawling group and have the [[Agile]], [[Finesse]], and [[Unarmed]] traits.
''Special'' Hag claws can develop at any point in a changeling’s life, allowing you to select this feat anytime you would gain an ancestry feat, but once you’ve selected it, you can’t retrain out of it.
Through your heritage, you can replicate some of a hag’s magic.
Choose one common spell of 4th level or lower from those available to a coven, including the spells contributed to a coven by a hag of your mother’s type. You can cast this spell once per day as a 4th-level occult innate spell.
Spells available to all covens are [[Augury]], [[Charm]], [[Clairaudience]], [[Clairvoyance]], [[Dream Message]], and [[Illusory Disguise]].
The eligible spells granted by the most prominent types of hag are:
| !Hag Type | !Lineage Feat | !Spells |
| Sea Hag | [[Brine May]] | [[Acid Arrow]], [[Water Walk]] |
| Green Hag | [[Callow May]] | [[Entangle]], [[Outcast's Curse]], [[Wall of Thorns]] |
| Annis Hag | [[Slag May]] | [[Earthbind]] |
| Night Hag | [[Dream May]] | [[Nightmare]] |
//No rule states that you ''must'' take a lineage feat to determine which type of hag your mother was. But if you have taken one of these feats, the decision is made by that feat.//
//The ancestry guide does not list spells associated with moon hags, winter hags, blood hags or storm hags, even though it does provide Lineage feats for them.//
You’ve nurtured the supernatural abilities gifted by your hag mother, particularly your sight.
You gain [[Darkvision]].
{{LOCGFeat}}
//You can take this Dedication feat even if you haven't yet taken two feats from [[Magaambyan Attendant Dedication]].//
You devote much of your study to halcyon magic.
You gain access to two common Halcyon cantrips and two common 1st-level halcyon spells.
In addition to being able to cast your halcyon spells via your arcane or primal spell slots, you also gain a 1st-level halcyon spell slot. You can use your halcyon spell slots to spontaneously cast your halcyon spells.
Halcyon spells are spells from the arcane or primal spell list. You don’t gain new halcyon spells via the normal means you typically use to gain spells; instead, you gain new halcyon spells and new spell levels of halcyon spells only through feats.
Halcyon spells are prepared or cast just like other spells granted by your class; for example, a wizard who gained halcyon spells would add them to their spell list and their spellbook, while a sorcerer would add them to their spell list and their spell repertoire. If you have more than one arcane or primal spellcasting class, you add halcyon spells to all such classes.
Each time you cast a halcyon spell, decide whether it is an arcane or primal spell. You can’t heighten a halcyon spell beyond your maximum spell level of halcyon spell, even if you have higher-level spell slots, and you can’t select a halcyon spell as a signature spell.
Each time you gain a level and learn new spells, and each time you gain a halcyon feat, you can swap out one of your old halcyon spells for a different halcyon spell of the same level; this is in addition to any swapping from your class, such as via a sorcerer’s spell repertoire class feature. You can also swap out halcyon spells by retraining during downtime. If you have a spellbook, when you swap out a halcyon spell, you lose the spell from your spellbook entirely.
<<archetypefeatlist "8 10 12 14 16 18 20" "[[Halcyon Speaker]]">>
''Prerequisite'' You must be master in either Arcana or Nature and expert in the other.
You refine your halcyon magic.
You gain two common 4th-level halcyon spells and two 5th-level halcyon spells.
You also gain a 4th-level halcyon spell slot and a 5th-level halcyon spell slot.
Your proficiency rank in either arcane or primal spell DCs and spell attack rolls advances from trained to expert.
Your knowledge of halcyon magic increases.
You gain two common 2nd-level halcyon spells and two 3rd-level halcyon spells.
You also gain a 2nd-level halcyon spell slot and a 3rd-level halcyon spell slot.
These and all future halcyon spell slots work like the 1st-level halcyon spell slot you gained from [[Halcyon Speaker Dedication]].
''Prerequisite'' You must be legendary in either Arcana or Nature and master in the other.
Your command over halcyon magic is nearly unmatched.
You gain two common 6th-level and 7th-level halcyon spells.
You also gain a 6th-level halcyon spell slot and a 7th-level halcyon spell slot.
Your proficiency rank in either arcane or primal spell DCs and spell attack rolls advances from expert to master.
//Although this heritage follows the versatile heritage rules, you must be a human to take it.//
You gain the <<tag Elf>> trait and [[Low‑Light Vision]].
In addition, you can select <<tag Elf>>, <<tag Half-Elf>>, and <<tag Human>> feats whenever you gain an ancestry feat.
<<levelfeatlist "1 5 9 13 17" "[tag[Feat]field:feat-anc[Elf]] [tag[Feat]field:feat-vher[Half-Elf]] [tag[Feat]field:feat-anc[Human]]">>
//Although this heritage follows the versatile heritage rules, you must be a human to take it.//
You gain the <<tag Orc>> trait and [[Low‑Light Vision]].
In addition, you can select <<tag Orc>>, <<tag Half‑Orc>>, and <<tag Human>> feats whenever you gain an ancestry feat.
<<levelfeatlist "1 5 9 13 17" "[tag[Feat]field:feat-anc[Orc]] [tag[Feat]field:feat-vher[Half-Orc]]">>
{{LOCGFeat}}
While your willingness to dig into a task you know little about might get you into trouble, your incredible luck often saves you from danger.
You can attempt skill actions that normally require you to be trained even if you aren’t trained in that skill.
If you use [[Halfling Luck]] when you fail a check for a skill with which you are untrained, you can add a proficiency bonus equal to your level, rather than 0, when you reroll the triggering skill check. You gain a +4 circumstance bonus to this rerolled skill check.
You’ve dutifully learned how to keep your balance and how to stick to the shadows where it’s safe, important skills passed down through generations of halfling tradition. You gain the trained proficiency rank in [[Acrobatics]] and [[Stealth]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Halfling [[Lore]].
''Frequency'' once per day
''Trigger'' You fail a skill check or saving throw.
Your happy-go-lucky nature makes it seem like misfortune avoids you, and to an extent, that might even be true.
You can reroll the triggering check, but you must use the new result, even if it’s worse than your first roll.
Your halfling affinity blends with your class training, granting you great skill with halfling weapons.
Whenever you gain a class feature that grants you expert or greater proficiency in a given weapon or weapons, you also gain that proficiency in the sling, halfling sling staff, shortsword, and all halfling weapons in which you are trained.
You favor traditional halfling weapons, so you’ve learned how to use them more effectively.
You have the trained proficiency with the sling, halfling sling staff, and shortsword.
In addition, you gain access to all uncommon halfling weapons. For __the purpose of determining your proficiency__, martial halfling weapons are simple weapons, and advanced halfling weapons are martial weapons.
You are particularly adept at fighting with your people’s favored weapons.
Whenever youcritically succeed at an attack roll using a shortsword, a sling, or a halfling weapon, you apply the weapon’s [[Critical Specialization Effect]].
{{||SpellSummaryTable}}
The target consistently detects one thing as another, can’t detect something that’s there, or detects something that’s not there, though it doesn’t alter their beliefs.
You choose which of these effects applies, and you determine the specifics of the hallucination. For example, you could make the target see all elves as humans, be unable to detect the presence of their brother, see their beloved pocket watch on their person even when it isn’t, or
see a tower in the center of town.
The target can attempt an initial [[Will]] save, with effects below.
They also receive a Will save to disbelieve the hallucination every time they [[Seek]] or directly interact with the hallucination. For example, the target could attempt to disbelieve the hallucination each time they interacted with an elf, bumped into their brother accidentally, tried to check their pocket watch, or studied the tower.
The target can attempt to disbelieve with a large circumstance bonus in situations determined by the GM, such as if the target attempted to climb the nonexistent tower.
''Heightened (6th)'' Choose to either target up to 10 creatures or change the spell’s duration to "until the next time you make your [[daily preparations|Rest]]."
''Heightened (8th)'' Choose to either target any number of creatures or change the spell’s duration to unlimited.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You create an illusion that causes natural terrain to look, sound, feel, and smell like a different kind of terrain.
This doesn’t disguise any structures or creatures in the area.
Any creature that touches the illusion or uses the [[Seek]] action to examine it can attempt to disbelieve your illusion.
''Heightened (5th)'' Your image can also disguise structures or create illusory structures (but still doesn’t disguise creatures).
You are surrounded by a halo of light and goodness at all times.
Your halo sheds light with the effects of a <<tag Divine>> [[Light]] cantrip. A cantrip is heightened to a spell level equal to half your level rounded up.
You can suppress or reestablish the halo with a single action, which has the <<tag Concentrate>> trait.
''Requirements'' You’re wielding a non-finesse melee weapon in two hands.
You smash the ground with your weapon, knocking nearby creatures to the ground.
Choose a square within your reach, including your own space.
If there’s a foe in the chosen square, [[Strike]] that foe with the required weapon.
Then attempt to [[Trip]] every foe in the chosen square plus each square adjacent to that square, ignoring Trip’s requirement that you have a hand free.
This counts as three attacks toward your [[Multiple Attack Penalty]], but the penalty doesn’t increase until after you’ve made the Strike, if any, and all the Trip attempts.
{{||SpellSummaryTable}}
''Prerequisites'' Universalist Wizard.
You hurl a held melee weapon with which you are trained at the target, making a spell attack roll.
On a success, you deal the weapon’s damage as if you had hit with a melee [[Strike]], but adding your spellcasting ability modifier to damage, rather than your Strength modifier.
On a critical success, you deal double damage, and you add the weapon’s [[Critical Specialization Effect]].
Regardless of the outcome, the weapon flies back to you and returns to your hand.
You gain a +1 circumstance bonus to [[Crafting]] checks to [[Repair]] non-magicalitems, and you don’t need a repair kit for such repairs as long as you have any amount of junk, spare parts, or debris at your disposal.
''Frequency'' once per day
''Trigger'' A creature within 60 feet is about to attempt an attack roll or skill check.
You caw ominously, cursing the creature with misfortune.
The target creature must roll the triggering check twice and take the lower result.
Your tail is much stronger than most, and you can lash out with it with the strength of a whip.
You gain a tail unarmed attack that deals 1d6 bludgeoning damage.
You’re accustomed to seeing through shifting darkness and bewildering magic.
You gain a +1 circumstance bonus on [[Perception]] checks against <<tag Illusion>>s as well as to [[Will]] saves against illusions and <<tag Shadow>> effects.
There’s no journey too far or burden too heavy when your friends are at your side.
Increase your maximum and encumbered Bulk limits by 1. In addition, you gain a +10-foot circumstance bonus to your Speed during overland travel.
{{||SpellSummaryTable}}
You channel negative energy to harm the living or heal the undead.
If the target is a living creature, you deal 1d8 negative damage to it, and it gets a basic [[Fortitude]] save.
If the target is a willing <<tag Undead>>creature, you restore that amount of Hit Points.
The number of actions you spend when Casting this Spell determines its targets, range, area, and other parameters.
{{OneAction}} (somatic) The spell has a range of touch.
{{TwoAction}} (verbal, somatic) The spell has a range of 30 feet. If you’re healing an undead creature, increase the Hit Points restored by 8.
{{ThreeAction}} (material, verbal, somatic) You disperse __negative__ energy in a 30-foot [[Emanation]]. This targets all living and undead creatures in the area.
Heightened (+1) The amount of healing or damage increases by 1d8, and the extra healing for the 2 action version increases by 8.
''Prerequisites'' harmful font
The mordant power of your negative energy grows.
When you cast [[Harm]], you roll d10s instead of d8s.
Your size and demeanor make it easy for you to convince others that you mean no harm.
You gain the [[Shameless Request]] skill feat as a bonus feat.
Additionally, you gain a +1 circumstance bonus to initiative checks when you roll [[Deception]] for initiative.
You can perform multiple compositions simultaneously.
If your next action is to cast a composition, it becomes a harmonized composition.
Unlike a normal composition, a harmonized composition doesn’t end if you cast another composition, and you can cast another composition on the same turn as a harmonized one.
Casting another harmonized composition ends any harmonized composition you have in effect.
Your attack prevents a foe from pursuing your allies.
Make a melee [[Strike]], adding the following effects in addition to the normal effects of the Strike.
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
Magic empowers the target to act faster.
It gains the [[Quickened]] condition and can use the extra action each round only for [[Strike]] and [[Stride]] actions.
''Heightened (7th)'' You can target up to 6 creatures.
''Frequency'' Once per round
You can fly a little!
You [[Fly]] up to half your Speed.
If you don’t end your movement on solid ground, you [[Fall]] at the end of your turn.
Your powerful ego makes it harder for others to order you around.
If you roll a success on a saving throw against a <<tag Mental>> effect that attempts to directly control your actions, you critically succeed instead.
If a creature rolls a failure on a check to [[Coerce]] you using [[Intimidation]], it gets a critical failure instead (so it can’t try to Coerce you again for 1 week).
You have an intuitive ability to sense hazards.
You gain a +1 circumstance bonus to [[Perception]] checks to find traps and hazards, to AC against their attacks, and to saves against their effects.
You can find hazards that would normally require you to [[Search]] even if you aren’t Searching.
Make an unarmed melee attack against a [[Prone]] target.
On a hit, the target becomes [[Flat-Footed]] to all attacks until the end of your next turn.
{{||SpellSummaryTable}}
You channel positive energy to heal the living or damage the undead.
If the target is a willing living creature, you restore 1d8 Hit Points.
If the target is <<tag Undead>>, you deal that amount of <<tag Positive>> damage to it, and it gets a basic [[Fortitude]] save.
The number of actions you spend when Casting this Spell determines its targets, range, area, and other parameters.
{{OneAction}} (somatic) The spell has a range of touch.
{{TwoAction}} (verbal, somatic) The spell has a range of 30 feet. If you’re healing a living creature, increase the Hit Points restored by 8.
{{ThreeAction}} (material, somatic, verbal) You disperse positive energy in a 30-foot [[Emanation]]. This targets all living and undead creatures in the burst.
''Heightened (+1)'' The amount of healing or damage increases by 1d8, and the extra healing for the 2-action version increases by 8.
{{||SpellSummaryTable}}
You heal an animal’s wounds, restoring 1d8 Hit Points to the target.
The number of actions spent Casting this Spell determines its effect.
* {{OneAction}} [[Somatic]]: The spell has a range of [[Touch]].
* {{TwoAction}} [[Somatic]], [[Verbal]]: The spell has a range of 30 feet and restores an additional 8 Hit Points to the target.
''Heightened (+1)'' The amount of healing increases by 1d8, and the additional healing for the 2-action version increases by 8.
//Druids of the [[Animal Order]] get this Focus Spell automatically.//
{{||SpellSummaryTable}}
You harness positive energy to heal your animal companion’s wounds.
You restore 1d10 Hit Points to your animal companion.
The number of actions you spend Casting this Spell determines range and other parameters.
{{OneAction}} (somatic) The spell has a range of touch.
{{TwoAction}} (verbal) The spell has a range of 30 feet and restores an additional 8 Hit Points to the target.
''Heightened (+1)'' The amount of healing increases by 1d10, and the additional healing for the 2-action version increases by 8.
''Prerequisites'' [[Divine Ally]] (steed)
Your devotion to your mount manifests as a surge of positive energy.
When you cast [[Lay on Hands]] on your mount, you can restore 10 Hit Points, plus 10 for each heightened level.
{{||SpellSummaryTable}}
Your words bless a creature with an enhanced connection to positive energy.
When the target regains [[Hit Points]] from a <<tag Healing>> spell, it regains 1 additional Hit Point.
The target regains additional Hit Points from healer’s blessing only the first time it regains HP from a given healing spell, so a spell that heals the creature repeatedly over a duration would restore additional Hit Points only once.
''Heightened (+1)'' The additional healing increases by 2 HP.
''Trigger'' You or allies within 30 feet recover Hit Points while your [[Halo]] is active.
Your halo can enhance positive energy.
Creatures who have recovered Hit Points from a <<tag Positive>> <<tag Healing>> effect recover an additional 1d6 Hit Points.
Creatures who benefit from this power become temporarily immune to its effect for the next 10 minutes.
''Additive 2''.
''Frequency'' Once per round.
''Trigger'' You craft an [[Elixir of Life]] using [[Quick Alchemy]], and that elixir is at least 2 levels lower than your [[Advanced Alchemy]] level.
By adding a special catalyst, you transform a healing elixir into a topical projectile.
You grant the elixir the <<tag Bomb>>trait.
If you throw an elixir of life bomb at a willing target, you hit even on a failure, though not on a critical failure.
If your Strike with this elixir bomb hits a living target, the target regains Hit Points as if it had consumed the elixir.
On a critical success, the target also gains the elixir’s item bonus to saving throws against diseases and poisons for 1 minute.
''Prerequisites'' healing font
Your positive energy is even more vibrant and restorative.
When you cast [[Heal]], you roll d10s instead of d8s.
A healing potion is a vial of a ruby-red liquid that imparts a tingling sensation as the drinker’s wounds heal rapidly.
When you drink a healing potion, you regain the listed number of Hit Points.
| !Type | !Level | !Price | !Healing |
| Minor | 1 | 40 | 1d8 |
| Lesser | 3 | 120 | 2d8+5 |
| Moderate | 6 | 500 | 3d8+10 |
| Greater | 12 | 4000 | 6d8+20 |
| Major | 18 | 50000 | 8d8+30 |
You gain the appropriate devotion spell for your cause.
If you don’t already have one, you gain a focus pool of 1 Focus Point, which you can [[Refocus]] by praying or serving your deity.
You can take advantage of shapechanging magic to close wounds and patch injuries.
If your next action is to cast a non-cantrip <<tag Polymorph>> spell that targets only one reature, your polymorph spell also restores 1d6 Hit Points per spell level to that creature.
This is a <<tag Healing>> effect.
{{||SpellSummaryTable}}
You surround your target with wondrous illusions of their greatest desires, which distract them from reality.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
''Heightened (+2)'' You can target one additional creature.
{{||RitualSummaryTable}}
''Cost'' fine wine and a set of matching rings or other tokens worth 40 gp total.
You create a magical bond between two [[Willing]] creatures, who are secondary casters of the ritual and must share genuine affection for one another.
As part of the ritual, both members of the bond receive a ring, amulet, or similar token to symbolize their shared connection. They lose the effects of the ritual when not wearing the token, and the bond is broken if either token is destroyed.
Creatures benefiting from a successful heartbond ritual can later participate in a heightened version of the ritual without requiring new checks by spending the required time and paying the difference of the two costs.
A creature can be under the effects of multiple heartbond rituals at once.
''Heightened (6th)'' Increase the cost to a total value of 600 gp. On a success, secondary casters in the ritual permanently gain the effects of a 6th-level [[Telepathy]] spell, but only with each other.
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
This spell heats the targeted metal to become red-hot for a moment.
This is usually harmless to an unattended metal item, which doesn’t get a saving throw, though the GM might rule that flammable materials connected to the object catch fire or melt.
If you target an item worn or carried by a creature, or you target a creature made primarily of metal, the heat deals 4d6 <<tag Fire>> damage and 2d4 [[persistent|Persistent Damage]] fire damage to the creature, which must attempt a [[Reflex]] saving throw.
If you target an item held by the creature, the creature can [[Release]] the item to improve their degree of success by one step from the result of their saving throw.
The persistent damage is associated with the object and damages whichever creature is holding or wearing it. It has no effect if no one is holding the item, but you continue to attempt flat checks to end the persistent damage as normal, since the item remains hot and can sear someone who picks it up.
{{||SaveSuccessTable}}
''Trigger'' An effect would deal fire damage to you, even if you resist all the damage.
''Frequency'' once per 10 minutes
You harness the oncoming flames and twist them into a screen of heat and smoke, granting you [[concealment|Concealed]] until the beginning of your next turn..
Your shadow can contain objects.
You can [[Interact]] with your shadow to store or retrieve objects, just like you would a mundane container (meaning you spend two Interact actions total to store and then retrieve the object, for example).
Your shadow can contain 2 Bulk of objects, which don’t count toward the Bulk you’re carrying.
The items remain solid but take on a shadowy patina while stored this way.
Though the items are in your shadow and can be detected normally, you gain a +2 circumstance bonus to [[Stealth]] checks to [[Conceal the Object|Conceal an Object]] unless someone knows to check your shadow for items.
You can carry more than your frame implies.
Increase your maximum and encumbered [[Bulk]] limits by 2.
Your instinct heightens each of your senses further.
Your proficiency rank for [[Perception]] increases to master.
{{LOCGFeat}}
When you use [[Saoc Astrology]], roll 1d4 instead; on a 1, you take a –1 penalty to the skill check. On any other result, you gain a circumstance bonus of that value (for instance, a +3 circumstance bonus on a 3).
{{LOCGFeat}}
You’ve trained with your order’s weapon and your Hellknight plate long enough to apply your expertise from other weapons and armor.
If you have expert proficiency in any weapon or unarmed attack, you gain expert proficiency in your order’s weapon as well.
If you have expert proficiency in any armor or unarmored defense, you gain expert proficiency in Hellknight plate as well.
{{||SpellSummaryTable}}
You call forth a plume of hellfire that erupts from below, dealing 4d6 <<tag Fire>>damage and 4d6 <<tag Evil>> damage //with a basic [[Reflex]] save//.
''Heightened (+1)'' The fire damage increases by 1d6, and the evil damage increases by 1d6.
{{LOWGFeat}}
''Prerequisites'' trained in heavy armor as well as your order’s favored weapon.
Your Hellknight training teaches you to terrorize others into compliance, but you also study the structure and hierarchy of Hell. You must survive painful tests of your body and mind called reckonings, which steady your mind against all sorts of trauma.
You gain resistance to mental damage equal to 1 + your number of class feats from the Hellknight Armiger archetype and other Hellknight archetypes.
You become trained in [[Intimidation]] and Hell [[Lore]]; if you were already trained, you become an expert instead.
''Special'' //You can take dedication feats for higher positions within the Hellknights even before gaining two other feats from this archetype.//
<<archetypefeatlist "4 8 12" "[[Hellknight Armiger]]">>
{{LOCGFeat}}
''Prerequisites'' Lawful alignment.
You have forged your body to comply with the commands of your mind—orders steeped in the Measure and the Chain.
You gain expert proficiency in [[Intimidation]] (or in another skill in which you’re trained of your choice, if you were already an expert in Intimidation).
You gain the armor specialization effects of Hellknight plate, and your resistance from that armor specialization is 1 higher than normal.
In addition, you gain a +1 circumstance bonus to Intimidation checks while wearing your Hellknight plate.
''Special'' //You can select these dedication feats even if you haven't yet gained two feats from [[Hellknight Armiger Dedication]]. You can't select [[Hellknight Signifier Dedication]] as well as this. You can take [[Advanced Order Training]] or [[Hellknight Order Cross-Training]] as feats within this archetype.//
<<archetypefeatlist "8 12" "[[Hellknight]]">>
{{LOCGFeat}}
You gain the lesser order benefit of a Hellknight order other than the one to which you belong. This represents your time spent training with members of that order to learn their techniques and teachings. If you aren’t in good standing with a given order, you can’t receive their training.
//This is one of the following. See the Character Guide for which is associated with which order.//
* [[Shackles of Law]]
* [[Locate Lawbreakers]]
* [[Dedication to the Five]]
* [[Trailblazing Stride]]
* [[Righteous Resistance]]
* [[Disillusionment]]
* [[Fear No Law, Fear No One]]
{{LOCGFeat}}
''Prerequisites'' spellcasting class feature, lawful alignment.
You have bolstered your force of will with the power of the Measure and the Chain. Upon initiation, you receive a signifer mask, often devoid of eyeholes or other decorative features. The mask doesn’t obscure your vision, though it makes it impossible for others to see your eyes.
While wearing your signifer’s mask, you gain +1 circumstance bonus to [[Deception]] checks to [[Lie]], [[Intimidation]] checks, and [[Deception]] DCs against [[Sense Motive]].
You gain expert proficiency in [[Intimidation]] (or in another skill in which you’re trained of your choice, if you were already an expert in Intimidation) as well as in your choice of [[Arcana]], [[Nature]], [[Occultism]], or [[Religion]].
''Special'' //You can select these dedication feats even if you haven't yet gained two feats from [[Hellknight Armiger Dedication]]. You can't select [[Hellknight Dedication]] as well as this. You can take [[Advanced Order Training]] or [[Hellknight Order Cross-Training]] as feats within this archetype.//
<<archetypefeatlist "8 10 12" "[[Hellknight Signifier]]">>
Your lineage descends from devils, the conniving schemers of Hell’s malevolent hierarchy. You’re as skilled at noticing lies and twisted wordings as you are at constructing them.
You are trained in [[Deception]] and Legal [[Lore]]. If you were already trained in Deception (from your background or class, for example), you instead become trained in a skill of your choice.
You also gain the [[Lie to Me]] skill feat.
__This condition reflects a creature’s disposition toward a particular character, and only supernatural effects (like a spell) can impose these conditions on player characters.__
A creature that is helpful to a character wishes to actively aid that character.
It will accept reasonable [[Request]]s from that character, as long as such requests aren’t at the expense of the helpful creature’s goals or quality of life.
If the character or one of their allies uses a hostile action against the creature, the creature gains a worse attitude condition depending on the severity of the hostile action, as determined by the GM.
When you aid a friend with a task, you find many ways to help and avoid interfering.
On a critical success to [[Aid]], you grant your ally a +3 circumstance bonus if you have expert proficiency in the skill (rather than +2), and you grant your ally a +4 circumstance bonus if you have master proficiency (rather than +3).
If you roll a critical failure on a check to Aid, you don’t give your ally a –1 circumstance penalty to their check.
Concentrated hemlock is a particularly deadly toxin that halts muscle action—including that of the victim’s heart.
| !Saving Throw |DC 40 [[Fortitude]] |
| !Onset |30 minutes |
| !Maximum Duration |60 minutes |
| !Stage 1 |17d6 poison damage and [[Enfeebled]] 2 (10 minutes) |
| !Stage 2 |21d6 poison damage and [[Enfeebled]] 3 (10 minutes) |
| !Stage 3 |26d6 poison damage and [[Enfeebled]] 4 (10 minutes) |
You can create remedies and other herbal products.
{{MulticlassBasicAlchemy}}
//The alchemy benefits above apply only// for herbal items: alchemical items with the healing trait, plus [[Antidote]] and [[Antiplague]].
You gain batches of infused reagents per day equal to your level or half your level if you didn’t make your daily preparations in the wilderness.
Your advanced alchemy level for creating these is 1 and doesn’t increase on its own.
You become an expert in [[Nature]] and can use Nature instead of Crafting to [[Craft]] herbal items. You don’t need to be trained in Crafting or have the Alchemical Crafting feat to do so, and you can use healer’s tools instead of alchemist’s tools.
<<archetypefeatlist "2 4 6" "Herbalist">>
Your heroic deeds earn you Hero Points, which grant you good fortune or let you recover from the brink of death.
Unlike most aspects of your character, which persist over the long term, Hero Points last for only a single session.
The GM is in charge of awarding Hero Points.
Usually, each character gets 1 Hero Point at the start of a session and can gain more later by performing heroic deeds—something selfless, daring, or beyond normal expectations.
You can have a maximum of 3 Hero Points at a time, and you lose any remaining Hero Points at the end of a session.
You can spend your Hero Points in one of two ways. Neither of these is an action, and you can spend Hero Points even if you aren’t able to act. You can spend a Hero Point on behalf of your familiar or animal companion.
* Spend 1 Hero Point to reroll a check. You must use the second result. This is a [[Fortune]] effect (which means you can’t use more than 1 Hero Point on a check).
* Spend all your Hero Points (minimum 1) to avoid death. You can do this when your [[Dying]] condition would increase. You lose the dying condition entirely and stabilize with 0 Hit Points. You don’t gain the [[Wounded]] condition or increase its value from losing the dying condition in this way, but if you already had that condition, you don’t lose it or decrease its value.
{{||SpellSummaryTable}}
''Trigger'' An attack would bring you to 0 hit points.
You shout in defiance, filling you with a sudden burst of healing.
Just before applying the attack’s damage, you recover 10d4+20 Hit Points. If this is enough to prevent the attack from bringing you to 0 Hit Points, you don’t become [[Unconscious]] or [[Dying]].
Either way, cheating death is difficult, and you can’t use hero’s defiance again until you [[Refocus]] or the next time you prepare.
Hero’s defiance cannot be used against effects with the <<tag Death>>trait or that would leave no remains, such as [[Disintegrate]].
You have begun the final steps to reaching your full potential.
Your wings are always in their majestic form without you needing to use Energize Wings, granting you a permanent fly Speed.
Furthermore, sprites recognize you as a powerful hero (or villain) by your unique wings and are appropriately impressed. You gain a +2 circumstance bonus on all [[Diplomacy]] and [[Intimidation]] checks against sprites and gain the benefits of the [[Glad-Hand]] skill feat against other sprites, without taking a –5 penalty to your Diplomacy check.
The songs of ancient heroes echo through your mind and quicken your pulse, especially in dire straits.
You gain [[Heroism]] as a 3rd-level innate occult spell that you can cast once per day.
If you Cast the Spell when you have half or fewer Hit Points, you also gain temporary Hit Points equal to twice your level.
{{||RitualSummaryTable}}
''Cost'' 25 gp.
You conjure otherworldly beings to serve you and your companions a feast with restorative properties. These mysterious beings may be <<tag Fey>>, <<tag Divine>>, or other supernatural servitors, as appropriate for the primary check.
After the first hour of the ritual, these servants appear and serve a massive feast, complete with an exquisite table and up to 10 place settings. The bounteous spread consists of all manner of dishes, including the guests’ childhood comfort foods, modern delicacies, and preferred drinks. The summoned servants spend the next 3 hours waiting on you and the other guests, fetching additional food, pouring drinks, and so forth.
During this time, you and the other guests must strive to be as polite and gracious as possible to avoid offending your mysterious hosts.
At the feast’s end, the ritual is completed and you and the secondary caster attempt your checks as normal. If the feast is interrupted at any point, the servants immediately vanish with their provisions and the ritual is disrupted.
''Heightened (+1)'' Increase the Hit Points recovered by 10 and the temporary Hit Points by 2 (or twice each amount on a critical success).
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
You gain the ability to perform a specialized combat technique from the vast wealth of martial knowledge your mystery provides.
When you Cast this Spell, you use the action granted by one common fighter feat from the Core Rulebook //or the Advanced Players Guide// (your GM might add feats to this list).
If you Cast this Spell using 2 actions, the granted action must be a single action, and if you Cast this Spell using 3 actions, you can instead choose a feat that grants a 2-action activity.
The chosen feat’s level can be no higher than heroic feat’s spell level.
The feat can’t have a Frequency entry, and you must meet its prerequisites and requirements in order to select it.
''Frequency'' once per day
The blood of heroes courses through your veins, and you inspire your allies to dig deep and find a new level of resolve.
You grant up to 10 [[Willing]] creatures within 30 feet the effects of a 6th-level [[Zealous Conviction]], though the effect automatically ends on a target if you give that target a command they would normally find repugnant.
This action has the <<tag Auditory>> trait or <<tag Visual>> trait, depending on how you inspire your allies.
''Prerequisites'' healing font, good alignment
The restorative power of your healing invigorates the recipient.
If the next action you use is to cast [[Heal]] targeting a single living creature and the target regains Hit Points from the spell, it also gains three bonuses until the end of its next turn: a +5 foot status bonus to its [[Speed]], a +1 status bonus to attack rolls, and a +1 status bonus to damage rolls.
{{||SpellSummaryTable}}
You tap into the target’s inner heroism, granting it a +1 status bonus to attack rolls, Perception checks, saving throws, and skill checks.
''Heightened (6th)'' The status bonus increases to +2.
''Heightened (9th)'' The status bonus increases to +3.
Your patron’s teachings have allowed you to achieve a deeper focus.
If you have spent at least 2 Focus Points since the last time you [[Refocus]]ed, you recover 2 Focus Points when you Refocus instead of 1.
You embody the link to your patron so completely that you can cast your hexes in rapid succession.
You are no longer limited to casting only a single hex each turn.
In addition, when you cast [[Cackle]] to sustain a hex, you gain the effects of Sustain a Spell for all your active hexes that have a duration of sustained.
Focus flows from your patron each time you commune with your familiar.
You can recover 3 Focus Points when you [[Refocus]] instead of 1 if you have spent at least 3 Focus Points since the last time you Refocused.
While you’re hidden from a creature, that creature knows the space you’re in but can’t tell precisely where you are.
You typically become hidden by using [[Stealth]] to [[Hide]].
When [[Seek]]ing a creature using only [[Imprecise]] senses, it remains hidden, rather than observed.
A creature you’re hidden from is [[Flat-Footed]] to you, and it must succeed at a DC 11 flat check when targeting you with an attack, spell, or other effect. If it fails, it doesn't affect the you, though the actions it used are still expended—as well as any spell slots, costs, and other resources.
A creature remains flat-footed to you even if it successfully targets you.
Area effects aren’t subject to this flat check.
A creature might be able to use the [[Seek]] action to try to observe you.
You’ve learned to hide the magical auras of your gear.
During your daily preparations, you carefully tweak any or all of your magic items to appear non-magical.
Objects adjusted in this way remain so until your next preparations.
A spellcaster using [[Detect Magic]] or [[Read Aura]] must succeed at a [[Perception]] check against your [[Deception]] DC to see through your obfuscations.
''Frequency'' once per hour.
''Trigger'' You successfully use [[Stealth]] to [[Hide]] and become [[Hidden]] from all of your current foes, or use [[Stealth]] to [[Sneak]] and become [[Undetected]] to all your current foes.
When you put your mind to slipping out of sight, you disappear completely.
You become [[Invisible]] for 1 minute, even if you use a [[Hostile Action]].
Not even [[Glitterdust]], [[See Invisibility]], or similar effects can reveal you, though creatures can still use the [[Seek]] action to locate you as normal.
You huddle behind cover or greater cover or deeper into concealment to become [[Hidden]], rather than [[Observed]].
The GM rolls your [[Stealth]] check in secret and compares the result to the [[Perception]] DC of each creature you’re observed by but that you have [[Cover]] or [[Greater Cover]] against or are [[Concealed]] from. You gain the circumstance bonus from cover or greater cover to your check.
//You can hide from visual spell [[Trigger]]s by beating their spell DC.//
//You can't use Concealment granted by [[Blur]] to Hide.//
If you suceed, if the creature could see you, you’re now [[Hidden]] from it instead of [[Observed]]. If you were hidden from or [[Undetected]] by the creature, you retain that condition.
If you successfully become hidden to a creature but then cease to have cover or greater cover against it or be concealed from it, you become observed again.
You cease being hidden if you do anything except [[Hide]], [[Sneak]], or [[Step]].
If you attempt to [[Strike]] a creature, the creature remains [[Flat-Footed]] against that attack, and you then become observed.
If you do anything else, you become observed just before you act unless the GM determines otherwise.
The GM might allow you to perform a particularly unobtrusive action without being noticed, possibly requiring another Stealth check.
If a creature uses [[Seek]] to make you observed by it, you must successfully Hide to become hidden from it again.
{{||SpellSummaryTable}}
The target is overtaken with uncontrollable laughter.
It must attempt a [[Will]] save.
{{||SaveSuccessTable}}
You have entwined yourself with the natural world, and its full power flows through you.
You gain an additional 10th-level spell slot.
You [[Stride]], then make a vertical [[Leap]] and attempt a DC 30 [[Athletics]] check to increase the height of your jump.
//If you have [[Quick Jump]], you can High Jump as a single action but you don't Stride.//
If you didn’t Stride at least 10 feet, you automatically fail your check //unless you have [[Quick Jump]].//
This DC might be increased or decreased due to the situation, as determined by the GM.
//If you have [[Wall Jump]], you can jump a second time off a wall as a single action.//
//If you have [[Cloud Jump]], you jump up a number of feet equal to the DC you roll, limited to your Speed times the number of actions you spent jumping.//
{{||ActionSuccessTable}}
When you Craft a temporary item using Scrounger Dedication, it can be an item of up to 3rd level (though the item must still be a weapon, armor, or a nonconsumable piece of adventuring gear).
You can instead Craft it for someone else’s use, allowing them to avoid taking the penalty for using a shoddy item when using it, but causing you to take the penalty if you use it.
When you regain Hit Points overnight, add your level to the Hit Points regained. When anyone uses the Medicine skill to [[Treat your Wounds|Treat Wounds]], you can eat a snack to add your level to the Hit Points you regain from their treatment.
''Prerequisites'' Charisma 14.
You are able to find and secure better labor than most.
When securing a hireling for a service, that hireling gains a +2 circumstance bonus to all skill checks.
This circumstance bonus applies to both trained and untrained hirelings and has no effect on the cost of the service or labor provided.
You’ve studied traditional hobgoblin exercises and fieldcraft, all of which have a militaristic bent.
You become trained in [[Athletics]] and [[Crafting]]. For each of these skills in which you were already trained, you become trained in a skill of your choice.
You also become trained in Hobgoblin [[Lore]].
You know how to efficiently utilize the weapons soldiers use in close quarters.
Whenever you score a critical hit using a weapon of the [[Polearm]], [[Spear]], or [[Sword]] group, you apply the weapon’s [[Critical Specialization Effect]].
You increase your training in battlefield weapons.
Whenever you gain a class feature that grants you expert or greater proficiency in certain weapons, you also gain that proficiency rank in all weapons you are trained in from [[Hobgoblin Weapon Familiarity]].
You are trained with [[Composite Longbow]]s, [[Composite Shortbow]]s, [[Glaive]]s, [[Halberd]]s, [[Longbow]]s, [[Longspear]]s, [[Longsword]]s, [[Shortbow]]s, and [[Spear]]s.
In addition, you gain access to all uncommon hobgoblin weapons.
For the purpose of determining your proficiency, martial hobgoblin weapons are simple weapons and advanced hobgoblin weapons are martial weapons.
''Prerequisites'' Trained in [[Diplomacy]].
You are skilled at learning information through conversation.
The [[Gather Information]] exploration activity takes you half as long as normal (typically reducing the time to 1 hour).
If you’re a master in Diplomacy and you Gather Information at the normal speed, when you attempt to do so and roll a critical failure, you get a failure instead.
There is still no guarantee that a rumor you learn with Gather Information is accurate.
You bear scars or tattoos enhanced by the mark of your community’s prowess.
When you select this feat, choose one of the options on the following page.
When you critically hit using a weapon of the listed group, you apply the weapon’s [[Critical Specialization Effect]].
You gain a large brand or tattoo in the shape of the chosen emblem or a similar image (for example, the axe could be a bear or other symbol of ferocious strength, while the shield might be a turtle or another symbol associated with a strong defense) and gain the listed benefit.
* ''Axe'' [[Axe]] or [[Pick]]
* ''Shield'' [[Hammer]] or [[Shield]]
* ''Torch'' [[Bomb]] or [[Knife]]
You gain 12 Hit Points from your ancestry instead of 10. You also gain the [[Diehard]] feat.
You provide emotional and spiritual care.
Add [[Frightened]], [[Stupefied]], and [[Stunned]] to the list of conditions you can reduce with [[Treat Condition]].
If the stunned condition has a duration instead of a value, you can’t use Treat Condition to reduce it.
''Usage'' etched onto a weapon without an [[Unholy]] rune.
''Craft Requirements'' You are good.
Holy weapons command powerful celestial energy.
A weapon with this rune deals an extra 1d6 good damage against <<tag Evil>> targets.
If you are evil, you are [[Enfeebled]] 2 while carrying or wielding this weapon.
''Activate'' {{ReactionIcon}} Command; ''Frequency'' once per day; ''Trigger'' You critically succeed at an attack roll against an evil creature with the weapon; ''Effect'' You regain HP equal to double the evil creature’s level. This is a <<tag Good>>, <<tag Positive>>, <<tag Healing>> effect.
The gleaming holy avenger is the iconic weapon of powerful paladins.
The crossbar of this [[+2|Weapon Potency]] greater [[Striking]] [[Holy]] [[cold iron|Cold Iron Weapon]] longsword is styled to look like angel wings. Tradition holds that those who see their reflection in a holy avenger’s highly polished blade have their faults laid bare.
If you are evil, you are [[Enfeebled]] 2 while carrying or wielding this weapon.
''Activate'' {{TwoAction}} command, [[Interact]]; ''Frequency'' once per hour; ''Effect'' You command the sword and point it at a creature you can see. The sword casts [[Detect Alignment]] to detect evil, but this targets only the selected creature instead of detecting in an area.
!! Paladin Wielder
If you’re a [[Champion]] of the [[Paladin Cause]], you also gain the following two benefits.
* When you critically hit an evil creature with the holy avenger, the creature is [[Slowed]] 1 and [[Enfeebled]] 2 for 1 round.
* You can activate the sword in the following way: ''Activate'' {{OneAction}} command; ''Frequency'' once per day; ''Requirements'' You hit a creature using the holy avenger on your previous action; ''Effect'' You cast [[Dispel Magic]] at the same level as your champion focus spells. It must target an illusion the creature you hit created, a spell affecting the creature you hit, or an item the creature you hit wears or carries. The spell or item you attempt to counteract must be within 120 feet of you.
''Craft Requirements'' You are a [[Champion]] with the [[Paladin Cause]]; supply a casting of [[Detect Alignment]] and [[Dispel Magic]]. The initial raw materials must include 120 gp of cold iron.
{{||SpellSummaryTable}}
''Cost'' One vial of [[Holy Water]].
You call upon sacred energy to amplify a vial of holy water, tossing it an incredible distance.
It explodes in an enormous burst that deals 3d6 bludgeoning damage to creatures in the area from the cascade of water //with a basic [[Reflex]] save//.
The water deals an additional 6d6 positive damage to <<tag Undead>>and 6d6 good damage to <<tag Fiend>>s.
''Heightened (+1)'' The bludgeoning damage increases by 1d6, and the additional positive and good damage each increase by 2d6.
You combine holy energy with positive energy to damage demons, devils, and their evil ilk.
[[Heal]] spells you cast damage <<tag Fiend>>s as though they were <<tag Undead>>.
This strand of ordinary-looking prayer beads glows with a soft light and becomes warm to the touch the first time you cast a divine spell while holding it. When you do, the prayer beads become attuned to your deity, changing their form and iconography to prominently incorporate your deity’s religious symbol and iconography.
The beads don’t transform or function for an evil spellcaster.
Whenever you cast a divine spell from your own spell slots while holding the prayer beads, you recover 1 Hit Point; this is a <<tag Positive>> <<tag Healing>> effect.
If the spell you cast was a <<tag Healing>> spell, you can grant this additional healing to one of the spell’s targets instead of yourself.
''Activate'' [[Cast a Spell]]; ''Effect'' Cast [[Bless]] or [[Heal]], each once per day.
| !Variant | !Level | !Price | !Healing on cast | !Spells castable |
| Standard | 5 | 1600 | 1 | [[Bless]], [[Heal]] |
| Greater | 11 | 14000 | 1d4 | 4th-level [[Bless]], [[Divine Wrath]], [[Heal]], [[Neutralize Poison]], [[Remove Disease]] |
''Craft Requirements'' You have a spellcasting class feature with the divine tradition.
This vial contains water blessed by a good deity.
You activate a vial of holy water by throwing it as a [[Strike]]. It’s a simple thrown weapon with a range increment of 20 feet. Unlike an alchemical bomb, it doesn’t add the manipulate trait to the attack made with it.
Holy water deals 1d6 good damage and 1 good splash damage. It damages only fiends, undead, and creatures that have a weakness to good damage.
''Frequency'' twice per week.
The connection between you and the First World resonates within your body stronger than it does for most gnomes, allowing you to cross the threshold between the Material Plane and the First World.
You gain [[Plane Shift]] as a primal innate spell. You can cast it twice per week.
This can be used only to travel back and forth between the First World and the Material Plane.
Due to your body’s natural resonance, you can act as the spell focus, and you don’t require a tuning fork.
You’ve internalized the hopping gait of your vampiric forebear.
[[Stride]] up to a distance equal to your Speed – 10 feet.
During this Stride, instead of moving through each space normally, you hop over every other square between your starting space and your ending space.
These hops aren’t high enough to jump over a creature or other significant obstacle in your way, but they avoid [[Difficult Terrain]], [[Hazardous Terrain]], pressure plates, or hazards on the ground or up to a foot above it in the spaces you hopped over.
You’ve mastered travel within a specific type of terrain.
You gain the [[Favored Terrain]] feat.
When in your favored terrain, you gain a +10-foot circumstance bonus to your travel Speed.
When other creatures [[Follow the Expert]] with you as a guide in your favored terrain, they gain both the ability to ignore non-magical difficult terrain for the purpose of their travel Speed and the bonus to travel Speed.
<<archetypefeatlist "4 6 10 12" "[[Horizon Walker]]">>
A horn of blasting is a bright brass trumpet.
It can be played as an instrument, granting a +2 item bonus to your [[Performance]] check.
''Activate'' {{OneAction}} [[Interact]]; ''Frequency'' once per round; ''Effect'' Blowing into the horn with destructive intent, you create a blast note targeting one creature within 30 feet. The blast deals 3d6 sonic damage (DC 28 basic [[Fortitude]] save).
''Activate'' {{TwoAction}} [[Interact]]; ''Frequency'' once per day; ''Effect'' You blow even louder to create an intense blast wave in a 30-foot [[Cone]] that deals 8d6 sonic damage. Each creature attempts a DC 28 [[Fortitude]] save with the following effects.
{{||SaveSuccessTable}}
This large ram’s horn perpetually glistens with tiny droplets of water, much like condensation.
''Activate'' {{TwoAction}} [[Interact]]; ''Frequency'' once per hour; ''Effect'' You activate the horn by blowing deeply into it, causing it to issue forth a low blast and cast a 2nd-level [[Obscuring Mist]] spell.
You can [[Dismiss]] the mist at any time by blowing a second note on the horn using an [[Interact]] action.
{{||SpellSummaryTable}}
You pull the moisture from the targets’ bodies, dealing 10d10 negative damage //with a basic [[Fortitude]] save//.
Creatures made of water (such as water elementals) and plant creatures use the outcome for one degree of success worse than the result of their saving throw.
Creatures whose bodies contain no significant moisture (such as earth elementals) are immune to horrid wilting.
''Heightened (+1)'' The damage increases by 1d10.
{{||SpellSummaryTable}}
You briefly transform your features into the horrific visage of a hag, striking fear into your enemies.
Foes in the area must attempt a [[Will]] save.
''Heightened (5th)'' Foes in the area are [[Frightened]] 1 on a success, [[Frightened]] 2 on a failure, and [[Frightened]] 3 and [[Fleeing]] for 1 round on a critical failure. They are still unaffected on a critical success.
{{||SaveSuccessTable}}
''Size'' Medium or Large
''Melee'' {{OneAction}} hoof [[Agcile]], damage 1d6 bludgeoning
''Str'' +3, ''Dex'' +2, ''Con'' +2, ''Int'' –4, ''Wis'' +1, ''Cha'' +0
''Hit Points'' 8
''Skill'' [[Survival]]
''Senses'' [[Low-Light Vision]], [[Scent]] (Imprecise, 30 feet)
''Speed'' 40 feet
''Special'' Mount
''Support Benefit'' Your horse adds momentum to your charge. Until the start of your next turn, if you moved at least 10 feet on the action before your attack, add a circumstance bonus to damage to that attack equal to twice the number of damage dice. If your weapon already has the [[Jousting]] weapon trait, increase the trait’s damage bonus by 2 per die instead.
''Advanced Maneuver'' [[Gallop]]
__This condition reflects a creature’s disposition toward a particular character, and only supernatural effects (like a spell) can impose these conditions on player characters.__
A creature that is hostile to a character actively seeks to harm that character.
It doesn’t necessarily attack, but it won’t accept [[Request]]s from the character.
Sometimes spell effects prevent a target from using hostile actions, or the spell ends if a creature uses any hostile actions.
A hostile action is one that can harm or damage another creature, whether directly or indirectly, but not one that a creature is unaware could cause harm.
For instance, lobbing a fireball into a crowd would be a hostile action, but opening a door and accidentally freeing a horrible monster would not be.
The GM is the final arbitrator of what constitutes a hostile action.
{{||SpellSummaryTable}}
You mime creating an invisible 10-foot-by-10-foot stretch of wall adjacent to you and within your reach.
The wall is solid to those creatures that don’t disbelieve it, even incorporeal creatures.
You and your allies can voluntarily believe the wall exists to continue to treat it as solid, for instance to [[Climb]] onto it.
A creature that disbelieves the illusion is temporarily immune to your house of imaginary walls for 1 minute.
The wall doesn’t block creatures that didn’t see your visual performance, nor does it block objects.
The wall has AC 10, Hardness equal to double the spell’s level, and HP equal to quadruple the spell’s level.
{{||SpellSummaryTable}}
You transform your appearance to that of a <<tag Small>>or <<tag Medium>>humanoid, such as a [[Dwarf]], [[Elf]], [[Goblin]], [[Halfling]], [[Human]], [[Orc]], or [[Lizardfolk]].
You gain the <<tag Humanoid>>trait in addition to your other traits while in this form, as well as any trait related to the creature’s kind (such as goblin or human).
If this transformation reduces your size, it reduces your reach accordingly (as the [[Shrink]] spell).
This transformation doesn’t change your statistics in any way, and you don’t gain any special abilities of the humanoid form you assume.
You can still wear and use your gear, which changes size (if necessary) to match your new form.
If items leave your person, they return to their usual size.
Humanoid form grants you a +4 status bonus to [[Deception]] checks to pass as a generic member of the chosen ancestry, and you add your level even if you’re untrained, but you can’t make yourself look like a specific person.
If you want to Impersonate an individual, you still need to [[create a disguise|Impersonate]], though the GM won’t factor in the difference in ancestry when determining the DC of your Deception check.
You can [[Dismiss]] this spell.
''Heightened (3rd)'' You gain [[Darkvision]] or [[Low-Light Vision]] if the form you assume has that ability.
''Heightened (5th)'' You can take on the appearance of a Large humanoid. If this increases your size, you gain the effects of the [[Enlarge]] spell.
You’ll eat anything and anyone.
Whenever you inflict persistent bleed damage with your jaws unarmed attack, you gain temporary Hit Points equal to half your level for 1 minute.
You designate a single creature as your prey and focus your attacks against that creature.
You must be able to see or hear the prey, or you must be tracking the prey during exploration.
You gain a +2 circumstance bonus to [[Perception]] checks when you [[Seek]] your prey and a +2 circumstance bonus to [[Survival]] checks when you [[Track]] your prey.
You also ignore the penalty for making ranged attacks within your second range increment against the prey you’re hunting.
You can have only one creature designated as your prey at a time. If you use Hunt Prey against a creature when you already have a creature designated, the prior creature loses the designation and the new prey gains the designation.
Your designation lasts until your next daily preparations.
''Frequency'' once per round.
''Requirement'' You are wielding a ranged weapon with reload 0.
You take two quick shots against the one you hunt.
Make two [[Strike]]s against your prey with the required weapon.
If both hit the same creature, combine their damage for the purpose of resistances and weaknesses.
Apply your [[Multiple Attack Penalty]] to each Strike normally.
When you focus on aiming, your attack becomes particularly accurate.
Make a ranged weapon [[Strike]] against your hunted prey.
On this Strike, you gain a +2 circumstance bonus to the attack roll and ignore your prey’s [[Concealed]] condition.
This arrowhead-shaped charm is not meant to be affixed to an arrow, but instead to be carried in a pocket or inside of a quiver. A hunter’s arrowhead is etched with images sacred to the elven god.
If you carry one on your person, you are infused with great skill at hunting, and gain a +1 item bonus to [[Survival]] skill checks and attack rolls against any creature you’ve currently designated as your prey for the [[Hunt Prey]] ranger ability (note that the bonus to attack rolls
is an item bonus, and therefore not cumulative with an
item bonus from a magic weapon).
A hunter’s arrowhead is also a religious symbol of //the god of elves//.
//The Hunter's Arrowhead has additional properties which are specific to the plot of Age Of Ashes 1.//
''Activate'' {{ReactionIcon}} command; ''Frequency'' once per day; ''Trigger'' You would miss with an attack made with a bow. ''Effect'' You get a +2 circumstance bonus to your attack roll. This can turn a miss into a hit.
Affix to armor.
''Requirements'' You are trained in [[Survival]].
''Trigger'' An undetected enemy hits you with an attack.
This talisman is a ring of dried, interwoven leaves.
When you activate the hunter’s bane, you sense the exact location of the attacker, making it [[Hidden]] from you instead of [[Undetected]].
If the attacker is behind lead, the hunter’s bane fails and is wasted.
{{||SpellSummaryTable}}
''Trigger'' You attempt a check to [[Recall Knowledge]] about a creature, but you haven't rolled yet.
You have a preternatural ability to remember details about your foes.
Roll the triggering check twice and use the better result.
{{||SpellSummaryTable}}
Your target glows with a magical aura visible only to you and those who follow your lead.
Your target is visible to you and others sharing your [[Hunt Prey]] benefits even if it wouldn’t normally be due to lighting or the [[Concealed]] or [[Invisible]] conditions, though cover from opaque objects still blocks your sight.
You ignore the flat check against the target due to the concealed condition, and the target isn’t automatically [[Hidden]] from you due to darkness or being invisible.
You gain imprecise [[Scent]] with a range of 30 feet. This means you can use your sense of smell to determine a creature’s location. The GM will usually double the range if you’re downwind from the creature or halve the range if you’re upwind. In addition, you gain a +2 circumstance bonus to [[Track]] a creature or object if you’ve smelled it before.
This venom erodes its target’s defenses, aiding the spider in securing prey.
| !Saving Throw |DC 21 [[Fortitude]] |
| !Onset |Immediate |
| !Maximum Duration |6 rounds |
| !Stage 1 |1d10 poison damage and [[Flat-Footed]] (1 round) |
| !Stage 2 |1d12 poison damage, [[Clumsy]] 1 and [[Flat-Footed]] (1 round) |
| !Stage 3 |2d6 poison damage, [[Clumsy]] 2 and [[Flat-Footed]] (1 round) |
You make a ranged [[Strike]] with a thrown weapon you already have in your hand, [[Stride]], and then [[Interact]] to draw another weapon.
If you are raging, you can add the additional damage with melee weapons you receive from raging to your damage with the thrown weapon.
''Frequency'' once per day
''Trigger'' You critically hit a foe with a Strike with a slashing weapon.
Choose either [[Lightning Bolt]] or [[Gust of Wind]]. You Cast the chosen Spell as a 6th-level primal innate spell in the direction of the target of the triggering action.
{{||SpellSummaryTable}}
You evoke a magical stone and throw it, with your god’s presence guiding your aim.
Make a spell attack roll against the target.
The stone deals bludgeoning damage equal to 1d6 plus your [[Strength]] modifier.
On a critical hit, you deal double damage.
''Heightened (+1)'' The stone’s damage increases by 1d6.
You strain yourself to move at double your travel speed.
You can Hustle only for a number of minutes equal to your [[Constitution]] modifier * 10 (minimum 10 minutes).
If you are in a group that is Hustling, use the lowest Constitution modifier among everyone to determine how fast the group can Hustle together.
When you [[Change Shape|Change Shape (Kitsune)]], you retain elements of your kitsune form, allowing you to speak in a fox form, use kitsune unarmed attacks in a tailless form, or gain a tail in your tailless form to use abilities that require one.
You can Change Shape to alter the details of your hybrid form without fully changing into your true form or your alternate form.
While in hybrid form, your foxlike features make it obvious that you aren’t a normal humanoid.
While you are an amphibious being equally as capable on land as in the water, your body requires you to return to aquatic environments at least once in a 24-hour period.
You must submerge in water in order to rehydrate your water-acclimated skin.
If you fail to do this, your skin begins to crack and your gills become painful. After the first 24 hours outside of water, you take a –1 status penalty to Fortitude saves.
After 48 hours, you struggle to breathe air and begin to suffocate until returned to water.
Drawing moisture from the atmosphere, you create a disc of hovering water that deflects attacks.
You gain a +1 circumstance bonus to AC until the start of your next turn.
You batter your foes with a torrent of water siphoned from your surroundings.
If the next action you take is an [[Athletics]] check to [[Disarm]], [[Shove]], or [[Trip]], that action has a range of 15 feet.
You don’t receive any item bonuses to that check or any circumstance bonuses related to your physical body, but if you roll a critical failure on that Athletics check, you get a failure instead.
{{||SpellSummaryTable}}
You call forth a powerful blast of pressurized water that bludgeons the target and knocks it back.
Make a ranged spell attack roll.
''Heightened (+1)'' The damage increases by 2d6.
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
A swirling torrent of water manifests along a straight line, battering those that are its path and possibly pushing them away from you.
The torrent deals 8d6 bludgeoning damage.
Each creature in the area must attempt a basic Fortitude save.
Creatures that fail the save are also knocked back 5 feet (10 feet on a critical failure).
''Heightened (+1)'' The damage increases by 2d6.
{{||SpellSummaryTable}}
//Even though this spell has only one component, casting it is {{TwoAction}}.//
Your divine singing mends wounds and provides a temporary respite from harm.
The target gains [[Fast Healing]] 2.
When you Cast the Spell and each time you [[Sustain the Spell|Sustain a Spell]], the target gains 2 temporary Hit Points, which last for 1 round.
''Heightened (+1)'' The fast healing and temporary Hit Points each increase by 2.
{{||SpellSummaryTable}}
You rapidly catalog and collate information relevant to your current situation.
You can instantly use up to 6 [[Recall Knowledge]] actions as part of Casting this Spell.
For these actions, you can’t use any special abilities, reactions, or free actions that trigger when you Recall Knowledge.
{{||SpellSummaryTable}}
You sharpen a creature’s senses, though more distant objects become hazy, indistinct, or muted to it.
The target gains a +1 status bonus to [[Perception]] checks attempted with any of its [[Precise]] senses.
Furthermore, any [[Imprecise]] senses the target has are sharpened to [[Precise]] senses (though they do not receive the status bonus).
However, the target cannot perceive anything beyond a range of 20 feet with any of its senses.
The duration is determined by the target’s [[Will]] save. You can allow allies to choose the outcome instead of rolling a saving throw.
''Heightened (3rd)'' You can target up to 2 creatures.
''Heightened (6th)'' You can target up to 4 creatures.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You create a pattern of shifting colors that hovers in the air in a geometric cloud.
Creatures are [[Dazzled]] while inside the pattern.
In addition, a creature must attempt a Will saving throw if it is inside the pattern when you cast it, when it enters the pattern, when it ends its turn within the pattern, or if it uses a [[Seek]] or [[Interact]] action on the pattern.
A creature currently fascinated by the pattern doesn’t attempt new saves.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You create a gray storm cloud that pelts creatures with an icy deluge.
When you Cast the Spell, a burst of magical hail deals 2d8 bludgeoning damage and 2d8 cold damage to each creature in the area below the cloud (basic [[Reflex]] save).
Snow and sleet continue to rain down in the area for the remainder of the spell’s duration, making the area [[Difficult Terrain]], causing creatures in the storm to be [[Concealed]], and making creatures outside the storm concealed from those inside the storm.
Any creature that ends its turn in the storm takes 4 <<tag Cold>> damage.
If you Cast this Spell outdoors, you can create two non-overlapping clouds instead of one.
''Heightened (+2)'' The initial bludgeoning damage and cold damage increase by 1d8 each, and the cold damage creatures take at the end of their turns increases by 2.
''Requirements'' You have [[Alchemist’s Tools]].
You can identify the nature of an alchemical item with 10 minutes of testing using alchemist’s tools.
//Make a [[Crafting]] check.//
If your attempt is interrupted in any way, you must start over.
{{||ActionSuccessTable}}
//Identifying a creature is technically a special case of [[Recall Knowledge]] but it is listed here as a separate action because it is frequently referred to.//
A character who successfully identifies a creature learns one of its best-known attributes—such as a troll’s regeneration (and the fact that it can be stopped by acid or fire) or a manticore’s tail spikes.
On a critical success, the character also learns something subtler, like a demon’s weakness or the trigger for one of the creature’s reactions.
The skill used to identify a creature usually depends on that creature’s trait, but you have leeway on which skills apply. For instance, hags are humanoids but have a strong connection to occult spells and live outside society, so you might allow a character to use Occultism to identify them without any DC adjustment, while Society is harder.
| !Creature Trait | !Skill |
|Aberration| Occultism|
|Animal| Nature|
|Astral| Occultism|
|Beast| Arcana, Nature|
|Celestial| Religion|
|Construct| Arcana, Crafting|
|Dragon| Arcana|
|Elemental| Arcana, Nature|
|Ethereal| Occultism|
|Fey| Nature|
|Fiend| Religion|
|Fungus| Nature|
|Humanoid| Society|
|Monitor| Religion|
|Ooze| Occultism|
|Plant| Nature|
|Spirit| Occultism|
|Undead| Religion|
Lore skills can also be used to identify their specific creature. Using the applicable Lore usually has an easy or very easy DC (before adjusting for rarity).
//The DC is usually based on the creature's level and [[Rarity Modifier]].//
{{||ActionSuccessTable}}
Once you discover that an item, location, or ongoing effect is magical, you can spend 10 minutes to try to identify the particulars of its magic.
If your attempt is interrupted, you must start over.
The GM sets the DC for your check. Cursed or esoteric subjects usually have higher DCs or might even be impossible to identify using this activity alone. Heightening a spell doesn’t increase the DC to identify it.
{{||ActionSuccessTable}}
Aberration:Occultism
Animal:Nature
Astral:Occultism
Beast:Arcana Nature
Celestial:Religion
Construct:Arcana Crafting
Dragon:Arcana
Elemental:Arcana Nature
Ethereal:Occultism
Fey:Nature
Fiend:Religion
Fungus:Nature
Humanoid:Society
Monitor:Religion
Ooze:Occultism
Plant:Nature
Spirit:Occultism
Undead:Religion
Your wild, unique features betray your agathion birthright. Serene celestials from the plane of Nirvana, agathions seek the peaceful path, ensuring a better world for all to coexist. Your halcyon demeanor leads you to search for peaceful resolution to conflict.
You gain the trained proficiency rank in [[Nature]]. If you would automatically become trained in Nature (from your background or class, for example), you instead become trained in a skill of
your choice.
You know the [[Sylvan]] language and gain the [[Natural Medicine]] skill feat.
You descend from fire elementals or bear the mark of the Inner Spheres, and your features illustrate the influence that elemental fire has over you.
You gain the <<tag Ifrit>> trait, in addition to the traits from your ancestry.
You gain resistance to fire equal to half your level (minimum 1), and you treat [[environmental heat effects|Temperature Effects]] as if they were one step less severe (incredible heat becomes extreme, extreme heat becomes severe, and so on).
You can choose from <<tag Ifrit>> feats and feats from your ancestry whenever you gain an ancestry feat.
{{||VHerFeatList}}
{{||SpellSummaryTable}}
The target is struck with misfortune, which throws it off balance.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
Illusions create the semblance of something real, fooling the eyes, ears, and other senses.
They almost always have the <<tag Mental>> trait, and depending on how the illusion is perceived, they might also have the <<tag Auditory>> or <<tag Visual>> trait.
Sometimes illusions allow an affected creature a chance to disbelieve the spell, which lets the creature effectively ignore the spell if it succeeds at doing so.
This usually happens when a creature [[Seek]]s or otherwise spends actions to engage with the illusion, comparing the result of its Perception check (or another check or saving throw, at the GM’s discretion) to the caster’s spell DC.
Mental illusions typically provide rules in the spell’s description for disbelieving the effect (often allowing the affected creature to attempt a Will save).
If the illusion is <<tag Visual>>, and a creature interacts with the illusion in a way that would prove it is not what it seems, the creature might know that an illusion is present, but it still can’t ignore the illusion without successfully disbelieving it. For instance, if a character is pushed through the illusion of a door, they will know that the door is an illusion, but they still can’t see through it.
Disbelieving an illusion makes it and those things it blocks seem hazy and indistinct, so even in the case where a visual illusion is disbelieved, it may, at the GM’s discretion, block vision enough to make those on the other side [[Concealed]].
Your ancestors spent their days cloaked and cradled in illusions, and as a result, sensing illusion magic is second nature to you.
You gain a +1 circumstance bonus to both Perception checks and Will saves against illusions.
When you come within 10 feet of an illusion that can be disbelieved, the GM rolls a secret check for you to disbelieve it, even if you didn’t spend an action to [[Interact]] with the illusion.
{{||SpellSummaryTable}}
You create an illusory image of a <<tag Large>>or smaller creature.
It generates the appropriate sounds, smells, and feels believable to the touch.
If you and the image are ever farther than 500 feet apart, the spell ends.
The image can’t speak, but you can use your actions to speak through the creature, with the spell disguising your voice as appropriate. You might need to attempt a [[Deception]] or [[Performance]] check to mimic the creature, as determined by the GM. This is especially likely if you’re trying to imitate a specific person and engage with someone that person knows.
In combat, the illusion can use 2 actions per turn, which it uses when you [[Sustain the Spell|Sustain a Spell]].
It uses your spell attack roll for attack rolls and your spell DC for its AC. Its saving throw modifiers are equal to your spell DC – 10.
It is substantial enough that it can flank other creatures.
If the image is hit by an attack or fails a save, the spell ends.
The illusion can cause damage by making the target believe the illusion’s attacks are real, but it cannot otherwise directly affect the physical world.
If the illusory creature hits with a [[Strike]], the target takes mental damage equal to 1d4 plus your spellcasting ability modifier. This is a <<tag Mental>> effect. The illusion’s Strikes are nonlethal.
If the damage doesn’t correspond to the image of the monster—for example, if an illusory Large dragon deals only 5 damage—the GM might allow the target to attempt a [[Perception]] check to disbelieve the spell as a free action.
Any relevant resistances and weaknesses apply if the target thinks they do, as judged by the GM. For example, if the illusion wields a warhammer and attacks a creature resistant to bludgeoning damage, the creature would take less mental damage.
However, illusory damage does not deactivate regeneration or trigger other effects that require a certain damage type.
The GM should track illusory damage dealt by the illusion.
Any creature that touches the image or uses the [[Seek]] action to examine it can attempt to disbelieve your illusion.
When a creature disbelieves the illusion, it recovers from half the damage it had taken from it (if any) and doesn’t take any further damage from it.
''Heightened (+1)'' The damage of the image’s Strikes increases by 1d4, and the maximum size of creature you can create increases by one (to a maximum of <<tag Gargantuan>>).
{{||SpellSummaryTable}}
You create an illusion that causes you to appear as another creature of the same body shape, and with roughly similar height (within 6 inches) and weight (within 50 pounds), as yourself.
The disguise is typically good enough to hide your identity, but not to impersonate a specific individual.
The spell doesn’t change your voice, scent, or mannerisms.
You can change the appearance of your clothing and worn items, such as making your armor look like a dress. Held items are unaffected, and any worn item you remove returns to its true appearance.
Casting illusory disguise counts as setting up a disguise for the [[Impersonate]] use of [[Deception]]; it ignores any circumstance penalties you might take for disguising yourself as a dissimilar creature, it gives you a +4 status bonus to [[Deception]] checks to prevent others from seeing through your disguise, and you add your level even if you’re untrained.
You can [[Dismiss]] this spell.
''Heightened (2nd)'' The spell also disguises your voice and scent, and it gains the <<tag Auditory>> trait.
''Heightened (3rd)'' You can appear as any creature of the same size, even a specific individual. You must have seen an individual to take on their appearance. The spell also disguises your voice and scent, and it gains the auditory trait.
{{||SpellSummaryTable}}
You create an illusory visual image of a stationary object.
The entire image must fit within the spell’s area.
The object appears to animate naturally, but it doesn’t make sounds or generate smells. For example, water would appear to pour down an illusory waterfall, but it would be silent.
Any creature that touches the image or uses the [[Seek]] action to examine it can attempt to disbelieve your illusion.
''Heightened (2nd)'' Your image makes appropriate sounds, generates normal smells, and feels right to the touch. The spell gains the <<tag Auditory>> trait. The duration increases to 1 hour.
''Heightened (5th)'' As the 2nd-level version, but the duration is unlimited.
{{||SpellSummaryTable}}
You form an imaginary scene that includes up to 10 discrete creatures or objects of various sizes, all of which must be within the spell’s area.
These elements generate appropriate sounds and smells, and they feel right to the touch.
Elements of an illusory scene are incapable of speech.
Unlike with the [[Illusory Creature]] spell, creatures in your scene lack combat abilities and statistics.
Your scene doesn’t include changes to the environment around it, though you can place your scene within the illusory environment of a [[Hallucinatory Terrain]] spell.
When you create the scene, you can choose to have it be static or follow a program. Though a static scene is stationary, it includes basic natural movement. For example, wind blowing on an illusory piece of paper would rustle it. A program can be up to 1 minute long and repeats when finished. For instance, you could create a scene of two orcs fighting each other, and the fight would go the same way for each repetition. If you create a loop, the two fighters end up in the same place at the start of the scene and at the end of it, but you can smooth the program so it’s hard to tell when the loop ends and begins. Anyone observing the scene for more than a few minutes almost always notices it looping. You’re unable to alter the program after you create the illusion.
Any creature that touches any part of the image or uses the [[Seek]] action to examine it can attempt to disbelieve your illusion.
If they interact with a portion of the illusion, they disbelieve only that portion.
They disbelieve the entire scene only on a critical success.
''Heightened (6th)'' Creatures or objects in your scene can speak. You must speak the specific lines for each actor when creating your program. The spell disguises your voice for each actor.
''Heightened (8th)'' As the 6th-level version, and the duration is unlimited.
You can’t use any action with the <<tag Move>>trait.
If you’re immobilized by something holding you in place and an external force would move you out of your space, the force must succeed at a check against either the DC of the effect holding you in place or the relevant defense (usually [[Fortitude]] DC) of the monster holding you in place.
This flat iron bar is almost completely nondescript, except for one small button appearing on its surface.
''Activate'' {{OneAction}} [[Interact]]; You push the button to anchor the rod in place. It doesn’t move, defying gravity if need be. If the button is pushed again, the rod deactivates, ending the anchoring magic.
While anchored, the rod can be moved only if 8,000 pounds of pressure are applied to it or if a creature uses [[Athletics]] to [[Force Open]] the rod with a DC of 40 (though most intelligent creatures can just push the button to release the rod).
{{||SpellSummaryTable}}
The ground within the area transforms into a mass of dangerous briars that assault and impede your foes.
Each round when you [[Sustain the Spell|Sustain a Spell]], you can select one of the
following effects to occur in the area.
* ''Ensnare'' The briars clump around your foes, attempting to hold them in place. A foe within the area (or flying at most 20 feet above the area) must attempt a [[Reflex]] save. On a failure, it takes a –10-foot circumstance penalty to all [[Speed]]s for 1 round, and on a critical failure, it is [[Immobilized]] for 1 round unless it [[Escape]]s.
* ''Impede'' The briars twist and writhe, making the entire area [[Difficult Terrain]].
* ''Wall'' A [[Wall of Thorns]] appears in the area, lasting for 1 round. The wall is greater difficult terrain instead of difficult terrain.
In addition, once per round you can direct the briars to impale any target in the area (or flying up to 20 feet above the area) that you can see by using a single action, which has the <<tag Concentrate>> and <<tag Manipulate>> traits.
Make a spell attack roll. On a success, the target takes 10d6 piercing damage and takes a –10-foot circumstance penalty to all Speeds for 1 round; on a critical success, the target is [[Immobilized]] for 1 round unless it [[Escape]]s.
{{||SpellSummaryTable}}
You conjure a spike that thrusts up from the earth beneath a target creature, potentially impaling it.
The spike is made of [[Cold Iron]] and deals 8d6 piercing damage.
The target must attempt a [[Reflex]] save.
''Heightened (+1)'' The damage increases by 2d6.
{{||SaveSuccessTable}}
''Requirements'' You are wielding a melee weapon that deals piercing damage.
You impale your enemy and hold them in place with your weapon.
Make a melee [[Strike]] with the required weapon.
If the Strike hits and deals damage, your target is [[Grabbed]] until they successfully [[Escape]], you attack with the required weapon, or you [[Release]] the required weapon, whichever comes first.
When the target is no longer grabbed, they take persistent bleed damage equal to the number of weapon damage dice.
{{LOCGFeat}}
You refuse to let foes past your guard.
As long as you are in this stance, when you critically hit with an [[Attack of Opportunity]] triggered by a move action, you disrupt that move action.
''Prerequisites'' Master in [[Crafting]], [[Specialty Crafting]].
You craft flawless creations with great efficiency.
Whenever you roll a success at a Crafting check to make an item of the type you chose with Specialty Crafting, you get a critical success instead.
''Craft Requirements'' The initial raw materials must include 1,600 gp of adamantine.
Made of overlapping, lustrous black scales of standard-grade adamantine, this [[+2|Armor Potency]] greater [[Resilient]] [[Fortification]] [[Adamantine|Adamantine Armor]] scale mail seems to momentarily thicken at the point of impact when hit.
Whenever the armor’s fortification rune successfully turns a significant foe’s critical hit into a normal hit, one of the scales on the armor turns violet. You gain resistance to physical damage equal to the number of violet scales, to a maximum of 8.
At dawn each day, all the violet scales return to normal.
You create a disguise to pass yourself off as someone or something you are not.
Assembling a convincing disguise takes 10 minutes and requires a [[Disguise Kit]]. A simpler, quicker disguise might do the job if you’re not trying to imitate a specific individual, at the GM’s discretion. //If you have [[Quick Disguise]], it takes less time.//
In most cases, creatures have a chance to detect your deception only if they use the [[Seek]] action to attempt Perception checks against your Deception DC.
If you attempt to directly interact with someone while disguised, the GM rolls a secret Deception check for you against that creature’s Perception DC instead.
If you’re disguised as a specific individual, the GM might give creatures you interact with a circumstance bonus based on how well they know the person you’re imitating, or the GM might roll a secret Deception check even if you aren’t directly interacting with others.
{{||ActionSuccessTable}}
You become trained in [[Deception]] (or another skill if you’re already trained in Deception). You don’t require a disguise kit when attempting [[Deception]] checks to [[Impersonate]] a human. In addition, you gain a +4 circumstance bonus to Impersonate checks to pretend that you’re a human version of yourself, rather than an android. This bonus doesn’t apply to other checks to Impersonate humans.
''Requirements'' You are adjacent to a floor or vertical wall.
You find tiny holes or imperfections that no one else could see and try to somehow fit yourself through them, possibly moving directly through the wall or floor from one side to the other.
Your movement attempt fails if the wall or floor is made of something other than wood, plaster, or stone; is thicker than 10 feet; or contains even a thin layer of metal.
If you have a climb Speed, you can use this ability to attempt to move through a ceiling.
It seems impossible, but you’ve analyzed every angle and are able to just keep pulling out exactly the item you need, even in far-flung locations.
You can use [[Prescient Planner]] even if you have already used it after purchasing goods, and you can use it as a single action instead of a 2-action activity, during which you [[Interact]] to draw the item.
In addition, five times per day, you can use [[Prescient Planner]] to pull out a common consumable item up to 6 levels lower than your level.
{{||SpellSummaryTable}}
You crush the target by causing it to collapse in on itself, dealing 75 damage //with a basic Fortitude save//.
Each time you [[Sustain the Spell|Sustain a Spell]], you must choose a new target to be subject to the same effect.
The same creature can never be targeted more than once with a single casting of this spell.
You also can’t affect more than one creature per turn with implosion.
You can’t target a creature that’s incorporeal, gaseous, or liquid, or one that otherwise lacks a solid form.
''Heightened (+1)'' The damage increases by 10.
''Frequency'' once per day
''Trigger'' You would critically fail a skill check or suffer an effect with the <<tag Misfortune>> trait.
You shift the underlying fabric of reality to impose a baseline of order.
If the trigger was a skill check, you instead receive a result of 10 + your proficiency bonus (don’t apply any other bonuses, penalties, or modifiers).
If the trigger was an effect with the misfortune trait, the misfortune and fortune effects cancel each other out as normal, negating the triggering misfortune effect.
''Prerequisites'' [[Divine Ally]] (steed).
Under your care, your mount has realized its innate potential.
The mount you gained through the divine ally class feature is now a nimble or savage animal companion.
During an encounter, even if you don’t use the [[Command an Animal]] action, your mount can still use 1 action on your turn to Stride or Strike.
''Requirements'' You are wielding two melee weapons, each in a different hand.
You forgo precision to attack at an impossible speed.
Make three melee [[Strike]]s with each of the required weapons.
All of these Strikes take the maximum [[Multiple Attack Penalty]], as if you had already made two or more attacks this turn.
Your esoteric formulas are so unusual that they allow you to dabble in magic from diverse traditions that other bards don’t understand.
As long as you’re trained in [[Arcana]], you can add arcane spells to your book from [[Esoteric Polymath]]; as long as you’re trained in [[Nature]], you can add primal spells to your book; and as long as you are trained in [[Religion]], you can add divine spells to your book.
Like your other spells in your book, you can add one of these spells from another tradition to your repertoire as an occult spell each day using Esoteric Polymath, but you can’t retain any spells from another tradition when you prepare again, even if you have [[Eclectic Polymath]].
You can create endless shorter-lived snares, protecting your lair or using them against foes.
Once per minute, you can [[Craft]] one of the snares you’ve prepared for quick deployment without expending the prepared snare.
Once deployed, such a snare lasts for 10 minutes before losing its effectiveness.
Your attacks are swift and deadly beyond explanation.
Nothing can prevent you from making a [[Sneak Attack]], even if your opponent can see every blow coming.
Instead of dealing the damage from [[Sly Striker]], you can deal your full sneak attack damage to a target even if the target isn’t flat-footed.
''Trigger'' An enemy’s attack hits you or you fail a saving throw against an enemy’s ability.
''Requirements'' You are not armored or fatigued.
You execute a maneuver that defies possibility.
If the triggering effect was an enemy’s attack hitting you, the enemy rerolls the attack roll and uses the lower result.
If the triggering effect was you failing a saving throw, you reroll the saving throw and use the higher result.
''Requirements'' You are wielding a ranged weapon with the [[Volley]] trait and reload 0.
You fire a volley at all foes in an area.
Make one [[Strike]] with a –2 penalty against each enemy within a 10-foot-radius burst centered at or beyond your weapon’s volley range.
Roll the damage only once for all targets.
Each attack counts toward your multiple attack penalty, but do not increase your penalty until you have made all your attacks.
Hearing is an imprecise sense //for most creatures// —it cannot detect the full range of detail that a precise sense can.
You can usually sense a creature automatically with an imprecise sense, but it has the [[Hidden]] condition instead of the [[Observed]] condition.
It might be [[Undetected]] by you if it’s using [[Stealth]] or is in an environment that distorts the sense, such as a noisy room in the case of hearing. In those cases, you have to use the [[Seek]] basic action to detect the creature.
At best, an imprecise sense can be used to make an undetected creature (or one you didn’t even know was there) merely hidden—it can’t make the creature observed.
Pathfinder’s rules assume //by default// that a given creature has hearing as its only imprecise sense.
''Trigger'' You fall at least 10 feet and land on a solid surface.
You slam into the ground, shattering it around you.
Treat the fall as 10 feet shorter.
You land on your feet.
All adjacent spaces become [[Difficult Terrain]], and creatures in those spaces when you land take 5 bludgeoning damage as the debris hits them and are [[Flat-Footed]] until the start of their next turn.
You’ve trained your mount to become a powerful force on the battlefield.
The mount you gained through the Cavalier Dedication feat becomes a mature animal companion, granting it additional capabilities.
During an encounter, even if you don’t use the Command an Animal action, your animal companion can still use 1 action on your turn to [[Stride]] or [[Strike]].
''Prerequisites'' Trained in [[Performance]].
Your performances inspire admiration and win you fans.
You can [[Make an Impression]] using Performance instead of Diplomacy.
{{||SpellSummaryTable}}
You project psychic vibrations onto the target object, imprinting it with a short message or emotional theme of your design.
This imprinted sensation is revealed to a creature who casts [[Object Reading]] on the target object, replacing any emotional events the item was present for.
If the object is in the area of a [[Retrocognition]] spell, the imprinted messages appear as major events in the timeline, but they don’t interfere with any other visions.
If the object is targeted with [[Read Aura]] of a higher spell level than imprint message, the caster learns that the object has been magically modified.
When you Cast this Spell, any prior vibrations placed on an object by previous castings of imprint message fade.
{{||RitualSummaryTable}}
''Cost'' Reagents to construct the magical prison worth a total value of 800 gp times the target's level.
You perform a ritual to imprison a creature in one of several forms.
While some versions of this ritual offer all of the forms, others include only a single form or only a few of them.
Whichever form you use, the effect can’t be [[Counteract]]ed, though it can be ended by [[Freedom]]. Some forms of imprisonment can be ended by other means.
Because the ritual requires the target to remain within 10 feet at all times, it typically requires you to subdue the target first.
* ''Chains'' You bind the creature with chains, rendering it unable to use any actions other than to speak. Other creatures that attempt to approach, harm the chains, or free the trapped creature in any way must succeed at a [[Will]] save or be unable to do so forever. The chains have Hardness equal to 5 × the imprisonment ritual’s spell level, and double that many Hit Points. Destroying the chains frees the target.
* ''Prison'' You render the creature completely unable to leave a particular confined area or structure of your choice, such as a jail cell or sealed cave. The magic also prevents the creature from damaging its prison, either directly or indirectly, to break free. If the creature’s prison is entirely destroyed by some external force, the creature is freed, though for some larger or natural prisons, this might be unfeasible.
* ''Slumber'' (<<tag Sleep>> effect) You put the creature into an eternal sleep. It ceases aging and doesn’t require food or drink. A single sincere physical display of affection from a creature who genuinely loves the target—whether romantically, filially, or otherwise—frees it from the slumber. This form of imprisonment is also <<tag Enchantment>> magic.
* ''Temporal Stasis'' You send the creature into a state of suspended animation outside the flow of time. The creature doesn’t grow older and can’t be affected by any effect from within the normal timestream. While casting this ritual, you can optionally name any amount of time for the stasis; after this duration elapses, the stasis ends. Unlike other forms of imprisonment, temporal stasis can be [[Counteract]]ed by a [[Dispel Magic]] or [[Haste]] spell. This form of imprisonment is also <<tag Transmutation>> magic.
''Heightened (9th)'' You can use the object form of imprisonment in addition to the other options, and you can target a creature of up to 18th level. The base cost increases to 2,000 gp.
* ''Object (9th level or higher)'' You either shrink the creature to an inch in height or transform it into an insubstantial form whose body trails away into wisps below its head. Either way, you trap it inside a gem, jar, bottle, lamp, or similar container. The creature ceases aging and doesn’t require food or drink. The creature is still aware of its surroundings and can move within the container and speak, but it can’t use any other actions. Destroying the container kills the target rather than freeing it. This form of imprisonment is also <<tag Transmutation>> magic.
''Heightened (10th)'' You can use the object and oubliette forms of imprisonment in addition to the other options, and you can target a creature of up to 20th level. The base cost increases to 6,000 gp.
* ''Oubliette (10th level only)'' You entomb the target in a state of suspended animation deep beneath the surface of the ground and out of tune with reality so that it can’t be reached by any means. You also prevent <<tag Divination>>s from revealing the location where the imprisonment occurred. Powerful magic such as [[Wish]] can reveal the location of the imprisonment, but even such magic can’t free the target from the oubliette; only a 10th-level [[Freedom]] ritual can do so.
{{||ActionSuccessTable}}
Your mastery of alchemical secrets enables you to replicate effects most believe can be achieved only via magic.
Select a number of <<tag Potion>>s equal to your [[Intelligence]] modifier (minimum 1) of 9th level or lower.
You gain formulas to __create__ these potions as alchemical items with the <<tag Elixir>> trait.
When __making__ these alchemical elixirs, you can substitute alchemical reagents for an equal value of magical components, and you can use alchemist’s tools __(for [[Quick Alchemy]]) or an alchemist's lab (for the [[Craft]] activity)__ instead of any other required tool kits. Other than that, the formula does not change.
Once you’ve chosen the potion formulas, they can’t be changed.
''Prerequisites'' harmful font, evil alignment
Undead creatures find it all but impossible to resist your commands.
When you use [[Command Undead]], if the undead succeeds at its save but doesn’t critically succeed, it is your [[Minion]] for 1 round.
If the undead fails its save, it is your minion for 10 minutes.
If it critically fails, it is your minion for 24 hours.
You can direct excess channeled energy outward to benefit an ally.
You can grant the Hit Points you would regain from [[Communal]] Healing to any one creature within the range of your [[Heal]] spell instead of yourself.
You can also use Communal Healing when you target only yourself with a heal spell, though if you do, you must grant the additional healing to someone other than yourself.
Your weapon whirls and darts, striking foes whenever the opportunity presents itself.
At the start of each of your turns, you gain an additional reaction that you can use only to make a [[Dueling Riposte]].
You can use this extra reaction even if you are not benefiting from [[Dueling Parry]].
You gain resistance 10 from Elemental Bulwark instead of 5.
Your ability to elude danger is matchless.
Your proficiency rank for [[Reflex]] saves increases to legendary.
When you roll a critical failure on a Reflex save, you get a failure instead.
When you __roll a failure on__ a Reflex save against a damaging effect, you take half damage.
You find it easy to attract a powerful and unusual familiar to your side.
The number of abilities required to make your familiar a [[Specific Familiar]] is two lower than normal.
You’ve long held that fine-tuning the magic that bonds wizard and familiar can improve the mystic connection, compared to the safe yet generic bond most wizards currently use. You’ve formed such a pact with your familiar, gaining more advantages from it than most wizards.
You gain the [[Familiar (Feat)]] wizard feat as a bonus feat.
Your familiar gains an extra ability, and it gains an additional extra ability when you reach 6th, 12th, and 18th levels.
Your connection with your familiar alters your arcane bond class feature so that you store your magical energy in your familiar, rather than an item you own; you also gain the [[Drain Familiar]] free action instead of [[Drain Bonded Item]].
Drain Familiar can be used any time an ability would allow you to use Drain Bonded Item and functions identically, except that you draw magic from your familiar instead of an item.
Your extensive experience gives you even greater ability to adapt to each day’s challenges.
When you use [[Combat Flexibility]], you can gain two fighter feats instead of one.
While the first feat must still be 8th level or lower, the second feat can be up to 14th level, and you can use the first feat to meet the prerequisites of the second feat.
You must meet all of the feats’ prerequisites.
The monster can use [[Grab]] as a free action.
The monster still needs to spend an action to extend the duration for monsters it has already grabbed.
{{Grab}}
When you successfully [[Shove]] a creature, increase both the distance you can push the creature and the distance you can move to follow along with the target by 5 feet on a success or 10 feet on a critical success.
If you push the target into an obstacle, it takes bludgeoning damage equal to 6 plus your [[Strength]] modifier, or 8 plus your Strength modifier if you have legendary proficiency in [[Athletics]].
You can dash your foe to the ground with a single blow.
When you use [[Knockdown (Fighter)]], instead of making a [[Strike]] followed by a [[Trip]], you can attempt a single Strike.
If you do and your Strike hits, you also apply the critical success effect of a Trip. If you used a two-handed melee weapon for the Strike, you can use the weapon’s damage die size instead of the regular die size for the damage from a critical Trip.
The monster can use [[Knockdown (Monster)]] as a free action.
{{Knockdown (Monster)}}
You deliver poisons in ways that maximize their harmful effects.
When you apply a simple poison with [[Poison Weapon]], the poison deals 2d4 poison damage instead of 1d4 poison damage.
You don’t waste a poison you apply with Poison Weapon on a critically failed attack roll.
The monster can use [[Push]] as a free action.
{{Push}}
Your shield can help save nearby allies.
When you use [[Shield Block]] against damage resulting from a [[Reflex]] save, adjacent allies who would take damage due to [[Reflex]] saves against the same effect also benefit from the damage reduction.
You easily banish creatures with your weapon.
You can use [[Swift Banishment]] as long as you have a spell slot of 5th level or higher remaining, even if you don’t have [[Banishment]] prepared.
You must sacrifice a prepared spell of 5th level or higher, and the banishment effect you create is heightened to the level of that spell.
Your weapon serves as the special material component of banishment, causing the target to take the –2 penalty to its save against any banishment you cast using [[Swift Banishment]].
Your weapons are a blur, blocking and biting at your foes.
At the start of each of your turns, you gain an additional reaction that you can use only to perform a [[Twin Riposte]].
You can use this extra reaction even if you are not benefiting from Twin Parry.
You are always prepared for fights that frequently disrupt seemingly peaceful times.
When you use an improvised weapon or a [[Shoddy]] weapon, you don’t take the –2 item penalty to attack rolls.
When you use an improvised weapon, you apply the [[Critical Specialization]] of a brawling weapon to it.
Depending on the shape and nature of the improvised weapon, your GM might determine another weapon group’s critical specialization is more appropriate.
You can jury-rig solutions when you don’t have the proper tools on hand. You can attempt to [[Repair]] damaged items without a repair kit.
If you have the raw materials available, you can [[Craft]] a basic caltrop set, candle, compass, crowbar, fishing tackle, flint and steel, hammer, ladder, piton, rope, 10-foot pole, replacement thieves’ picks, long or short tool, or torch without consulting a basic crafter’s book.
You can apply critical specialization effects to improvised weapons you wield.
For any given improvised weapon, the GM determines which critical specialization effect is most applicable, based on the type of object it is.
''Requirements'' You are wielding an improvised weapon.
You make a [[Strike]] with your wielded improvised weapon.
You gain a +1 item bonus to the attack roll, and the [[Strike]] deals two weapon damage dice if it would have dealt fewer.
If the attack is a critical hit, in addition to the effect of the critical hit, the improvised weapon breaks. If the item has a Hardness greater than your level, or if it’s an artifact, cursed item, or other item that’s difficult to break or destroy, the item doesn’t break and the attack is a hit instead of a critical hit.
At 12th level, your item bonus to the attack roll increases to +2 instead of +1, and at 16th level, the Strike deals three weapon damage dice if it would have dealt fewer, instead of two.
You are skilled at making quick fixes to damaged equipment, but your fixes aren’t meant to last forever.
You make a quick repair to a broken non-magical item in your possession.
Until the item takes damage again, you can still use it as a [[Shoddy]] item of its type.
This repair restores no Hit Points, so the item is easy to destroy.
Once the item is [[Repair]]ed normally such that it is no longer [[Broken]], it is also no longer shoddy.
An ability with this trait can take a character completely out of the fight or even kill them, and it’s harder to use on a more powerful character.
If a spell has the incapacitation trait, any creature of more than twice the spell’s level treats the result of their check to prevent being incapacitated as one degree of success better or the result of any check the spellcaster made to incapacitate them as one degree of success worse.
If any other effect has the incapacitation trait, a creature of higher level than the item, creature, or hazard generating the effect gains the same benefits.
{{||SpellSummaryTable}}
You surround yourself with a combustible aura.
Each time a creature within the emanation takes <<tag Fire>>damage, it catches on fire, taking 2d4 [[persistent|Persistent Damage]] fire damage.
''Heightened (+2)'' Increase the persistent damage by 1d4 and the radius of the emanation by 5 feet.
An incline is an area so steep that you need to [[Climb]] using the Athletics skill in order to progress upward.
You’re [[Flat-Footed]] when Climbing an incline. //(You would normally be flat-footed when Climbing.)//
An incorporeal creature or object has no physical form.
It can pass through solid objects, including walls.
When inside an object, an incorporeal creature can’t perceive, attack, or interact with anything outside the object, and if it starts its turn in an object, it is [[Slowed]] 1.
Corporeal creatures can pass through an incorporeal creature, but they can’t end their movement in its space.
An incorporeal creature can’t attempt [[Strength]]-based checks against physical creatures or objects—only against incorporeal ones—unless those objects have the [[Ghost Touch]] property rune. Likewise, a corporeal creature can’t attempt Strength-based checks against incorporeal creatures or objects.
Incorporeal creatures usually have immunity to effects or conditions that require a physical body, like disease, poison, and precision damage. They usually have resistance against all damage (except force damage and damage from Strikes with the ghost touch property rune), with double the resistance against non-magical damage.
By spending a moment to focus, you can ensure your attack strikes true.
Make a ranged weapon Strike.
On this [[Strike]], you gain a +2 circumstance bonus to the attack roll and ignore the target’s [[Concealed]] condition.
Your mature animal companions continue to grow and develop.
They each become nimble or savage animal companions (your choice, choose for each companion, including those that become mature after you take this feat), gaining additional capabilities determined by the type of companion.
Your animal companion continues to grow and develop.
It becomes a nimble or savage animal companion (your choice), gaining additional capabilities determined by the type of companion.
Your familiar is infused with even more magic than other familiars.
You can select six familiar or master abilities each day, instead of four.
Given time to collect yourself after a near-death scrape, you can rebuild your ferocity and withstand additional finishing blows.
You can use [[Orc Ferocity]] with a frequency of once per hour, rather than once per day.
''Frequency'' once per day
''Trigger'' You attempt a check using a skill you’re untrained in.
A stroke of brilliance gives you a major advantage with a skill despite your inexperience.
Gain a +4 circumstance bonus to the triggering skill check.
You react more quickly than others can.
You gain a +2 circumstance bonus to [[Initiative]] rolls.
''Prerequisites'' [[Charisma]] 16.
You have an incredible ability to invest more magic items.
Increase your limit on [[Invested]] items from 10 to 12.
Even other halflings consider you to be particularly lucky.
You can use [[Halfling Luck]] once per hour, rather than once per day.
If you have [[Guiding Luck]], you can still use Halfling Luck when you fail a [[Perception]] check or attack roll only once per day (though you can use it within the same hour that you used Halfling Luck), and if you have [[Helpful Halfling]], you can still use Halfling Luck on an ally instead of yourself only once per day.
//The latter text probably means [[Share Luck]], not Helpful Halfling.//
Under your care and training, your mount has realized its innate potential.
The mount you gained through the Cavalier Dedication feat becomes a nimble or savage animal companion (your choice), gaining additional capabilities determined by the type of companion.
You move like the wind.
You gain a +10-foot status bonus to your Speed whenever you’re not wearing armor.
The bonus increases by 5 feet for every 4 levels you have beyond 3rd.
After your first shot singles out your opponent’s position, you direct another that ricochets around obstacles and strikes unerringly.
Make a ranged weapon [[Strike]] __against a creature you previously attacked this turn__.
You ignore the target’s [[Concealed]] condition and all [[Cover]].
When you scout, you are particularly alert for danger, granting your allies precious moments to prepare to fight.
When using the [[Scout]] exploration activity, you grant your allies a +2 circumstance bonus to their initiative rolls instead of a +1 circumstance bonus.
You notice things that are almost impossible for an ordinary person to detect.
Your proficiency rank for [[Perception]] increases to legendary.
{{||SpellSummaryTable}}
You can’t be affected by anything unless you choose to be.
For the duration of the spell, you are immune to any effect or damage that would harm you, excluding effects caused by artifacts, deific power, and similarly powerful sources.
You can still be affected by anything you’re willing to have affect you.
__This condition reflects a creature’s disposition toward a particular character, and only supernatural effects (like a spell) can impose these conditions on player characters.__
A creature that is indifferent to a character doesn’t really care one way or the other about
that character.
Assume a creature’s attitude to a given character is indifferent unless specified otherwise.
Your rage makes it difficult to control you.
Your proficiency rank for [[Will]] saves increases to master.
When you roll a success on a Will save, you get a critical success instead.
Favored by spies and tricksters, an infiltrator’s elixir is used to alter your appearance.
When imbibed, you take the shape of a humanoid creature of your size, but different enough so you might be unrecognizable. If you aren’t a humanoid, you might take on a form more similar to your own, at the GM’s discretion.
The creator of the elixir decides the basics of the appearance you transform into when you imbibe the elixir, including eye color, skin tone, and hair color. The elixir can’t change your form into that of a specific person.
After the form takes hold, you retain it for the next 10 minutes.
Drinking this elixir counts as setting up a disguise to [[Impersonate]]. You gain a +4 status bonus to your [[Deception]] DC to avoid others seeing through your disguise, and you add your level to this DC even if untrained.
You’ve found a way to prepare a spell slot that exists in your mind as many different possibilities at once.
Once during your daily preparations, you can use a spell slot to hold that infinite potential, rather than using it to prepare a spell.
You can use this spell slot to cast any spell from your spellbook that’s at least 2 levels lower than the slot you designate; the spell acts in all ways as a spell of 2 levels lower.
You don’t have any particular spell prepared in that slot until you cast it.
With patience and time, you can make bird calls, leave game trails, and ultimately influence the behavior of a certain type of animals in the region to favor and even aid you in the days to come.
The GM determines the DC of any check required and the amount of time your work requires (usually at least a day or two of downtime).
While you can’t directly control how you’ve influenced nature, you can hope for certain effects, such as easier hunts or birds falling silent whenever danger is approaching.
If you’re legendary in [[Nature]], you can elicit these same adjustments to animal behavior in the area by spending only 10 minutes.
You can use the [[Diplomacy]] skill to perform the special downtime activity Influence Rumor, spending at least one day of downtime to manipulate the course, tone, or content of a rumor to your benefit.
The difficulty of Influencing a Rumor is determined by the GM based on the size of the community, the relative perceptiveness of the inhabitants, and the agency of other rumormongers, but it typically starts with at least DC 15 for a small village and increases to at least DC 20 for a town, at ast DC 30 for a city, and at least DC 40 for a metropolis.
You infuse reagents with your own alchemical essence, allowing you to create alchemical items at no cost.
Each day during your [[daily preparations|Rest]], you gain a number of batches of infused reagents equal to your level + your Intelligence modifier.
You can use these reagents for either advanced alchemy or [[Quick Alchemy]].
Together, these infused reagents have light [[Bulk]].
As soon as you make your next daily preparations, your infused reagents from the previous day’s preparations are instantly destroyed, and nonpermanent effects of your previous day’s infused items immediately end.
While infused reagents are physical objects, they can’t be duplicated, preserved, or created in any way other than your daily preparations. Any such artificial reagents lack the infusion and are useless for advanced alchemy or Quick Alchemy.
Your body is capable of recycling its own air.
When you [[hold your breath|Suffocating]], you can do so for an additional hour.
At the end of this hour, your body needs to rest before it can recycle air again. This rest requires 10 minutes of exposure to breathable air.
You can call the fire inside you into the palm of your hand.
You can cast the [[Produce Flame]] cantrip as an innate primal or arcane spell at will. A cantrip is heightened to a spell level equal to half your level rounded up.
Your strength is part of your rage, so as long as your anger remains, you can gather your strength and rage to overcome any sort of enfeeblement.
You reduce your [[Enfeebled]] condition’s value by 1.
Halflings have been unobtrusive assistants of larger folk for untold ages, and your people count on this assumption of innocence.
You gain the trained proficiency rank in [[Deception]] (or another skill of your choice, if you’re already trained in Deception).
If you fail a Deception check to [[Create a Diversion]], humanoid creatures aren’t aware that you were trying to trick them unless you get a critical failure on your roll.
You have practice combating plague, and your patients are less likely to succumb to the same disease again for a time.
When you successfully [[Treat Disease]] on someone and they fully recover from the disease, they gain a +2 circumstance bonus to saving throws against that same disease for 1 week.
Your nanites reject diseases with ease.
Each time you succeed at a Fortitude save against an ongoing disease, you reduce its stage by 2, or by 1 against a virulent disease. Each critical success you achieve against an ongoing disease reduces its stage by 3, or by 2 against a virulent disease.
{{||SpellSummaryTable}}
You envision a simple bug and transform into a Medium animal battle form.
When you cast this spell, choose ant, beetle, centipede, mantis, scorpion, or spider. You can decide the specific type of animal (such as such as a ladybug or scarab for beetle), but this has no effect on the form’s Size or statistics.
While in this form, you gain the <<tag Animal>> trait.
You can [[Dismiss]] this spell.
{{BattleFormRestrictions}}
You gain the following statistics and abilities regardless of which battle form you choose:
* AC = 18 + your level. Ignore your armor’s check penalty and Speed reduction.
* 10 temporary Hit Points.
* [[Low-Light Vision]].
* One or more attacks specific to the battle form you choose, which are the only attacks you can use. You’re trained with them. Your attack modifier is +13, and your damage bonus is +2. These attacks are [[Strength]] based (for the purpose of the [[Enfeebled]] condition). If your unarmed attack modifier is higher, you can use it instead.
* [[Athletics]] modifier of +13, unless your own is higher.
You also gain specific abilities based on the form you choose:
* ''Ant'' Speed 30 feet, climb Speed 30 feet; Melee {{OneAction}} mandibles, Damage 2d6 bludgeoning.
* ''Beetle'' Speed 25 feet; Melee {{OneAction}} mandibles, Damage 2d10 bludgeoning.
* ''Centipede'' Speed 25 feet, climb Speed 25 feet; [[Darkvision]]; Melee {{OneAction}} mandibles, Damage 1d8 piercing plus 1d4 persistent poison.
* ''Mantis'' Speed 40 feet; imprecise scent 30 feet; Melee {{OneAction}} foreleg, Damage 2d8 bludgeoning.
* ''Scorpion'' Speed 40 feet; [[Darkvision]], imprecise [[Tremorsense]] 60 feet; Melee {{OneAction}} stinger, Damage 1d8 piercing plus 1d4 persistent poison; Melee {{OneAction}} pincer ([[Agile]]), Damage 1d6 bludgeoning.
* ''Spider'' [[Darkvision]]; Melee {{OneAction}} fangs, Damage 1d6 piercing plus 1d4 persistent poison; Melee {{OneAction}} Speed 25 feet, climb Speed 25 feet; Ranged {{OneAction}} web (range increment 20 feet), Damage entangles the target for 1 round. //There is no description of what "entangling a target" does, but it likely makes them [[Immobilized]].//
''Heightened (4th)'' Your battle form is Large, and your attacks have 10-foot reach. You must have enough space to expand into or the spell is lost. You instead gain 15 temporary HP, attack modifier +16, damage bonus +6, and Athletics +16.
Heightened (5th) Your battle form is Huge, and your attacks have 15-foot reach. You must have enough space to expand into or the spell is lost. You instead gain 20 temporary HP, attack modifier +18, damage bonus +2 and double damage dice (including persistent damage), and Athletics +20.
Your understanding of life expands, allowing you to mimic a wider range of creatures.
Add the forms in [[Insect Form]] to your [[Wild Shape]] list.
Whenever you use wild shape to polymorph into the non-flying insect form listed in [[Pest Form]], the duration is 24 hours instead of 10 minutes.
Your connection to your muse has granted you unusual focus.
If you have spent at least 2 Focus Points since the last time you Refocused, you recover 2 Focus Points when you [[Refocus]] instead of 1.
You gain the [[Inspire Courage]] composition cantrip.
{{||SpellSummaryTable}}
''Prerequisite'' [[Maestro Muse]].
Your encouragement inspires your ally to succeed at a task.
This counts as having taken sufficient preparatory actions to [[Aid]] your ally on a skill check of your choice, regardless of the circumstances.
When you later use the Aid reaction, you can roll [[Performane]] instead of the normal skill check, and if you roll a failure, you get a success instead.
If you are legendary in Performance, you automatically critically succeed.
The GM might rule that you can’t use this ability if the act of encouraging your ally would interfere with the skill check (such as a check to [[Sneak]] quietly or maintain a disguise).
{{||SpellSummaryTable}}
You inspire your allies with words or tunes of encouragement.
You and all allies in the area gain a +1 status bonus to attack rolls, damage rolls, and saves against <<tag Fear>> effects.
{{||SpellSummaryTable}}
''Prerequisite'' [[Maestro Muse]].
You inspire your allies to protect themselves more effectively.
You and all allies in the area gain a +1 status bonus to AC and saving throws, as well as resistance equal to half the spell’s level to physical damage.
{{||SpellSummaryTable}}
You call upon your muse to greatly increase the benefits you provide to your allies with your [[Inspire Courage]], [[Inspire Defense]] //or [[Song of Strength]]// composition.
If your next action is to cast inspire courage or inspire defense, attempt a [[Performance]] check. The DC is usually a very hard DC of a level equal to that of the highest-level target of your composition, but the GM can assign a different DC based on the circumstances.
The effect of your inspire courage or inspire defense composition depends on the result of your check.
{{||ActionSuccessTable}}
Your own actions inspire your allies to great achievements.
Whenever you critically succeed at a skill check, you automatically qualify to use the [[Aid]] reaction when attempting to help an ally using the same skill, even without spending an action to prepare to do so.
''Trigger'' One of the required allies is about to attempt an attack roll or skill check.
''Requirements'' You spent 10 minutes during your daily preparations reviewing stratagems for the day’s adventures with up to four allies.
You quickly advise your ally, using your earlier planning to make sure luck can’t throw a wrench in the cogs of your schemes.
The ally rolls the triggering check twice and takes the better of the two results.
That ally then becomes temporarily immune to your Inspired Stratagem until your next daily preparations.
You become a brilliant example of dedication and poise in battle, encouraging your allies to follow suit.
When you spend this action, attempt a [[Diplomacy]] check. The DC is usually a standard difficulty DC of your level, but the GM can assign a different DC based on the circumstances. The effect depends on the result of your check.
{{||ActionSuccessTable}}
''Frequency'' once per day
''Trigger'' You [[Disable|Disable a Device]] a hazard.
''Requirements'' The hazard isn’t broken.
You awaken a spirit of creation within the hazard.
You learn the hazard’s effects.
Once in the next 10 minutes, when you observe a creature take an action that would trigger one of the hazard’s reactions or free actions if you hadn’t Disabled it, you can use a reaction to rearm the hazard, causing the observed creature to trigger it immediately.
This metal cube is small enough to fit in your palm. Close inspection reveals fine lines in the dark gray metal, as though the cube were folded thousands of times.
''Activate'' {{ThreeAction}} command, [[Interact]]; ''Effect'' You toss the cube on the ground, and it immediately unfolds into an [[Adamantine]] fortress. The fortress is 20 feet square and 30 feet high, with adamantine stairs leading up to three sets of battlements at heights of 10 feet and 20 feet and at the top.
Arrow slits along the lower battlements and crenelations at the top provide standard cover to anyone within the fortress.
There’s no roof, leaving an open, 10-foot-square vertical shaft through the center of the structure.
As a magical structure, the fortress has the <<tag Structure>> trait.
Because it expands outward, the fortress can’t catch creatures inside it as a magical structure normally does. Instead, it pushes those creatures back. It can’t push a creature into a surface or hazard this way, and stops expanding if that would happen.
The fortress has a single door in the center of one wall on the ground level, and the door appears directly in front of you when you activate the fortress.
Provided you’re within 100 feet of the door, you can cause the door to open or slam shut and lock by spending a single action to issue a verbal command, which has the <<tag Auditory>> trait.
The DC to [[Force Open]] the door or [[Pick its Lock|Pick a Lock]] is 40.
You can instantly return the instant fortress to its cube form by spending a single action to issue a verbal command, which has the <<tag Auditory>> trait.
Once deactivated, the fortress can’t be activated again for 4 hours.
If the fortress becomes damaged, it can be repaired only with a [[Remake]] spell or by someone who is legendary at [[Crafting]].
You distract your opponent with a few choice words or a rude gesture.
Choose a target within 30 feet.
It’s [[Flat-Footed]] against your attacks until the end of your next turn.
Depending on the way you describe your distraction, this action gains either the <<tag Auditory>> or <<tag Visual>> trait.
You gain the instinct ability for the instinct you chose for Barbarian Dedication.
''Prerequisites'' at least one arcane or occult innate spell gained from a gnome heritage or gnome ancestry feat.
''Frequency'' once per day.
''Trigger'' You are attacked by a foe.
The magic within you manifests as a natural reaction to threats.
You gain the effects of [[Mirror Image]] but with two images instead of three.
The tradition of this action matches the tradition of your gnome ancestry options.
''Prerequisites'' [[Acute Scent]] or precise or imprecise scent.
You trust your instincts and your sense of smell, using all of your senses to pinpoint your opponent’s location.
Make a melee [[Strike]] against an opponent that isn’t hiding its scent with an effect like [[Negate Aroma]].
This attack ignores any flat check required due to the target being [[Concealed]] or [[Hidden]].
''Prerequisites'' [[Blade Ally|Divine Ally]], tenets of evil.
Your blade ally thirsts for the blood of your foes.
Whenever you critically hit an enemy with the weapon inhabited by your blade ally while dealing extra damage from your champion’s reaction, the target takes persistent bleed damage equal to two of the weapon’s damage dice.
''Prerequisites'' [[Divine Ally]] (blade), tenets of good.
Divine energy fills your weapon.
Whenever you critically hit a foe with __[[Blade of Justice]]__ or a [[Retributive Strike]], your attack adds an extra damage die, and the target is [[Slowed]] 1 on its next turn.
Intelligence measures how well your character can learn and reason.
A high Intelligence allows your character to analyze situations and understand patterns, and it means they can become trained in additional skills and might be able to master additional languages.
//Intelligence governs [[Arcana]], [[Crafting]], [[Lore]], [[Occultism]] and [[Society]].//
//Being [[Stupefied]], [[Sickened]] or [[Frightened]] reduces your Intelligence rolls.//
{{||StatModSummary}}
You use your hand or hands to manipulate an object or the terrain.
You can grab an unattended or stored object, open a door, or produce some similar effect.
You might have to attempt a skill check to determine if your Interact action was successful.
//You can use Interact to shake awake someone who's [[Unconscious]].//
''Frequency'' once per day
''Requirements'' You’re afflicted by a disease or poison, or are taking persistent damage.
Your ordered physiology rejects unwelcome elements. Choose one.
''Disease or Poison'' Attempt a saving throw against the [[Affliction]] at its current stage. On a failure, the affliction’s stage doesn’t increase, but you suffer the effects of the stage you were already on. On a critical failure, the stage only increases by 1.
''Persistent Damage'' Attempt a DC 10 flat check to recover from the [[Persistent Damage]].
Axis’s order suffuses your body and helps it maintain coherency.
You and your allies can [[Treat your Wounds|Treat Wounds]] without healer’s tools.
Once per day, when someone rolls a failure or a critical failure on a check to Treat your Wounds, you can focus on your internal cohesion to increase the degree of success by one step.
You can hide a small object of up to light Bulk inside a hollow cavity on one of your forearms.
It takes three [[Interact]] actions to store an object in this way.
You gain a +4 circumstance bonus to the DCs of checks for others to [[Seek]] or [[Steal]] objects stored inside your arm.
If you store a weapon in your arm, you can use a single action to [[Interact]] to draw the weapon into the hand corresponding to your internal cavity, then [[Strike]] with the weapon.
Your body can internally synthesize oxygen for limited periods of time.
When you hold your breath, you can do so for an additional hour due to your internal air reservoirs. At the end of this hour, your air reservoirs are expended.
Refilling your empty air reservoirs takes 10 minutes of exposure to breathable air.
People can’t help but trust you, whether through your inherent likableness or your firm insistence on sticking to the truth. You have a way about you that gets others talking, and you’ve developed interrogative techniques to help you get to the truth of your investigations.
You are trained in [[Diplomacy]]. You gain the [[No Cause for Alarm]] skill feat.
You can also [[Pursue a Lead]] over the course of a conversation rather than spending dedicated time looking into the lead, provided the conversation lasts 1 minute or longer. For example, while trying to [[Make an Impression]], you could pursue the creature you’re conversing with as a lead, and you could Pursue a Lead about an object while someone is telling you information about that object.
You also gain the [[Pointed Question]] action.
{{||SpellSummaryTable}}
You call upon the frigid depths of outer space to bring a terrible chill to your enemy.
The target is cloaked in the freezing void, which deals 3d6 <<tag Cold>> damage immediately and when you [[Sustain the Spell|Sustain a Spell]] on future turns, with a basic [[Fortitude]] save.
The target is [[Fatigued]] for as long as the effect persists.
''Heightened (+1)'' The cold damage increases by 1d6.
''Prerequisites'' [[Dispel Magic]] in your spell repertoire.
You weave dispelling energy into a spell, sending both effects at a foe.
If your next action is to cast a single-target spell against a creature, and you either hit the foe with the spell attack roll or the foe fails its saving throw, you can cast [[Dispel Magic]] on the foe as a free action, expending a spell slot as normal and targeting one spell effect affecting the foe.
''Prerequisites'' Trained in [[Intimidation]].
You can [[Demoralize]] with a mere glare.
When you do, Demoralize loses the [[Auditory]] trait and gains the [[Visual]] trait, and you don’t take a penalty if the creature doesn’t understand your language.
''Prerequisites'' [[Strength]] 16, Expert in [[Intimidation]].
In situations where you can physically menace the target when you [[Coerce]] or [[Demoralize]], you gain a +1 circumstance bonus to your [[Intimidation]] check and you ignore the penalty for not sharing a language.
If your Strength score is 20 or higher and you are a master in Intimidation, this bonus increases to +2.
Your blow not only wounds creatures but also shatters their confidence.
Make a melee [[Strike]].
If you hit and deal damage, the target is [[Frightened]] 1, or frightened 2 on a critical hit.
''Key Ability'' [[Charisma]].
You bend others to your will using threats.
{{||SkillActionList}}
{{||SkillFeatList}}
{{LOCGFeat}}
You are accustomed to working alongside others, relying on each other to get by.
You gain a +2 circumstance bonus to checks to [[Aid]], and your allies gain a +2 circumstance bonus to checks to Aid you.
Your affinity with process and order makes you a natural artisan.
You gain the trained proficiency rank in [[Crafting]] (or another skill of your choice, if you’re already trained in Crafting).
You gain the [[Specialty Crafting]] skill feat in a specialty of your choice.
''Frequency'' once per day.
''Trigger'' Your turn begins.
Illusion magic comes to you so naturally that you can effortlessly sustain your magical ruses.
You immediately gain the effects of a [[Sustain a Spell]] action to extend the duration of one of your active <<tag Illusion>> spells.
You gain poison resistance equal to half your level (minimum 1). Furthermore, you can survive outside of water for 72 hours before you begin to suffocate.
{{||RitualSummaryTable}}
''Cost'' Rare oils worth a total value of 10 gp times the target's level.
You win over the target’s mind, causing it to see you as a close and trusted friend and look upon your every suggestion as reasonable.
The target is [[Helpful]] toward you, so it will go out of its way to help you. As with any other helpful creature, there are limits to what you can ask of it. If you ever ask the target to do something completely against its nature or needlessly harmful to the target or its interests, not only does it refuse, but it also can attempt a [[Will]] save to end the effect early.
Because of the casting time and range, it’s generally difficult to cast this ritual unless the target is willing (perhaps convinced the ritual will have some other effect) or [[Restrained]].
If the creature is unwilling to accept the ritual, it can attempt a [[Will]] save to negate the effect.
{{||ActionSuccessTable}}
''Heightened (6th)'' You can use inveigle on a creature up to 1 mile away throughout the casting, as long as you have a lock of hair, a drop of blood, or some other piece of the creature’s body, which you mix into the oils used in the cost. The base cost increases to 100 gp. The duration is shorter than normal, based on how large a piece of the creature’s body you use. Blood, hair, scales, and the like cause the ritual to last 1 week, while a hand or other substantial body part causes the ritual to last 1 month.
''Prerequisites'' trained in [[Crafting]].
You can jury-rig your weapons to perform in unexpected ways.
When you use this ability, add one of the following weapon traits to a melee weapon you wield: [[Deadly]] d6, [[Disarm]], [[Nonlethal]], [[Shove]], [[Trip]], [[Versatile]] B, versatile P, or versatile S.
You cannot add a trait that the weapon already has.
The weapon retains this trait until you a successfully hit and deal damage with the weapon.
The weapon retains this trait only while you wield it, and you can have only one weapon modified in this way at any time.
If you have expert proficiency in Crafting, you can use this feat as a 2-action activity. If you have legendary proficiency in Crafting, you can apply two weapon traits from the list when using this feat.
''Prerequisites'' Master in [[Crafting]].
You are a genius at Crafting, easily able to determine how things are made and create new inventions.
You can spend downtime to invent a common [[Formula]] that you don’t know.
This works just like the [[Craft]] activity: you spend half the Price of the formula up front, attempt a Crafting check, and on a success either finish the formula by paying the difference or work for longer to decrease the Price.
The difference is that you spend the additional time in research, design, and development, rather than in creating an item.
Once it’s complete, you add the new formula you invented to your formula book.
You seek out information about your surroundings while traveling at half speed.
You use [[Recall Knowledge]] as a secret check to discover clues among the various things you can see and engage with as you journey along.
You can use any skill that has a Recall Knowledge action while Investigating, but the GM determines whether the skill is relevant to the clues you could find.
As with Searching or Detecting Magic, the initial result of Investigating is usually enough to give the investigator a clue that leads into a more thorough examination, but it rarely gives all possible information. For instance, a character might note that the walls of a dungeon are covered with Abyssal writing, but they would need to stop to read the text or determine that it’s written in blood.
!! Splats
<$list filter="[tag<currentTiddler>tag[Splat]]" />
!! Class Features
| !Level | !Features |
| 1 | On the Case ([[Pursue a Lead]] and [[Clue In]]), [[Devise a Stratagem]], [[Strategic Strike]] 1d6 |
| 2 | Extra Skill Increase (Expert) |
| 3 | [[Keen Recollection]], [[Skillful Lesson]] |
| 4 | Extra Skill Increase (Expert) |
| 5 | [[Skillful Lesson]], [[Strategic Strike]] 2d6, [[Weapon Expertise]] |
| 6 | Extra Skill Increase (Expert) |
| 7 | [[Skillful Lesson]], [[Vigilant Senses]], [[Weapon Specialization]] |
| 8 | Extra Skill Increase (Master) |
| 9 | [[Great Fortitude]], [[Investigator Expertise]], [[Skillful Lesson]], [[Strategic Strike]] 3d6 |
| 10 | Extra Skill Increase (Master) |
| 11 | [[Deductive Improvisation]], [[Resolve]], [[Skillful Lesson]] |
| 12 | Extra Skill Increase (Master) |
| 13 | [[Incredible Senses]], [[Light Armor Expertise]], [[Skillful Lesson]], [[Strategic Strike]] 4d6, [[Weapon Mastery]] |
| 14 | Extra Skill Increase (Master) |
| 15 | [[Evasion]], [[Greater Weapon Specialization]], [[Skillful Lesson]] |
| 16 | Extra Skill Increase (Legendary) |
| 17 | [[Greater Resolve]], [[Skillful Lesson]], [[Strategic Strike]] 5d6 |
| 18 | Extra Skill Increase (Legendary) |
| 19 | [[Light Armor Mastery]], [[Master Detective]], [[Skillful Lesson]] |
| 20 | Extra Skill Increase (Legendary) |
!! Class Feats
{{||ClassFeatList}}
You’ve refined your investigative techniques to an exceptional degree.
Your circumstance bonus from [[Pursue a Lead]] increases to +2.
Your proficiency rank for your investigator class DC increases to expert.
''Frequency'' once per hour
''Trigger'' A creature within 60 feet gains the [[Frightened]] condition.
You are invigorated by the shock of a prank or the thrum of terror.
You gain temporary Hit Points equal to the creature’s level or 3, whichever is higher.
Your divine touch rejuvenates the weak and tired.
When you use [[Mercy]], you can instead attempt a [[Counteract]] Check to remove the [[Clumsy]] or [[Enfeebled]] conditions, using the source of that condition to determine the counteract level and DC.
If the condition was caused by an ongoing effect and you don’t remove that effect, the condition returns at the end of your next turn.
The fortifying additives you brew into your mutagens make your juggernaut form impervious.
Whenever you’re affected by a [[Juggernaut Mutagen]], you gain resistance to all physical damage equal to your Intelligence modifier (minimum 0).
{{||SpellSummaryTable}}
Cloaked in illusion, the target becomes [[Invisible]].
This makes it [[Undetected]] to all creatures //who have vision as their precise sense//, though the creatures can attempt to find the target, making it [[Hidden]] to them instead.
If the target uses a [[Hostile Action]], the spell ends after that hostile action is completed.
''Heightened (4th)'' The spell lasts 1 minute, but it doesn’t end if the target uses a hostile action.
''Usage'' etched onto light armor.
Light seems to partially penetrate this armor.
''Activate'' {{OneAction}} command; ''Frequency'' once per day; ''Effect'' Whispering the command word, you become invisible for 1 minute, gaining the effects of a 2nd level [[Invisibility]] spell.
''Craft Requirements'' Supply one casting of [[Invisibility]].
| !Type | !Level | !Price | !Frequency |
| (standard) | 8 | 5000 | Once per day |
| Greater | 10 | 10000 | Three times per day |
{{||SpellSummaryTable}}
You become [[Invisible]], with the same restrictions as the 2nd-level [[Invisibility]] spell.
''Heightened (6th)'' The duration increases to 10 minutes.
''Heightened (8th)'' The duration increases to 1 hour.
An invisibility potion is colorless and oddly lightweight.
Upon drinking it, you gain the effects of a 2nd-level [[Invisibility]] spell.
{{||SpellSummaryTable}}
You and all targets are [[Invisible]] except to each other as long as you remain within the spell’s area.
If a creature made invisible by this spell leaves the spell’s area, it becomes visible and remains so even if it returns to the spell’s area.
If any creature made invisible by this spell uses a [[Hostile Action]], the spell ends after the hostile action is completed.
While exploring, it’s easy to move together slowly and remain invisible. This is untenable in a battle, however. Once an encounter begins, creatures remain invisible until at most the end of the first round, at which point the spell ends.
''Heightened (5th)'' The duration increases to 1 hour.
While invisible, you can’t be seen.
You’re [[Undetected]] to everyone //who uses vision as a primary or precise sense//.
Creatures can [[Seek]] to attempt to detect you; if a creature succeeds at its [[Perception]] check against your [[Stealth]] DC, you become [[Hidden]] to that creature until you [[Sneak]] to become undetected again.
If you become invisible while someone can already see you, you start out hidden to the observer (instead of undetected) until you successfully Sneak.
You can’t become observed while invisible except via special abilities or magic //or precise senses other than vision//.
Other effects might make an invisible creature hidden or even observed but [[Concealed]]. For instance, if you were tracking an invisible creature’s footprints through the snow, the footprints would make it hidden. Similarly, throwing a net over an invisible creature would make it observed but concealed for as long as the net is on the creature.
{{||SpellSummaryTable}}
You make the object [[Invisible]].
This makes it [[Undetected]] to all creatures, though the creatures can attempt to find the target, making it [[Hidden]] to them instead if they succeed.
If the item is used as part of a [[Hostile Action]], the spell ends after that hostile action is completed.
Making a weapon invisible typically doesn’t give any advantage to the attack, except that an invisible thrown weapon or piece of ammunition can be used for an attack without necessarily giving information about the attacker’s hiding place unless the weapon returns to the attacker.
''Heightened (3rd)'' The duration is until the next time you make your [[daily preparations|Rest]].
''Heightened (7th)'' The duration is unlimited.
You have learned how to become invisible and remain so.
You can cast 4th-level [[Invisibility]] as a primal innate spell once per hour.
''Trigger'' You attempt a saving throw against a <<tag Divine>> effect, but you haven’t rolled yet.
You rise above the triggering effect, refusing to be harmed by it.
You gain a +1 circumstance bonus to the triggering saving throw and to any other saving throws you attempt against divine effects until the start of your next turn.
{{||SpellSummaryTable}}
Brandishing your weapon and shouting the final line of the Crimson Oath, you unleash a blast of destructive ruby energy. You must be wielding a melee weapon, and you perform this spell’s somatic component by swinging the weapon in a downward arc.
You deal normal melee damage for your weapon, including all appropriate bonuses, penalties, modifiers, and properties, to each creature in the spell’s area; they must each attempt a basic [[Fortitude]] save.
A creature that critically fails this save also suffers any additional effect you would normally inflict with your weapon on a critical hit; if the creature that critically fails its save is also immune to critical hits, it merely fails the save instead.
You can convert all the physical damage from this spell into positive damage against all undead creatures in the area.
''Frequency'' once per day
You summon an aura of shimmering heat, flurrying snow, crashing waves, or swirling wind and lightning.
For 1 minute, you gain [[Concealment|Concealed]] against creatures more than 5 feet away, and any creature that ends its turn within 5 feet of you suffers 1d12 damage (basic [[Reflex]] save using your class DC or spell DC, whichever is higher).
At 13th and 17th level, this damage increases by 1d12.
A [[Veil May]] changeling deals fire damage, a [[Snow May]] changeling deals cold damage, a [[Brine May]] changeling deals bludgeoning damage and the effect gains the water trait, and a [[Virga May]] changeling deals electricity damage.
You are unstoppable, able to shrug off mortal wounds with ease.
You gain resistance equal to 3 + your Constitution modifier to all damage, and your resistance from [[Raging Resistance]] increases to 8 + your Constitution modifier.
In addition, if you are reduced to 0 Hit Points, you can end your rage as a reaction to stay at 1 Hit Point. If you do, you become [[Wounded]] 2 (or increase your wounded condition by 2 if you are already wounded).
''Trigger'' An enemy within 15 feet damages you.
You put an impertinent foe who dared harm you in their proper place. You command your enemy to kneel before you in obedience. If they dare to refuse, they must pay the price in pain and anguish.
The foe must choose one of the following options.
* The enemy kneels, [[dropping prone|Drop Prone]] as a free action.
• The enemy refuses, and you deal 1d6 <<tag Mental>> damage to it. This damage increases to 2d6 at 5th level, 3d6 at 9th level, 4d6 at 12th level, 5d6 at 16th level, and 6d6 at 19th level.
In addition, your [[Strike]]s against the triggering creature deal 1 extra damage until the end of your next turn. You choose whether the damage type is evil or negative each time you use this reaction. This extra damage increases to 2 at 9th level and 3 at 16th level.
If you have Divine Smite, if an enemy refuses your Iron Command, it takes persistent evil damage equal to your [[Charisma]] modifier.
If you have Exalt, when you use Iron Command, each enemy within 15 feet of you other than the triggering creature must also either drop prone or take mental damage (the enemy chooses). These creatures take only minimum damage (typically 3 damage at 11th level, 4 at 12th, 5 at 16th, and 6 at 19th), and the effects they take can’t be adjusted by anything that changes your Iron Command. For instance, the [[Iron Repercussions]] feat couldn’t turn the damage into persistent mental damage for creatures other than the triggering creature.
Affix to a weapon.
''Requirements'' You are an expert with the affixed weapon.
This cube of blackened iron is affixed to a weapon with an iron chain.
When you activate the cube, you use {{TwoAction}} [[Knockdown|Knockdown (Fighter)]], as the fighter feat.
If you have the Knockdown feat, ignore its normal size restrictions.
Affix to a weapon.
''Requirements'' You are an master with the affixed weapon.
This miniature club is typically affixed to a weapon by an iron chain.
When you activate the cudgel, you use {{OneAction}} [[Brutal Finish]], as the fighter feat. You must meet the normal requirements, including those of the <<tag Press>> trait.
If you have the Brutal Finish feat, add two additional weapon damage dice on a success or a failure.
Affix to a weapon.
''Requirements'' You are an master with the affixed weapon.
This small iron band has a shifting weight that helps equalize the affixed weapon’s balance.
When you activate it, you use [[Certain Strike]], as the fighter feat.
You must meet the normal requirements, including those of the <<tag Press>> trait.
If you have the Certain Strike feat, the failure effect increases to deal the weapon’s normal damage.
Your fists have been forged by battle, your naturally tough skin and dense bone further hardened by conflict.
Your fist unarmed attacks no longer have the [[Nonlethal]] trait and gain the [[Shove]] weapon trait.
{{||SpellSummaryTable}}
Your mouth, esophagus, and stomach become incredibly elastic and tougher than metal.
For the duration of the spell, you can reach down your throat to store or retrieve a single object of light or negligible Bulk in your stomach, as though your stomach were a backpack or other container. Storing and retrieving an item in this way requires an [[Interact]] action.
The object must be small enough to reasonably fit within your stomach.
It is very difficult for other creatures to notice that you are hiding an object in this way; passive observers can’t possibly notice and you gain a +4 circumstance bonus to your [[Stealth]] checks to [[Conceal the Object|Conceal an Object]] unless the searcher specifically searches your mouth and stomach.
If at the end of the spell’s duration you still have an object stored in your stomach, it is violently expelled, dealing 1d6 damage to you.
''Heightened (3rd)'' The duration increases to 8 hours.
Your lungs are infused with the resilience of iron.
Treat the result of your save against an inhaled poison as one degree of success better than you rolled.
Additionally, you gain [[Exhale Poison]].
Affix to armor.
''Requirements'' You are an master in [[Will]] saves or have the [[Bravery]] class feature.
''Trigger'' You attempt a [[Will]] save against a <<tag Fear>> effect but haven't rolled yet.
This small medallion is shaped like a shield.
When you activate it, you gain a +2 status bonus to saves against fear for 1 minute.
On the triggering save, if the outcome of your roll is a failure, you get a success instead or if the outcome is a critical failure, you get a failure instead.
Disobeying your [[Iron Command]] has lasting consequences.
If an enemy refuses to kneel to you, you can deal persistent mental damage instead of normal mental damage.
You must decide whether the mental damage will be persistent before your enemy chooses whether to kneel or not.
The amount of damage is unchanged.
Your mental defenses are an iron fortress.
Your proficiency rank for [[Will]] saves increases to expert.
''Requirements'' You are unarmored.
You enter the stance of impenetrable iron, refusing to yield to any blow.
You can make iron sweep unarmed attacks. These deal 1d8 bludgeoning damage; are in the brawling group; and have the [[Nonlethal]], [[Parry]], [[Sweep]], and [[Unarmed]] traits.
While in Ironblood Stance, you gain resistance 2 to all damage. The resistance increases to 3 at 12th level, to 4 at 16th level, and to 5 at 20th level.
''Requirements'' You are in [[Ironblood Stance]].
You steel yourself, preparing to resist oncoming attacks and using your muscles to absorb the impact.
You gain the benefits of your iron sweep’s [[Parry]] trait (a +1 circumstance bonus to AC until the start of your next turn) and your resistance from [[Ironblood Stance]] increases to your Strength modifier (if it’s higher) for the same duration.
You can keep yourself fed with poor meals in a settlement as long as garbage is readily available, without using the [[Subsist]] downtime activity. You can eat and drink things when you are [[Sickened]].
You gain a +2 circumstance bonus to saving throws against [[Affliction]]s, against gaining the [[Sickened]] condition, and to remove the sickened condition. When you roll a success on a [[Fortitude]] save affected by this bonus, you get a critical success instead. All these benefits apply only when the affliction or condition resulted from something you ingested.
Your contrary nature means you bounce back with prejudice.
When you roll a success on a save against an <<tag Emotion>> or <<tag Fear>> effect, you get a critical success instead.
You are easily able to ward off attempts to play on your fears and emotions.
When you roll a success on a saving throw against an <<tag Emotion>> effect, you get a critical success instead. If your heritage is [[Gutsy Halfling]], when you roll a critical failure on a saving throw against an emotion effect, you get a failure instead.
{{LOCGFeat}}
Your resistance to cold increases to 5 + half your level, and you can cast 5th-level [[Wall of Ice]] as an innate arcane spell once per day.
You glide slowly toward the ground, 5 feet down and up to 25 feet forward through the air.
As long as you spend at least 1 action gliding each round and haven’t yet reached the ground, you remain in the air at the end of your turn.
Your iruxi unarmed attacks channel the spiritual energy of your ancestors.
Any unarmed attacks you acquire from iruxi heritages or ancestry feats gain the effects of a [[Ghost Touch]] property rune.
You make the most of your iruxi unarmed attacks.
Whenever you score a critical hit with a claw or an unarmed attack you gained from a lizardfolk ancestry feat, you apply the unarmed attack’s [[Critical Specialization Effect]].
Your unarmed attacks blend tradition and training.
Whenever you gain a class feature that grants you expert or greater proficiency in certain weapons, you also gain that proficiency in the claw and unarmed attacks you gained from lizardfolk ancestry feats.
See also [[Rune]]s.
<table>
<tr><th>Level</th><th>Items</th><th>Price</th></tr>
<$list filter="[range[1,20]]" variable="level">
<tr><th><<level>></th>
<td>
<$list filter="[tag[Item]contains:item-level<level>sort[]]">
<$list filter="[range[1,10]]" variable="index">
<$list filter="[list[!!item-level]nth<index>match<level>]" variable="matchedlevel">
<$list filter="[list[!!item-variants]nth<index>!match[Standard]]"><<currentTiddler>></$list>
<$link />
<br>
</$list>
</$list>
</$list>
</td>
<td>
<$list filter="[tag[Item]contains:item-level<level>sort[]]">
<$list filter="[range[1,10]]" variable="index">
<$list filter="[list[!!item-level]nth<index>match<level>]" variable="matchedlevel">
<$list filter="[list[!!item-price]nth<index>]"><<currentTiddler>></$list>
<br>
</$list>
</$list>
</$list>
</td>
</tr>
</$list>
</table>
{{||SpellSummaryTable}}
You make the target object look and feel as though it were in much better or worse physical condition.
When you cast this spell, decide whether you want to make the object look decrepit or perfect.
An item made to look decrepit appears [[Broken]] and [[Shoddy]].
An intact item made to look better appears as though it’s brand new and highly polished or well maintained. A broken item //made to look better// appears to be intact and functional.
Destroyed items can’t be affected by this spell.
A creature that [[Interact]]s with the item can attempt to disbelieve the illusion.
''Heightened (2nd)'' The duration is 24 hours.
''Heightened (3rd)'' The duration is unlimited.
<table>
<tr><th>Level</th><td>{{!!item-level}}</td></tr>
<tr><th>Price (sp)</th><td>{{!!item-price}}</td></tr>
<tr><th>Bulk</th><td>{{!!item-bulk}}</td></tr>
<tr><th>Slot</th><td>{{!!item-slot}}</td></tr>
<tr><th>Hands</th><td>{{!!item-hands}}</td></tr>
</table>
Affix to a melee weapon.
''Requirements'' You are an master with the affixed weapon.
This bit of jade is usually carved in the shape of a duelist, or sometimes a multi-armed creature.
When you {{OneAction}} activate the bauble, it magically draws the attention of foes. Until the start of your next turn, enemies within the reach of the weapon the talisman is affixed to are [[Flat-Footed]].
Affix to a melee weapon.
''Requirements'' You are trained in [[Acrobatics]].
''Trigger'' You fall or attempt an [[Acrobatics]] check to [[Balance]].
A thumb-sized feline carved of rare stone, the jade cat is typically worn as a pendant upon a suit of armor.
For 1 minute after you activate {{FreeAction}} the cat, you treat all falls as 20 feet shorter, you are not flat-footed when you [[Balance]], and narrow surfaces and [[Uneven Ground]] are not difficult terrain for you.
You can use magic to show others desert hospitality.
You can cast 2nd-level [[Create Food]] once per day and [[Create Water]] twice per day as arcane innate spells.
The magic of jann runs through your blood.
You can cast [[Enlarge]] and [[Speak with Animals]] once per day each as 2nd-level arcane innate spells.
This item looks like a normal javelin carved with lightning-bolt motifs.
If thrown without being activated, it wobbles in the air and fails to strike true.
When you Activate the javelin ({{TwoAction}} Command, Interact), your command makes the carvings crackle with electricity. You then hurl the javelin.
It shatters immediately after leaving your hand and unleashes its magic as a 4th-level [[Lightning Bolt]] originating from your space. The bolt deals 5d12 electricity damage and has a [[Reflex]] save DC of 25.
''Craft Requirements'' Supply a casting of [[Lightning Bolt]].
{{||SpellSummaryTable}}
You draw forth a hag’s innate jealousy to deny a target its greatest attribute.
The target gains an adverse condition depending on its highest ability modifier:
| !Highest Ability | !Condition |
|[[Strength]] |[[Enfeebled]] |
|[[Dexterity]] |[[Clumsy]] |
|[[Constitution]] |[[Drained]] |
|[[Intelligence]] |[[Stupefied]] |
|[[Wisdom]] |[[Stupefied]] |
|[[Charisma]] |[[Stupefied]] |
On a tie, the creature decides which of the conditions associated with the tied ability modifiers to take.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
At the start of each of your turns, the target can attempt another Will save, ending the effect on a success.
''Frequency'' once per day.
You can curse another creature with clumsiness. This curse has a range of 30 feet, and you must be able to see your target.
The target gets a [[Will]] saving throw to resist this jinx, using your class DC or spell DC, whichever is higher.
{{||SaveSuccessTable}}
You can [[Eat Fortune]] once per hour, rather than once per day.
You can never take the Halfling Luck feat, and you gain the [[Jinx]] action.
If you succeed at a saving throw against a <<tag Curse>> or <<tag Misfortune>> effect, you get a critical success instead.
When you would gain the [[Doomed]] condition, attempt a DC 17 flat check. On a success, reduce the value of the doomed condition you would gain by 1.
{{AoA3Spell}}
{{||SpellSummaryTable}}
With touches to the targets’ foreheads, you bring them into mental communion. The targets can share thoughts and experiences, but not words.
When one target attempts to [[Recall Knowledge]], the other can [[Aid]] the first target’s skill check, using any [[Lore]] skill (even if that Lore wouldn’t normally apply) without having made any preparations to Aid.
''Heightened (+1)'' You can touch one additional target to include them in the spell’s effects. Multiple targets can attempt checks to Aid the target who is attempting to Recall Knowledge.
The weapon is suited for mounted combat with a harness or similar means.
When mounted, if you moved at least 10 feet on the action before your attack, add a circumstance bonus to damage for that attack equal to the number of damage dice for the weapon.
In addition, while mounted, you can wield the weapon in one hand, changing the damage die to the listed value.
{{LOWGFeat}}
You can use the oaths bound in your ka stone to compel the truth from the living and the dead.
You can activate your ka stone to target a single living creature, causing that creature to experience the effects of being in a [[Zone of Truth]].
You can also activate it with a 10-minute activation (envision) to cast [[Talking Corpse]].
Your proficiency rank for Fortitude saves increases to master.
When you roll a success on a Fortitude save, you get a critical success instead.
After you drink this mutagen, your body becomes thick and sturdy. You exhibit a healthy glow, though you tend to be ponderous and unobservant.
''Benefit'' You gain an item bonus to [[Fortitude]] saves and the listed number of temporary Hit Points. Whenever you are at maximum Hit Points for at least 1 full minute, you regain the temporary Hit Points.
Drawback You take a –2 penalty to [[Will]] saves, [[Perception]] checks, and initiative rolls.
| !Type | !Level | !Price | !Bonus | !Temp HP | !Duration | !Promote Fortitude saves |
| Lesser | 1 | 40 | +1 | 5 | 1 minute | |
| Moderate | 3 | 120 | +2 | 10 | 10 minutes | |
| Greater | 11 | 3000 | +3 | 30 | 1 hour | Success |
| Major | 17 | 30000 | +4 | 45 | 1 hour | Success, Fumble |
Your proficiency rank in [[Fortitude]] saves increases to master.
Requires [[Dexterity]] 16+.
You can Juggle items and still use your hands between tosses. You can use the Juggle action in several ways.
You can start to Juggle with a single stored item, an item you were carrying, or an unattended item within your reach. The item must be of light or negligible Bulk. You Juggle the item until the end of your next turn, unless you use this feat against next turn to continue Juggling (see below).
While you are Juggling, you can use this action again to add another item to the Juggle, which must meet all the same requirements. You can Juggle a number of items equal to one more than the number of hands you are using to Juggle.
You can also use this action to continue Juggling as long as you aren’t [[Fatigued]]. When you do, you continue to Juggle until the end of your next turn. If you do not continue Juggling by the end of your turn, you cease Juggling and you drop all the items.
You become [[Fatigued]] if you continue Juggling for more than 10 minutes (60 rounds) within the course of an hour.
As long as you’re Juggling fewer than your maximum number of items, you have a free hand.
You can wield weapons you are Juggling (but not shields or other items) as long as they can be wielded in one hand. For example, while you Juggle a dagger in one hand and wield a shield in the other, you are wielding the dagger but still have a free hand to Cast a Spell with a material component.
Juggling two or more weapons with one hand doesn’t allow you to use feats that require two weapons each held in a different hand.
You become trained in [[Performance]]; if you were already trained in Performance, you instead become trained in a skill of your choice.
You also gain the [[Juggle]] skill feat, even if you don’t meet its prerequisites.
<<levelfeatlist "4 8 16" "[tag[Archetype]field:feat-arch[Juggler]]">>
{{||SpellSummaryTable}}
//This is a spell. If you're looking for rules on just jumping normally, they're under [[Leap]], [[High Jump]] and [[Long Jump]].//
Your legs surge with strength, ready to leap high and far.
You jump 30 feet in any direction without touching the ground.
You must land on a space of solid ground within 30 feet of you, or else you [[Fall|Falling]] after using your next action.
''Heightened (3rd)'' The range becomes touch, the target changes to one touched creature, and the duration becomes 1 minute, allowing the target to jump as described whenever it takes the [[Leap]] action.
You ignore [[Difficult Terrain]] from undergrowth, and greater difficult terrain from undergrowth is only difficult terrain for you.
You can make useful tools out of even twisted or rusted scraps.
When using the [[Crafting]] skill to [[Craft]], you can make level 0 items, including weapons but not armor, out of junk. This reduces the Price to one-quarter the usual amount but always results in a [[Shoddy]] item.
Shoddy items normally give a penalty, but you don’t take this penalty when using shoddy items you made.
You can also incorporate junk to save money while you Craft any item. This grants you a discount on the item as if you had spent 1 additional day working to reduce the cost, but the item is obviously made of junk. At the GM’s discretion, this might affect the item’s resale value depending on the buyer’s tastes.
''Requirements'' Your most recent action was to [[Feint]], [[Request]], or [[Demoralize]], and you failed but didn’t critically fail.
After your attempt to influence someone goes poorly, you add another bit of information or ask a pointed question, possibly salvaging your previous attempt.
Reroll the failed check and use the new result.
If the target of the failed check is the subject of a lead you’re pursuing, double your bonus from [[Pursue a Lead]] on the rerolled check.
That creature is temporarily immune to Just One More Thing for 1 day.
You can also use this action if you failed, but didn’t critically fail, at a check to [[Lie]], [[Gather Information]], [[Make an Impression]], or [[Coerce]]. In this case, rather than spending 1 action, adding Just One More Thing takes you half the amount of time you initially spent on the check, to a minimum of 1 more round.
You fundamentally understand everything to the point where your research can’t possibly be wrong.
You are permanently [[Quickened]] and can use the extra action to [[Recall Knowledge]].
Your checks to Recall Knowledge are no longer secret.
When you Recall Knowledge, you use the outcome for one degree of success better than the result of your check, and if an effect (such as [[Dubious Knowledge]]) would give you inaccurate information from your Recall Knowledge check, you know which information is inaccurate.
When one of your allies Recalls Knowledge and gains false information, you also know that information is inaccurate if they share it with you.
''Frequency'' once per day.
You unfold your wings for travel and can keep them unfolded for 10 minutes.
You gain a fly Speed equal to your land Speed while your wings are unfurled.
If you have [[Fledgling Flight]], you gain a +10-foot status bonus to your fly Speed with Juvenile Flight. As normal, since your fly Speed is derived from your land Speed, this status bonus isn’t cumulative with a status bonus to your land Speed, if you have one.
{{LOWGFeat}}
You inscribe your true name on your ka stone, as well as oaths to gods and pharaohs, and embed it in your forehead in a special ritual with a sphinx or with a living monolith who already has this feat.
The ka stone is an invested magic item that you automatically invest each day. It can’t be removed without your permission, nor can it be dispelled, and you can never lose investiture in the ka stone.
Its Bulk is negligible.
The ka stone grants you a +1 item bonus to saves against death effects and negative effects, which increases to +2 at 8th level, +3 at 14th level, and +4 at 20th level.
''Activate'' {{TwoAction}} (envision), or a different activation if otherwise specified; ''Frequency'' a number of times each day equal to the number of class feats you have from the Living Monolith archetype; ''Effect'' You cast [[Enlarge]] on yourself or use one of the other activated abilities granted by a later Living Monolith feat.
''Usage'' etched onto a piercing or slashing weapon.
The edges of a keen weapon are preternaturally sharp.
Attacks with this weapon are a critical hit on a 19 on the die as long as that result is a success.
This property has no effect on a 19 if the result would be a failure.
Your eyes are sharp, allowing you to make out small details about concealed or even invisible creatures that others might miss.
You gain a +2 circumstance bonus when using the [[Seek]] action to find [[Hidden]] or [[Undetected]] creatures within 30 feet of you.
When you target an opponent that is [[Concealed]] from you or [[Hidden]] from you, reduce the DC of the flat check to 3 for a concealed target or 9 for a hidden one.
You inflict particularly devastating attacks on even well-defended foes.
When you [[Strike]] with a weapon or unarmed attack with which you have master proficiency, if you roll a 19 on the die and the roll is a success, you critically succeed instead.
Your keen observation of your allies has made you better at following their lead.
When using the [[Follow the Expert]] activity in exploration mode, you gain a +3 circumstance bonus if the ally you are following is an expert and a +4 circumstance bonus if your ally is a master.
You can recall pertinent facts on topics that aren’t your specialty.
Your proficiency bonus to untrained skill checks to [[Recall Knowledge]] is equal to your level instead of +0.
''Trigger'' Your prey is within reach and attempts to move away from you.
Your prey can’t escape.
[[Stride]] up to your [[Speed]], following the foe and keeping it in reach throughout its movement until it stops moving or you’ve moved your full Speed.
You can use Keep Pace to Burrow, Climb, Fly, or Swim instead of Stride if you have the corresponding movement type.
//The book reads "your prey can't Escape" as if it referred to the [[Escape]] action, but this would not match the trigger, since it does not include movement unless it has already been successful.//
{{LOCGFeat}}
''Trigger'' You are affected by an <<tag Emotion>> effect.
Roll a [[Deception]] check and compare the result to any observing creatures’ [[Perception]] DCs. On a success, that creature believes you were unaffected by the emotion effect.
A creature tricked in this manner can’t benefit from the emotion effect and can’t use abilities that require you to be under this emotion effect; for example, if you successfully use this ability to trick a will-o’-wisp into believing you aren’t under a fear effect, it can’t use its Feed on Fear ability on you.
{{||SpellSummaryTable}}
You unleash your ki as a powerful blast of force that deals 2d6 force damage.
If you use 2 actions to cast ki blast, increase the size of the cone to 30 feet and the damage to 3d6.
If you use 3 actions to cast ki blast, increase the size of the cone to 60 feet and the damage to 4d6.
Each creature in the area must attempt a basic [[Fortitude]] saving throw. //In addition to the usual effects, the creature is push 5 feet on a failure and 10 feet on a critical failure.//
''Heightened (+1)'' The damage increases by 1d6, or by 2d6 if you use 2 or 3 actions.
''Prerequisites'' Ki Spells.
''Frequency'' once per minute.
You center yourself with the universe and draw upon its vast power.
You cast a single action ki spell with the <<tag Stance>> trait, without spending a Focus Point.
{{||SpellSummaryTable}}
Drawing from deep wells of spiritual power, you take on a special ki form. In your ki form, your hair, feathers, skin, or scales change color and begin to glow.
In this form you gain a fly Speed equal to your land Speed. Choose <<tag Force>>, <<tag Lawful>> (only if you are lawful), <<tag Negative>>, or <<tag Positive>> damage. All your [[Strike]]s deal 1d6 additional damage of the chosen type.
Your entire body is also surrounded by a glowing corona of the same color as your inner ki; this is a <<tag Light>> effect. Your corona is a 5-foot [[Emanation]] that deals 2d6 damage of the chosen type to creatures who start their turn within the emanation.
If the emanation overlaps with a <<tag Darkness>> effect, the corona’s glow attempts to [[Counteract]] the Darkness effect. Regardless of the outcome, the corona can’t attempt to counteract that effect again for 1 day.
As a single action, which has the <<tag Concentrate>> trait, you can flare your corona out to become a 30-foot emanation.
In your ki form, your emotions surge to the forefront and it’s difficult to moderate your attacks. Your weapons and <<tag Unarmed>> attacks lose the nonlethal trait. You take a –2 status penalty to saves against <<tag Emotion>> effects but gain a +2 status bonus to saves against all other <<tag Mental>> effects.
{{||SpellSummaryTable}}
Accelerated by your ki, you move with such speed you become a blur.
Move two times: two [[Stride]]s, two [[Step]]s, or one [[Stride]] and one [[Step]] (in either order).
You gain the [[Concealed]] condition during this movement and until the start of your next turn.
{{||SpellSummaryTable}}
You focus your ki into magical attacks.
Make an unarmed [[Strike]] or [[Flurry of Blows]] (this doesn’t change the limit on using only one <<tag Flourish>>per turn).
You gain a +1 status bonus to your attack rolls with the Strikes, and the Strikes deal 1d6 extra damage.
This damage can be any of the following types of your choice, chosen each time you Strike: <<tag Force>>, <<tag Lawful>> (only if you’re lawful), <<tag Negative>>, or <<tag Positive>>.
''Heightened (+4)'' The extra damage increases by 1d6.
Your star orb hides a deadly miasma.
You can cast 5th-level [[Cloudkill]] as a divine innate spell once per day.
The spell’s normal components are replaced with a focus component (your star orb) and a somatic component to aim the orb towards the location for the spell.
''Usage'' etched onto a clan dagger.
A kin-warding clan dagger can deflect attacks aimed at your allies.
When you use the weapon’s [[Parry]] trait, you can point the clan dagger at an adjacent ally instead of defending yourself, creating a shield of runes around them.
The runic barrier grants your ally the weapon’s circumstance bonus to AC, but you do not gain the bonus yourself.
King’s Sleep is an insidious long-term poison that can seem like a disease or even death from natural causes on a venerable target.
The [[Drained]] condition from king’s sleep is cumulative with each failed save and can’t be removed while the poison lasts.
| !Saving Throw |DC 41 [[Fortitude]] |
| !Onset |1 day |
| !Maximum Duration |None |
| !Stage 1 |[[Drained]] 1 Cumulative (1 day) |
| !Stage 2 |[[Drained]] 1 Cumulative (1 day) |
| !Stage 3 |[[Drained]] 2 Cumulative (1 day) |
''Prerequisites'' Master in [[Acrobatics]].
You stand up.
This movement doesn't trigger reactions.
//This movement isn't a Move action.//
You excel at navigating social situations and keeping secrets.
You gain the trained proficiency rank in [[Diplomacy]] and [[Deception]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Kitsune [[Lore]].
Your tails show your magical mastery.
During your daily preparations, choose [[Confusion]], [[Death Ward]], or [[Illusory Scene]].
You can Cast this Spell as a 5th-level divine innate spell once that day. You become an expert in divine spell DCs and divine spell attack rolls.
You’ve picked up a few magical tricks.
During your daily preparations, choose [[Daze]], [[Forbidding Ward]], or [[Ghost Sound]].
Until your next daily preparations, you can cast this cantrip as a divine innate spell at will. A cantrip is heightened to a spell level equal to half your level rounded up.
''Prerequisites'' at least one innate spell from a kitsune heritage or ancestry feat.
You know more kitsune magic.
During your daily preparations, choose [[Bane]], [[Illusory Object]], or [[Sanctuary]].
You can cast this as a 1st-level divine innate spell once that day..
You deliver a punishing blow to an enemy’s knee, shin, or other vulnerable anatomy within your reach.
Make a [[Strike]] with one of your melee weapons or melee unarmed attacks. This attack doesn’t deal damage.
On a hit, the target takes a –10-foot status penalty to its Speed or a –15-foot status penalty on a critical hit. This penalty applies only if the target has a land Speed and depends on legs or other targetable appendages to use its land Speed.
As with all penalties to Speed, this can’t reduce a creature’s Speed below 5 feet.
{{LOCGFeat}}
When you use your [[Call on Ancient Blood]] reaction against a <<tag Divine>> spell and roll a critical failure on the saving throw against that spell, you get a failure instead.
{{LOCGFeat}}
''Prerequisites'' Expert in light armor, medium armor, or unarmored defense; trained in heavy armor.
As a knight in shining armor, you train daily in the heaviest armor, expanding your expertise to heavy armor.
You gain expert proficiency in heavy armor.
{{LOCGFeat}}
You have sworn the Crimson Oath and become a full member of the Crimson Reclaimers.
You gain expert proficiency in [[Stealth]] and [[Survival]].
Whenever you roll a success on a saving throw against an undead’s special ability, you get a critical success instead. This applies to any abilities that come from being undead, including an undead’s innate spells (but not its prepared or spontaneous spells).
<<archetypefeatlist "8 12" "[[Knight Reclaimant]]">>
{{LOCGFeat}}
//The book calls this feat just "Knight Vigilant", omitting the word Dedication.//
You are dedicated to the cause of the Shining Sentinels.
You gain expert proficiency in [[Religion]].
When you are between an ally and a foe and would provide lesser cover to your ally against the foe’s attacks, you twist to become even more obtrusive, providing standard cover instead.
<<archetypefeatlist "8 10 12" "[[Knight Vigilant]]">>
{{||SpellSummaryTable}}
You make the target easier to open.
Ktock grants a +4 status bonus to any creature that tries to open the target door, lock, or container with an [[Athletics]] or a [[Thievery]] check. //(Probably with [[Force Open]] or [[Pick a Lock]], respectively.)//
You can attempt a Thievery check to open the target as part of casting knock, and you add your level even if you’re untrained.
Knock [[Counteract]]s [[Lock]].
''Requirements'' Your last action was a successful Strike.
The weight of your swing drives your enemy back.
You push the foe back 5 feet, with the effects of a successful [[Shove]].
You can follow the foe as normal for a successful Shove.
You focus your strength into a blow powerful enough to push an enemy away from you.
Make an unarmed [[Strike]].
If you hit, attempt an [[Athletics]] check to [[Shove]] the target. This attack uses the same [[Multiple Attack Penalty]] as your Strike, and doesn’t count toward your multiple attack penalty.
You make an attack to knock a foe off balance, then follow up immediately with a sweep to topple them.
Make a melee [[Strike]].
If it hits and deals damage, you can attempt an [[Athletics]] check to [[Trip]] the creature you hit.
If you’re wielding a two-handed melee weapon, you can ignore Trip’s requirement that you have a hand free.
Both attacks count toward your multiple attack penalty, but the penalty doesn’t increase until after you’ve made both of them.
''Requirements'' The monster’s last action was a success with a [[Strike]] that lists Knockdown in its damage entry.
The monster knocks the target [[Prone]].
//Knockdown is a monster ability. The more normal equivalent ability for PCs is [[Trip]].//
''Requirements'' The animal companion’s last action was a successful jaws [[Strike]].
The wolf automatically knocks the target of its jaws Strike [[Prone]].
{{||SpellSummaryTable}}
In your mind’s eye, you see a path northward.
You immediately know which direction is north (if it exists at your current location).
''Heightened (7th)'' You can instead know the direction to a familiar location, such as a previous home or a favorite tavern.
{{LOCGFeat}}
''Trigger'' You roll a critical failure on a saving throw against an <<tag Emotion>> effect.
You center yourself and call to mind the monastic ideals of mindfulness and self-knowledge.
You fail the save against the emotion effect instead of critically failing.
{{||SpellSummaryTable}}
''Trigger'' You roll [[Initiative]] and can see a creature, you succeed at an [[Attack Roll]] against a creature, or a creature fails a saving throw against one of your spells.
Use a [[Recall Knowledge]] action, rolling the appropriate skill check to identify the triggering creature’s abilities. You can roll your check twice and use the better result.
You’ve spent countless hours studying the history of elves on your world and beyond and are a studied expert in your people’s ways.
If you critically fail a check to [[Recall Knowledge]] about elves, elven society, or elven history, you get a failure instead.
When you succeed at a //[[Recall Knowledge]]// check, you gain additional information or context.
When you critically succeed at a //[[Recall Knowledge]]// check, at the GM’s discretion you might gain even more additional information or context than normal.
Whenever you [[Devise a Stratagem]], you can also attempt a check to [[Recall Knowledge]] as part of that action.
If you critically succeed at the Recall Knowledge check, you notice a weakness and gain a +1 circumstance bonus to your attack roll from Devise a Stratagem.
If you immediately convey this information to your allies as part of the check, each ally gains a +1 circumstance bonus to their next attack roll against the subject, as long as their attack is made before the beginning of your next turn.
You channel your draconic exemplar’s power into a gout of energy that manifests as a 30-foot [[Line]] or a 15-foot [[Cone]], dealing 1d4 damage.
Each creature in the area must attempt a basic saving throw against the higher of your class DC or spell DC.
You can’t use this ability again for 1d4 rounds.
At 3rd level and every 2 levels thereafter, the damage increases by 1d4.
The shape of the breath, the damage type, and the saving throw match those of your [[Draconic Exemplar]]. This ability has the trait associated with the type of damage it deals.
{{KoboldDragonTable}}
You attentively learned key kobold survival strategies and mythology from your elders.
You gain the trained proficiency rank in [[Stealth]] and [[Thievery]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Kobold [[Lore]].
Whenever you gain a class feature that grants you expert or greater proficiency in a given weapon or weapons, you also gain that proficiency in the crossbow, greatpick, light pick, pick, and spear, as well as any kobold weapons in which you are trained..
You’ve trained with weapons ideal for subterranean efficiency.
You are trained with the crossbow, greatpick, light pick, pick, and spear.
You also gain access to all uncommon kobold weapons. For the purpose of determining your proficiency, martial kobold weapons are simple weapons, and advanced kobold weapons are martial weapons.
You’ve learned devious tactics with your kobold weapons.
Whenever you critically hit with a crossbow, greatpick, light pick, pick, spear, or kobold weapon, you apply the weapon’s critical specialization effect.
| !Dragon | !Shape | !Damage | !Save |
| Black | [[Line]] | <<tag Acid>> | [[Reflex]] |
| Blue | [[Line]] | <<tag Electricity>> | [[Reflex]] |
| Green | [[Cone]] | <<tag Poison>> | [[Fortitude]] |
| Red | [[Cone]] | <<tag Fire>> | [[Reflex]] |
| White | [[Cone]] | <<tag Cold>> | [[Reflex]] |
| Brass | [[Line]] | <<tag Fire>> | [[Reflex]] |
| Bronze | [[Line]] | <<tag Electricity>> | [[Reflex]] |
| Copper | [[Line]] | <<tag Acid>> | [[Reflex]] |
| Gold | [[Cone]] | <<tag Fire>> | [[Reflex]] |
| Silver | [[Cone]] | <<tag Cold>> | [[Reflex]] |
You’ve spent more than your share of time in an alchemy lab. You might have been an alchemist yourself, an assistant, or perhaps even a test subject. Either way, you have been exposed to a wide variety of alchemical poisons and elixirs, leaving you with increased tolerance of their effects.
You have a +1 circumstance bonus to saves against [[Poison]] and harmful effects from [[Elixir]]s. If you roll a success on your saving throw against an elixir or poison, you get a critical success instead.
You become trained in [[Athletics]] (or another skill if you’re already trained in Athletics), and you gain the [[Hefty Hauler]] skill feat.
{{||SpellSummaryTable}}
You let out your negative emotions in a guttural wail that shakes your enemies’ hearts and deals 1d8 mental damage (basic [[Will]] save).
If you have any harmful conditions imposed by <<tag Emotion>> effects, lament deals additional mental damage equal to the [[Counteract]] level of the highest-level effect.
''Heightened (+1)'' The damage increases by 1d8.
When you [[Fall|Falling]], you take only half the normal damage and don’t land [[Prone]].
Your tail’s chaotic and independent nature causes it to perform mischief even when you don’t intend it, and it can somehow steal things it shouldn’t be able to handle.
You can use your tail to [[Steal]] an object, though your tail still can’t hold onto it at the end of your action.
If you have a hand free, you can transfer the stolen object to your hand. Otherwise, your tail surreptitiously drops it on the ground in your space, where you can grab it later.
Observers other than your target who haven’t witnessed you stealing something with your tail are usually distracted, meaning the GM will usually decrease their [[Perception]] DCs, as normal for Stealing something.
''Prerequisites'' Expert in [[Intimidation]].
When you successfully [[Coerce]] someone, the maximum time they comply increases to a week, still determined by the GM.
If you’re legendary, the maximum increases to a month.
When you cast doubt upon your foes, the effect lasts longer than usual.
After being enfeebled 2 by your [[Glimpse of Redemption]], the foe is [[Enfeebled]] 1 for 1 minute.
If you have [[Weight of Guilt]], after being [[Stupefied]] 2 by your Glimpse of Redemption, the foe is [[Stupefied]] 1 for 1 minute or until the flat check from stupefied causes it to lose a spell, whichever comes first.
{{LOWGFeat}}
You’ve sworn yourself as a sentry for the Knights of Lastwall, the first line of defense against
incursions by the Whispering Tyrant throughout Golarion.
You become trained in [[Athletics]] and in Undead [[Lore]]; if you were already trained, you become an expert instead.
Finally, you gain the [[Reactive Shield]] fighter feat.
<<archetypefeatlist "4 6 8 10" "[[Lastwall Sentry]]">>
You use your shield to protect your allies, not just yourself, especially against the undead.
When you have a shield raised, you can use your [[Shield Block]] reaction when an attack is made against an ally adjacent to you, in addition to its usual trigger.
If you do, the shield prevents that ally from taking damage instead of you, following the normal rules for a [[Shield Block]].
If an undead makes an attack against an ally within 10 feet, you can [[Step]] to become adjacent to your ally and then use [[Shield Block]] as part of the same reaction.
Your elemental lineage manifests as magma and molten rock, and you can focus the magma into your hand to attack your foes.
You gain a magma spike unarmed attack, which requires a free hand to use. This is an [[Agile]], [[Finesse]], [[Unarmed]] attack in the brawling weapon group that deals 1d4 piercing damage, as well as 1 additional fire damage.
Instead of the normal critical specialization effect, the target takes 1d6 persistent fire damage; you gain a bonus on this persistent damage equal to your item bonus to attack rolls on unarmed attacks.
You trace your lineage to archons: embodiments of heavenly virtues, guardians of the seven tiered mountain of Heaven, and nurturers of law and virtue within mortals. Your own virtue and orderly mind protect you from foes who would turn your emotions against you.
You gain a +1 circumstance bonus to saves against <<tag Emotion>> effects, and if you roll a success on a save against an emotion effect, you get a critical success instead.
{{||SpellSummaryTable}}
Your hands become infused with positive energy, healing a living creature or damaging an undead creature with a touch.
If you use lay on hands on a willing living target, you restore 6 Hit Points; if the target is one of your allies, they also gain a +2 status bonus to AC for 1 round.
Against an undead target, you deal 1d6 damage and it must attempt a basic [[Fortitude]] save; if it fails, it also takes a –2 status penalty to AC for 1 round.
''Heightened (+1)'' The amount of healing increases by 6, and the damage to an undead target increases by 1d6.
When climbing, you can prepare routes for others to follow, and you can pull your allies up to avoid disaster.
When your allies attempt to [[Climb]] a route you set using the [[Follow the Expert]] exploration activity, if any of them critically fail their checks to Climb, you can attempt an Athletics check against the same DC.
If you succeed, your ally fails instead of critically failing.
If you also critically fail, you both experience the consequences of the critical failure.
You spend 1 minute briefing up to four allies about one lead you’re pursuing.
Those allies gain the same circumstance bonus you do from [[Pursue a Lead]] to checks to investigate that lead.
This bonus lasts until you cease pursing that lead or for 1 day, whichever comes first. This doesn’t confer any other benefits of pursuing a lead, such as adding the circumstance bonus to your saves with [[Detective’s Readiness]].
You can have up to two animal companions active at once.
However, when you do, it’s slightly more difficult to Command them.
If you don’t Command either of your companions, one of the two (your choice) can still use 1 action on your turn to [[Stride]] or [[Strike]], as per [[Mature Beastmaster Companion]], but not both.
When you [[Command an Animal]], either choose one of the companions to take 2 actions, as normal, or else both companions can take 1 action to Stride or Strike.
Either way, you can’t Command an Animal to make either companion act again until your next turn.
Once injected, this synthetic toxin sinks into the extremities, numbing them nearly to paralysis.
| !Saving Throw |DC 20 [[Fortitude]] |
| !Maximum Duration |6 rounds |
| !Stage 1 |1d10 poison damage and -5' status penalty to Speeds (1 round) |
| !Stage 2 |2d6 poison damage and -10' status penalty to Speeds (1 round) |
| !Stage 3 |2d6 poison damage and -20' status penalty to Speeds (1 round) |
You take no damage from falling, regardless of the distance you fall.
You revere plants and the bounty of nature, acting as both a gardener and warden for the wilderness, teaching sustainable techniques to communities, and helping areas regrow after disasters or negligent humanoid expansion.
You are trained in [[Diplomacy]].
You also gain the [[Leshy Familiar]] druid feat.
You gain the [[Goodberry]] order spell, and you increase the number of Focus Points in your focus pool by 1.
Committing wanton cruelty to plants or killing plants unnecessarily is anathema to your order. (This doesn’t prevent you from defending yourself against plants or harvesting them when necessary for survival.)
You take a careful, short jump.
You can Leap up to 10 feet horizontally if your Speed is at least 15 feet, or up to 15 feet horizontally if your Speed is at least 30 feet.
//If you have [[Powerful Leap]], you can leap 5' further.//
You land in the space where your Leap ends (meaning you can typically clear a 5-foot gap, or a 10-foot gap if your Speed is 30 feet or more).
If you Leap vertically, you can move up to 3 feet vertically and 5 feet horizontally onto an elevated surface.
//If you have [[Powerful Leap]], you can leap up to 5 feet vertically.//
Jumping a greater distance requires using the [[Athletics]] skill.
This tingly solution increases the elasticity and contraction of your leg muscles.
For 1 minute after drinking this elixir, you can [[High Jump]] or [[Long Jump]] as a single action instead of 2 actions.
If you do, you don’t perform the initial Stride (nor do you fail if you don’t Stride 10 feet).
If you drink a greater Leaper's Elixir, the vertical distance you can jump with a High Jump is the same as the distance you can jump horizontally with a Long Jump.
| !Type | !Level | !Price |
| Lesser | 1 | 30 |
| Greater | 7 | 550 |
''Requirements'' You have a spellcasting class feature, and the spell you want to learn is on your magical tradition’s spell list.
You can gain access to a new spell of your tradition from someone who knows that spell or from magical writing like a spellbook or scroll.
If you can cast spells of multiple traditions, you can Learn a Spell of any of those traditions, but you must use the corresponding skill to do so. For example, if you were a cleric with the bard multiclass archetype, you couldn’t use Religion to add an occult spell to your bardic spell repertoire.
To learn the spell, you must do the following:
* Spend 1 hour per level of the spell, during which you must remain in conversation with a person who knows the spell or have the magical writing in your possession.
* Have materials with the Price indicated in Table 4–3.
* Attempt a skill check for the skill corresponding to your tradition (DC determined by the GM, often close to the DC on Table 4–3). Uncommon or rare spells have higher DCs; full guidelines for the GM appear on page 503.
* If you have a spellbook, Learning a Spell lets you add the spell to your spellbook; if you prepare spells from a list, it’s added to your list; if you have a spell repertoire, you can select it when you add or swap spells.
|!Spell Level|!Price|!Typical DC|
|1st or cantrip| 2 gp| 15|
|2nd| 6 gp| 18|
|3rd| 16 gp| 20|
|4th| 36 gp| 23|
|5th| 70 gp| 26|
|6th| 140 gp| 28|
|7th| 300 gp| 31|
|8th| 650 gp| 34|
|9th| 1,500 gp| 36|
|10th| 7,000 gp| 41|
{{||ActionSuccessTable}}
When you hit hard enough, you leave an opening so your ally can jump in on the action.
Whenever you critically hit a [[Flat‑Footed]] opponent with a melee attack and deal damage, the target triggers an [[Attack of Opportunity]] reaction from one ally of your choice who has that reaction, as if the enemy had used a <<tag Manipulate>> action.
//Implied by [[Tree Shape]].//
While in tree form, you can observe everything around you, but you can’t act other than to end the spell, and your turn, by using a single action, which has the Concentrate trait.
You are trained to capture deserters, or “leeches.”
If you critically hit a foe with a weapon from the [[Flail]] weapon group, you can wrap the weapon around the target’s legs and then drop it, causing the foe to take a –10-foot circumstance penalty to their Speeds until they or their allies disentangle the weapon, which takes a total of 2 [[Interact]] actions.
{{||RitualSummaryTable}}
''Cost'' Rare incense worth a total value of 300 gp.
You attempt to learn useful legends about a particular subject, which must be an important person, place, or thing.
If the subject is present, increase the degree of success of your primary skill check by one step.
If you have only vague information about the subject before attempting the ritual, decrease the degree of success of your primary skill check by one step.
These modifiers cancel each other out if you have a subject present with little to no baseline information.
{{||ActionSuccessTable}}
You shield yourself with steel as easily as with faith.
Your proficiency ranks for light, medium, and heavy armor, as well as for unarmored defense, increase to legendary.
''Prerequisites'' Legendary in [[Society]].
Your skill with languages and codes is so great that you can decipher information with little more than a quick read through a text.
You can [[Decipher Writing]] using Society while reading at normal speed.
If you slow down and spend the full amount of time that’s ordinarily required and roll a success, you get a critical success; if you critically succeed while spending the normal amount of time, you gain a nearly word-for-word understanding of the document.
//The PDF index lists this as "Legendary Codebreaking".//
You know the wilderness so well that you can help your party travel through it with ease.
When you are setting the path for your party through wilderness terrain, your party gains a +10-foot circumstance bonus to its Speed for the purpose of calculating the party’s travel speed, your party’s travel speed doesn’t decrease in [[Difficult Terrain]], and greater difficult terrain halves your party’s travel speed instead of reducing it to a third.
This doesn’t increase your party’s Speed during an encounter or allow your party to ignore difficult terrain during an encounter.
''Prerequisites'' Legendary in [[Society]], [[Multilingual]].
You’re so skilled with languages you can create a pidgin instantly.
You can always talk to any creature that has a language—even a language you don’t know— by creating a new pidgin language that uses simplified terms and conveys basic concepts.
To do so, you must first understand at least what medium of communication the creature uses (speech, sign language, and so on).
''Prerequisites'' Legendary in [[Medicine]].
You’ve discovered medical breakthroughs or techniques that achieve miraculous results.
Once per day for each target, you can spend 1 hour treating that target and attempt a Medicine check to remove a [[Disease]] or the [[Blinded]], [[Deafened]], [[Doomed]], or [[Drained]] condition.
Use the DC of the disease or of the spell or effect that created the condition.
If the effect’s source is an artifact, above 20th level, or similarly powerful, increase the DC by 10.
Your knowledge of monsters is so incredible that it reveals glaring flaws in your prey.
Your bonus from [[Monster Hunter[[ (and the bonus from [[Monster Warden]] if you have it) increases from +1 to +2 for you and any allies who benefit.
''Prerequisites'' Legendary in [[Diplomacy]].
You can negotiate incredibly quickly in adverse situations.
You attempt to [[Make an Impression]] and then [[Request]] your opponent cease their current activity and engage in negotiations.
You take a –5 penalty to your Diplomacy check. The GM sets the DC of the Request based on the circumstances—it’s generally at least a very hard DC of the creature’s level.
Some creatures might simply refuse, and even those who agree to parley might ultimately find your arguments lacking and return to violence.
''Prerequisites'' Legendary in [[Performance]], [[Virtuosic Performer]].
Your fame has spread throughout the lands.
NPCs who succeed at a DC 10 [[Society]] check to [[Recall Knowledge]] have heard of you and usually have an attitude toward you one step better than normal, depending on your reputation and the NPC’s disposition. For instance, if you’re well-known for cruel and demanding behavior, creatures might be intimidated by you, rather than be friendly toward you.
When you [[Earn Income]] with Performance, you attract higher-level audiences than your location would allow, as audiences flock to see you. For instance, rulers and angels might travel to your small tower in the woods to hear you perform. Typically, this increases the audiences available by 2 levels or more, determined by the GM.
''Prerequisites'' Legendary in [[Lore]].
Your fame has spread throughout the lands (for instance, if you have Warfare Lore, you might be a legendary general or tactician).
NPCs who succeed at a DC 10 [[Society]] check to [[Recall Knowledge]] have heard of you and usually have an attitude toward you one step better than normal, depending on your reputation and the NPC’s disposition. For instance, if you’re well-known for cruel and demanding behavior, creatures might be intimidated by you, rather than be friendly toward you.
When you [[Earn Income]] with Lore, you attract higher-level jobs than your location would allow, as people flock to consult you. Typically, this increases the jobs available by 2 levels or more, determined by the GM.
You and your mount move like one being, effortlessly reading each other’s signals.
Whenever you are riding your mount, you are [[Quickened]]; you can use the extra action only to command your mount using the Command an Animal skill action.
You focus on your hunted prey, perceiving angles, air resistance, and every variable that would affect your ranged attack.
If you have master proficiency with your ranged weapon, you can ignore the penalty for attacking up to five range increments away when attacking your hunted prey.
''Prerequisites'' Legendary in [[Stealth]], [[Swift Sneak]].
You’re always sneaking unless you choose to be seen, even when there’s nowhere to hide.
You can [[Hide]] and [[Sneak]] even without cover or being concealed.
//When you use the [[Avoid Notice]] exploration activity, you can move at full Speed and use another exploration activity at the same time.//
When you employ an exploration tactic other than [[Avoid Notice]], you also gain the benefits of Avoiding Notice unless you choose not to.
Your proficiency ranks for spell attack rolls and spell DCs in your class's magic tradition increase to legendary.
''Prerequisites'' Legendary in [[Survival]].
You can survive indefinitely without food or water and can endure severe, extreme, and incredible cold and heat without taking damage from doing so.
''Prerequisites'' Legendary in [[Thievery]], [[Pickpocket]].
Your ability to [[Steal]] defies belief.
You can attempt to Steal something that is actively wielded or that would be extremely noticeable or time consuming to remove (like worn shoes or armor).
You must do so slowly and carefully, spending at least 1 minute (and significantly longer for items that are normally time consuming to remove, like armor).
Throughout this duration you must have some means of staying hidden, such as the cover of darkness or a bustling crowd.
You take a –5 penalty to your Thievery check.
Even if you succeed, if the item is extremely prominent—like a suit of full plate armor onlookers will quickly notice it’s gone after you steal it.
You gain a +2 status bonus to your [[Fortitude]] and [[Reflex]] DCs against attempts to [[Shove]] or [[Trip]] you.
You can [[Shove]] creatures even if you don’t have a hand free.
When you successfully Shove a foe, you can [[Stride]] away from your opponent (instead of toward it), but you must move the same distance in the opposite direction from where you Shoved it.
You’ve solved a tiny stepping stone in your self-discovery, awakening new depths in your sight.
You gain [[Darkvision]].
''Prerequisites'' Trained in [[Deception]].
When you critically succeed to [[Create a Diversion]], you continue to remain hidden after the end of your turn.
This effect lasts for an amount of time that depends on the diversion and situation, as determined by the GM (minimum 1 additional round).
You gain a leshy familiar, a Tiny plant that embodies one of the many spirits of nature. Other than taking the form of a plant instead of an animal, this familiar uses all the same rules as other [[Familiar|Familiar (Rule)]].
The leaf order’s secrets allow your familiar to take advantage of its leshy form.
You can select one additional familiar ability each day, which must be one of the following leshy familiar abilities. You can’t select more than one leshy familiar ability at a time.
* ''Grasping Tendrils'' Your familiar can extend vines or similar tendrils, increasing its reach to 15 feet.
* ''Purify Air'' Your familiar recycles air, providing enough oxygen for a Medium creature in areas with stale air, such as a sealed chamber or extradimensional space. If the leshy is within the area of an inhaled poison effect or an effect that relies on smell, creatures within a 15-foot [[Emanation]] from the leshy gain a +2 circumstance bonus to their saving throws against the effect.
* ''Verdant Burst'' When your familiar dies, it releases its primal energy to cast the 3-action version of [[Heal]], heightened to a level 1 lower than your highest-level spell slot. The heal spell gains a status bonus equal to twice the spell’s level to the Hit Points it restores to plants. You must be able to cast 2nd-level spells using spell slots to select this familiar ability.
Using your own leaves, you can control your descent.
You glide slowly toward the ground, 5 feet down and up to 25 feet forward through the air.
As long as you spend at least 1 action gliding each round and have not yet reached the ground, you remain in the air at the end of your turn.
//This is a Leshy Ancestry Feat. "Leshy Lore" may also be a skill, a subtype of the [[Lore]] skill.//
You deeply understand your people’s cultural traditions and innate strengths.
You gain the trained proficiency rank in [[Nature]] and [[Stealth]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Leshy [[Lore]].
''Trigger'' You attempt a saving throw against a spell or magical effect, but haven’t rolled yet.
You notice spirits that inhabit objects, learning which bring good fortune and which are unlucky.
You focus on the power of a lucky object, granting you a +1 circumstance bonus to your saving throw against the triggering effect.
Lethargy poison is commonly used in hit-and-run tactics by drow and others who want their victims alive; the ambusher retreats until the poison sets in and the victim falls unconscious.
Further exposure to lethargy poison does not require the target to attempt additional saving throws; only failing an saving throw against an ongoing exposure can progress its stage.
<p style="border: 1px solid black; padding:2px; background-color: tomato">''Incapacitation effect: All targets of higher level than the effect use the result one better than the save they rolled.''</p>
| !Saving Throw |DC 18 [[Fortitude]] |
| !Onset |Immediate |
| !Maximum Duration |4 hours |
| !Stage 1 |[[Slowed]] 1 (1 round) |
| !Stage 2 |[[Slowed]] 1 (1 minute) |
| !Stage 3 |[[Unconscious]] with no [[Perception]] check to wake up (1 round) |
| !Stage 4 |[[Unconscious]] with no [[Perception]] check to wake up (1d4 hours) |
0:14
1:15
2:16
3:18
4:19
5:20
6:22
7:23
8:24
9:26
10:27
11:28
12:30
13:31
14:32
15:34
16:35
17:36
18:38
19:39
20:40
21:42
22:44
23:46
24:48
25:50
\define levelfeatlist(levels:"", filter:"")
<table>
<tr><th>Level</th><th>Feats</th></tr>
<!--
Outer list of levels-->
<$list filter=<<__levels__>> variable="level">
<tr><th><<level>></th>
<td>
<!--
Inner list of feats-->
<$list filter=<<__filter__>> >
<$list filter="[all[current]field:feat-level<level>sort[]]">
{{||NiceFeatDisplay}}
<!-- New line for next feat -->
<br />
<!-- End of feat list -->
</$list>
</$list>
<!-- End of level list -->
</td></tr>
</$list>
</table>
\end
''Requirements'' You are wielding your staff.
Make a [[Strike]] with your staff.
As long as you don’t critically fail, the target becomes [[Flat-Footed]] and takes a –2 circumstance penalty to its DC against [[Shove]], [[Trip]], and [[Tumble Through]] attempts until the start of your next turn.
{{||SpellSummaryTable}}
You defy gravity and levitate the target 5 feet off the ground.
For the duration of the spell, you can move the target up or down 10 feet with a single action, which has the <<tag Concentrate>> trait.
A creature floating in the air from levitate takes a –2 circumstance penalty to attack rolls.
A floating creature can spend an [[Interact]] action to stabilize itself and negate this penalty for the remainder of its turn.
If the target is adjacent to a fixed object or terrain of suitable stability, it can move across the surface by climbing (if the surface is vertical, like a wall) or crawling (if the surface is horizontal, such as a ceiling).
The GM determines which surfaces can be climbed or crawled across.
''Frequency'' once per minute.
You can cast your spells effortlessly by tapping into the leylines of the world.
If your next action is to [[Cast a Spell]] of 5th level or lower that has no duration, you don’t expend the prepared spell as you cast it.
{{||SpellSummaryTable}}
You call out a liberating cry, urging an ally to break free of an effect that holds them in place.
If the target is [[Grabbed]], [[Immobilized]], or [[Restrained]], it can immediately use a reaction to attempt to [[Escape]].
''Trigger'' An enemy damages, [[Grab]]s, or [[Grapple]]s your ally, and both are within 15 feet of you.
You free an ally from restraint.
If the trigger was an ally taking damage, the ally gains resistance to all damage against the triggering damage equal to 2 + your level.
The ally can attempt to break free of effects [[grabbing|Grabbed]], [[restraining|Restrained]], [[immobilizing|Immobilized]], or [[paralyzing|Paralyzed]] them. They either attempt a new save against one such effect that allows a save, or attempt to [[Escape]] from one effect as a free action.
If they can move, the ally can [[Step]] as a free action, even if they didn’t need to escape.
If you have the Divine Smite ability, if the triggering enemy was using any effects to make your ally grabbed, restrained, immobilized, or paralyzed when you used Liberating Step, that enemy takes persistent good damage equal to your [[Charisma]] modifier.
If you have the Exalt ability, when you use Liberating Step, if your ally doesn’t attempt to break free of an effect, you and all allies within 15 feet can [[Step]], in addition to the triggering ally.
Instead of you taking a [[Step]] at the end of your [[Liberating Step]], the triggering ally can [[Stride]] up to half their Speed.
Even if you have exalt, only the triggering ally gains this benefit.
You’re committed to defending the freedom of others.
* You must never perform acts anathema to your deity or willingly commit an evil act, such as murder, torture, or the casting of an evil spell.
* You must never knowingly harm an innocent, or allow immediate harm to one through inaction when you know you could reasonably prevent it. (This tenet doesn’t force you to take action against possible harm to innocents at an indefinite time in the future, or to sacrifice your life to protect them.)
* You must respect the choices others make over their own lives, and you can’t force someone to act in a particular way or threaten them if they don’t.
* You must demand and fight for others’ freedom to make their own decisions. You may never engage in or countenance slavery or tyranny.
You gain the [[Lay on Hands]] devotion spell. Your champion's reaction is [[Liberating Step]].
Dust salvaged from the remains of a destroyed lich has paralytic properties that make it a valuable poison.
| !Saving Throw |DC 28 [[Fortitude]] |
| !Onset |10 minutes |
| !Maximum Duration |6 minutes |
| !Stage 1 |[[Fatigued]] (1 minute) |
| !Stage 2 |5d6 poison damage and [[Fatigued]] (1 minute) |
| !Stage 3 |5d6 poison damage, [[Fatigued]] and [[Paralyzed]] (1 minute) |
You try to fool someone with an untruth.
Doing so takes at least 1 round, or longer if the lie is elaborate.
You roll a single [[Deception]] check and compare it against the [[Perception]] DC of every creature you are trying to fool. //If they have [[Lie to Me]], they can use their Deception DC instead if it is better.//
The GM might give them a circumstance bonus based on the situation and the nature of the lie you are trying to tell. Elaborate or highly unbelievable lies are much harder to get a creature to believe than simpler and more believable lies, and some lies are so big that it’s impossible to get anyone to believe them.
At the GM’s discretion, if a creature initially believes your lie, it might attempt a Perception check later to [[Sense Motive]] against your Deception DC to realize it’s a lie. This usually happens if the creature discovers enough evidence to counter your statements.
{{||ActionSuccessTable}}
//If you have [[Confabulator]], the bonus the target gets based on previous failed attempts to lie is reduced.//
You’re adept at noticing the tells of a liar—sweat, flushing, a quavering voice, a quickening pulse.
You gain a +1 circumstance bonus to [[Perception]] checks to [[Sense Motive]] and to [[Perception]] DCs against attempts to [[Lie]] to you.
When you determine someone is lying to you, you can use their deceit to your advantage to gain a +1 circumstance bonus to the next [[Deception]], [[Diplomacy]], [[Intimidation]], or [[Performance]] check you attempt against that creature within the next minute.
''Prerequisites'' Trained in [[Deception]].
You can use Deception to weave traps to trip up anyone trying to deceive you.
If you can engage in conversation with someone trying to [[Lie]] to you, use your Deception DC if it is higher than your Perception DC to determine whether they succeed.
This doesn’t apply if you don’t have a back-and-forth dialogue, such as when someone attempts to Lie during a long speech.
{{||MysterySummary}}
Your body is a deep reservoir of life energy. At each level, you gain Hit Points equal to 10 + your Constitution modifier from the oracle class, instead of 8 + your Constitution modifier.
!!! Curse of Outpouring Life
''Minor Curse'' As your life force seeps outward, it becomes more difficult to keep your body functioning. Effects that restore Hit Points to you take a status penalty equal to half your level (minimum 1) to the number of HP you recover.
''Moderate Curse'' The flow of life energy away from you can’t be reversed. In addition to the effects of your minor curse, you can’t be healed by magical effects originating from other creatures. However, if you are unconscious, magical effects can restore you to 1 HP (but no higher). You are affected normally by healing elixirs, potions, and other items. When you cast heal and all your targets are living creatures, you roll d12s instead of d8s for the amount of healing. Whenever you finish casting a non-cantrip spell, you restore Hit Points equal to the spell level to your choice of either one target of the spell or the creature nearest to you. You can’t heal yourself in this way. This healing has the <<Tag Healing>>, <<tag Necromancy>>, and <<tag Positive>> traits, as well as the tradition trait of the spell.
''Major Curse'' Life energy tears through you to empower your magic. Some of your spells carry positive energy with them. Each time you use a spell slot to cast a 5th-level or higher spell that takes 2 or more actions to cast, you disperse positive energy in a 30-foot burst with the effects of a 3-action [[Heal]] spell with a level 4 lower than that of the spell you cast. This healing occurs immediately after you finish Casting the Spell. You don’t benefit from this healing. Instead, you lose double the number of Hit Points rolled for the heal spell.
{{||SpellSummaryTable}}
You temporarily bolster the target’s vitality.
The target gains [[Fast Healing]] equal to double the spell’s level.
''Requirements'' You must be adjacent to a living creature.
You phase through a space that a living creature occupies in a flash, spontaneously appearing on the opposite side of it in a vibrant display of colorful light.
You move from your current location to another location that’s still adjacent to the same living creature, but on the opposite side or corner of the creature’s space.
To determine whether a position is valid, use the same rules as for ][[Flanking]]: a line through the center of the two spaces must pass through opposite sides or corners of the creature’s space.
You pass through the creature’s life force, appearing in the selected location; this doesn’t trigger reactions based on movement.
You must be able to see your destination, and you can’t move farther than your Speed would allow.
{{||SpellSummaryTable}}
You forge a connection of life energy between you and your target, distributing harm between both of you.
When you first Cast the Spell, the target recovers 1d4 Hit Points.
The first time each round that the target takes damage, reduce the damage it takes by 3 (to a minimum of 0 damage). You lose 3 Hit Points each time, or the total damage dealt, if less than 3; this damage ignores any immunities or resistances you have and can’t otherwise be mitigated in any way.
The spell ends immediately if you fall [[Unconscious]].
You can [[Dismiss]] the spell.
''Heightened (3rd)'' You can target 2 creatures other than you. Increase the initial healing to 3d4 and the maximum damage reduced and Hit Points lost to 5.
''Heightened (6th)'' You can target 3 creatures other than you. Increase the initial healing to 6d4 and the maximum damage reduced and Hit Points lost to 10.
''Heightened (9th)'' You can target 4 creatures other than you. Increase the initial healing to 9d4 and the maximum damage reduced and Hit Points lost to 15.
{{||SpellSummaryTable}}
''Trigger'' You expend one of your wizard spell slots to cast a wizard spell of the <<tag Necromancy>> school.
You use some of the spell’s magic to heal yourself, regaining 1d8 Hit Points per level of the spell.
{{||SpellSummaryTable}}
You transcend your physical form, becoming a beacon of healing energy.
Your body exudes [[Bright Light]] like a torch. {{TorchLight}}
You gain resistance 5 to precision damage and weakness 5 to <<tag Negative>> damage, and your unarmed Strikes deal an extra 1d4 <<tag Positive>> damage.
You can touch a living creature with an [[Interact]] action to restore 6d8 Hit Points to it, and when a creature touches you with an Interact action you can allow it to gain the same healing; either way, the creature becomes temporarily immune to life-giving form’s healing for 1 minute. This is a positive healing effect.
You can’t heal yourself with life‑giving form.
A creature harmed by positive damage (such as an undead) that touches you or damages you with an unarmed attack or non‑reach melee weapon instead takes 3d4 positive damage, and it doesn’t become temporarily immune.
You can [[Dismiss]] this spell.
''Heightened (+1)'' Increase the Hit Points restored with an Interact action by 1d8, the positive damage by 1, and the resistance and weakness by 1.
''Frequency'' once per minute.
''Trigger'' You cast an innate spell from a gnome heritage or ancestry feat.
The upwelling of innate magic refreshes your body.
You gain a number of temporary Hit Points equal to half your level (minimum 1) that last until the end of your next turn.
The impulse to survive and continue fighting resonates deep within you.
You gain a circumstance bonus to damage rolls on your melee [[Strike]]s equal to twice the sum of your [[Wounded]] and [[Doomed]] conditions (to a maximum of a +8 circumstance bonus to damage) whenever you have one or both conditions.
You have a limited ability to sense life force, like your psychopomp forebears.
You gain [[Lifesense (Sense)]] as an [[Imprecise]] sense with a range of 10 feet.
This allows you to sense the life force within living creatures and its counterforce that animates the undead, though you can’t distinguish between the two.
Lifesense allows a monster to sense the vital essence of living and undead creatures within the listed range.
The sense can distinguish between the positive energy animating living creatures and the negative energy animating undead creatures, much as sight distinguishes colors.
{{||SpellSummaryTable}}
The object glows, casting bright light in a 20-foot radius and dim light for the next 20 feet, like a [[Torch]].
If you cast this spell again on a second object, the light spell on the first object ends.
''Heightened (4th)'' The object sheds bright light in a 60-foot radius and dim light for the next 60 feet.
You’ve learned how to dodge while wearing light or no armor.
Your proficiency ranks for light armor and unarmored defense increase to expert.
Your skill with light armor improves, increasing your ability to dodge blows.
Your proficiency ranks for light armor and unarmored defense increase to master.
As long as the monster is in an area of bright light, it’s [[Dazzled]].
When first exposed to bright light, the monster is [[Blinded]] until the end of its next turn.
After this exposure, light doesn’t blind the monster again until after it spends 1 hour in darkness. //(It does still dazzle it.)//
You’ve battled the fiendish power within your nature and come out on top; whatever you decide to do with your life, for good or evil, will be your choice and your choice alone. This struggle has granted you powerful resistance against the divine.
You gain a +1 circumstance bonus to all saving throws against <<tag Divine>> effects.
{{||SpellSummaryTable}}
You shed a luminous aura, illuminating a 30-foot radius with bright light.
You and all allies in this area gain a +1 status bonus to Perception checks to detect [[Hidden]] or [[Undetected]] creatures, as well as [[Hidden]] objects, doors, and other features.
You can balance on your toes to step carefully over obstructions.
You [[Stride]] and then [[Step]], or [[Step]] and then [[Stride]], ignoring [[Difficult Terrain]] during this movement.
You aren’t bothered by tricky footing.
When you [[Stride]] or [[Step]], you can ignore [[Difficult Terrain]].
Your body is almost as flexible as your shadow.
When you critically fail at [[Squeezing|Squeeze]] you get a failure instead.
Additionally, when you roll a success at an [[Escape]] check, you get a critical success instead. If you roll a critical success, you can [[Step]] instead of Striding up to 5 feet.
{{||SpellSummaryTable}}
A bolt of lightning strikes outward from your hand, dealing 4d12 <<tag Electricity>> damage //with a basic [[Reflex]] save//.
''Heightened (+1)'' The damage increases by 1d12.
Your reflexes are lightning fast.
Your proficiency rank for [[Reflex]] saves increases to expert.
You can rig a trap with incredible speed.
When you create a snare that normally takes 1 minute to Craft, you can [[Craft]] it using a single [[Interact]] action instead.
{{||SpellSummaryTable}}
You create a black, rumbling storm cloud and call down one lightning bolt.
The bolt is a vertical line from the storm cloud to the ground below, dealing 4d12 electricity damage to creatures in the spell’s area (basic [[Reflex]] save).
The first time you [[Sustain the Spell|Sustain a Spell]] each round, you can call another lightning bolt within the area.
If you Cast this Spell outdoors, you can create two non-overlapping clouds instead of one, though you can still call down only one bolt per turn.
''Heightened (+1)'' The damage of each bolt increases by 1d12.
Your tongue darts out faster than the eye can see to retrieve loose objects.
You [[Interact]] to pick up a single unattended object of light Bulk or less within 10 feet of you. If you don’t have enough hands free to hold the object, it falls to the ground in your space.
''Prerequisites'' tenets of evil.
You’ve sworn to rid the world of the self‑righteousness of celestial beings.
Add the following tenet to your code, after the other tenets. “You must banish or slay celestials you encounter as long as you have a reasonable chance of success; in the incredibly unlikely event you find an evil celestial, you don’t have to banish or kill it.”
When you use your champion’s reaction against a celestial, the extra damage you deal with [[Strike]]s increases by 1 (or by 2 at 9th level and by 3 at 16th level).
You can cast [[Detect Magic]] as an occult innate cantrip heightened to half your level, rounded up. You also gain a +1 circumstance bonus to [[Occultism]] checks to [[Recall Knowledge]] about creatures that originated outside of the Material Plane.
You gain a +1 circumstance bonus to locate undetected creatures within 60 feet when using the [[Seek]] action. Your flat check to target [[Concealed]] creatures is DC 3 instead of DC 5, and your flat check to target [[Undetected]] creatures is DC 9 instead of DC 11.
A line shoots forth from you in a straight line in a direction of your choosing.
The line affects each creature whose space it overlaps.
Unless a line effect says otherwise, it is 5 feet wide. For example, the lightning bolt spell’s area is a 60-foot line that’s 5 feet wide.
{{||SpellSummaryTable}}
''Prerequisites'' [[Maestro Muse]].
You add a flourish to your composition to extend its benefits.
If your next action is to cast a cantrip composition with a duration of 1 round, attempt a [[Performance]] check.
The DC is usually a standard-difficulty DC of a level equal to the highest‑level target of your composition, but the GM can assign a different DC based on the circumstances.
The effect depends on the result of your check.
{{||ActionSuccessTable}}
//This can work on: <<bulletlist "[tag[Cantrip]tag[Composition]field:m-duration[1 round]]">>//
''Prerequisites'' You speak at least three languages.
You have studied languages and their development.
You become trained in [[Society]]; if you were already trained in Society, you instead become an expert in Society.
You gain the [[Multilingual]] skill feat twice.
<<archetypefeatlist "4 6 7 8" "Linguist">>
An effect with this trait depends on language comprehension.
A linguistic effect that targets a creature works only if the target understands the language you are using.
''Prerequisites'' You must specialize in an arcane school.
''Frequency'' once per day
You have linked your bonded item to the well of energy that powers your school spells.
When you Drain your Bonded Item to cast a spell of your arcane school, you also regain 1 Focus Point.
{{LOWGFeat}}
Your lion blade spy training helps you conceal yourself and your identity.
You become trained in your choice of [[Deception]] or [[Stealth]] and in Espionage [[Lore]]; if you were already trained, you become an expert instead.
You never take circumstance penalties for attempting to take a disguise of a different ancestry, age, and so on, as long as the disguised form is appropriate for your size.
<<archetypefeatlist "4 6 10 12" "[[Lion Blade]]">>
Litanies are special devotion spells, typically used by champions and requiring a single action, that usually give temporary immunity to further litanies.
{{||SpellSummaryTable}}
Your litany rails against the sin of sloth, interfering with the target’s ability to react.
The target must attempt a [[Will]] save.
A particularly slothful creature, such as a sloth demon, uses the outcome one degree of success worse than the result of its saving throw.
The target becomes temporarily immune to all of your litanies for 1 minute.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
Your litany rails against the sin of wrath, punishing the target for attacking good creatures.
The target must attempt a [[Will]] save.
A particularly wrathful creature, such as a wrath demon, uses the outcome one degree of success worse than the result of its saving throw.
The target then becomes temporarily immune to all of your litanies for 1 minute.
''Heightened (+1)'' The damage increases by 1d6.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
''Prerequisites'' Tenets of Evil.
Your litany calls into question the morals your foe claims to hold dear.
The target gains [[Weakness]] 7 to evil, then becomes temporarily immune to all your litanies for 1 minute.
''Heightened (+1)'' The weakness increases by 1.
{{||SpellSummaryTable}}
Your litany denounces an evildoer, rendering it susceptible to the powers of good.
The target gains [[Weakness]] 7 to good.
The target then becomes temporarily immune to all of your litanies for 1 minute.
''Heightened (+1)'' The weakness increases by 1.
{{||SpellSummaryTable}}
''Requirements'' Devotion spells, tenets of evil.
You give a speech that fills your target with a drive to improve themself to the exclusion of assisting others.
//The target makes a [[Will]] saving throw. If they succeed, they are not affected.// A creature that wants to gain the benefit of this spell and doesn’t care about its limitations can voluntarily fail the save.
If a creature fails or critically fails, they gain a +2 status bonus to attack rolls, [[Perception]] checks, saving throws, and skill checks. The target can’t [[Aid]] other creatures, consider any creature an ally, or use spells or abilities that directly benefit another creature (as determined by the GM), even if they also benefit the target.
Other creatures allied with the spell’s target can still consider the target an ally and affect it accordingly.
''Heightened (8th)'' The status bonus increases to +3.
You can instantly grow or shrink your hair, eyebrows, beard, or mustache by up to several feet and manipulate your hair for use as a weapon, though your control isn’t fine enough for more dexterous tasks.
You gain a hair unarmed attack that deals 1d4 bludgeoning damage; is in the brawling group; and has the [[Agile]], [[Disarm]], [[Finesse]], [[Trip]], and [[Unarmed]] traits.
{{LOWGFeat}}
You’ve begun to inscribe a magical stone called a ka stone that you will some day tie to your soul. You gain knowledge of Ancient Osirion and a connection to your nascent ka stone.
If you fail a recovery check while [[Dying]], your dying condition does not increase; if you critically fail, your dying condition increases by only 1.
You become trained in Ancient Osirion [[Lore]], or expert if you were already trained.
<<archetypefeatlist "4 6 8 10 12 14" "[[Living Monolith]]">>
{{LOWGFeat}}
You’ve bridged a connection between the runes on your body and the magic of runestones, allowing you to place an armor rune on your living flesh.
Your body can hold a single property rune; you can’t etch a property rune on your body if it has requirements on the type or category of armor or if the property would affect the armor instead of its wearer.
If you wear armor, you gain the property rune’s effects in addition to any effects of that armor.
You’ve learned to use part of your form as a weapon.
When you select this feat, you gain a claws unarmed attack that deals 1d4 slashing damage and has the [[Agile]] and [[Finesse]] traits; a horn, jaws, or tusk unarmed attack that deals 1d6 piercing damage and has the [[Versatile]] S trait; or a tail unarmed attack that deals 1d6 bludgeoning damage and has the [[Backswing]] trait. Each of these unarmed attacks is in the brawling weapon group.
Your features are mutable; you can select this feat at any level, and you can retrain into or out of this feat or change the type of attack you gain.
''Special'' You can take this feat multiple times. Each time you do, select a new attack from the options above.
Your sharp claws offer an alternative to the fists other humanoids bring to a fight.
You have a claw unarmed attack that deals 1d4 slashing damage and has the [[Agile]] and [[Finesse]] traits.
//This is a Lizardfolk Ancestry Feat. Lizardfolk Lore is also a skill, a subtype of the [[Lore]] skill.//
You listened carefully to the tales passed down among your community.
You gain the trained proficiency rank in [[Nature]] and [[Survival]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Iruxi [[Lore]].
You make a thrown ranged [[Strike]] with the required weapon, using the weapon’s normal range increment.
This attack doesn’t trigger reactions, and if the target has never seen you use this feat before, the target is [[Flat-Footed]] against this attack.
{{||SpellSummaryTable}}
You shake the earth, toppling nearby creatures.
Choose whether the spell’s area is a 15-foot emanation or a 15-foot cone when you cast it.
Each creature in the area standing on solid ground may take 4d6 bludgeoning damage //with a basic [[Reflex]] saving throw.//
//Any creature that rolls a failure or critical failure on the basic Reflex save also falls [[Prone]].//
''Heightened (+1)'' Increase the damage by 2d6.
{{||SpellSummaryTable}}
You learn the direction to the target (if you picked a specific object, such as “my mother’s sword”) or the nearest target (if you picked a type of object, such as “swords”).
If the target is a specific object, you must have observed it directly with your own senses. If it’s a type of object, you still need to have an accurate mental image of the type of object.
If there’s lead or running water between you and the target, this spell can’t locate the object. This means you might find a type of object farther away if the nearest one is behind lead or running water.
''Heightened (5th)'' You can target a specific creature or ancestry instead of an object, but you must have met or seen up close the creature or ancestry you want to target.
Your pursuit is relentless, and you are able to magically locate stolen objects and outlaws.
You gain [[Locate]] as an innate spell of a tradition of your choice, which you can cast once per day.
If you are a member of the Order of the Gate, when you reach 14th level, the spell is heightened to 5th level.
//This feat has specific setting requirements described in the Lost Omens Character Guide.//
{{||SpellSummaryTable}}
The target’s latch mechanism clinks shut, held fast by unseen magical restraints.
When you magically lock a target, you set an [[Athletics]] and [[Thievery]] DC to open it equal to your spell DC or the base lock DC with a +4 status bonus, whichever is higher.
Any key or combination that once opened a lock affected by this spell does not do so for the duration of the spell, though the key or combination does grant a +4 circumstance bonus to checks to open the door.
If the target is opened, the spell ends.
Assuming the target is not barred or locked in some additional way, you can unlock and open it with an [[Interact]] action during which you touch the target.
This does not end the spell.
You can [[Dismiss]] this spell at any time and from any distance.
Heightened (2nd) The duration increases to unlimited, but you must expend 6 gp worth of gold dust as an additional cost.
''Requirements'' You and an adjacent creature are both on a narrow surface or uneven ground and the other creature is [[Flat-Footed]].
You shuffle your feet to dislodge the surface beneath you or otherwise cause your opponent to become unsteady.
Attempt an [[Acrobatics]] check against the adjacent creature’s [[Reflex]] saving throw DC. On a success, the creature falls. On a critical failure, you fall.
You [[Stride]], then make a horizontal [[Leap]] and attempt an [[Athletics]] check to increase the length of your jump.
//If you have [[Quick Jump]], you can Long Jump as a single action but you don't Stride.//
The DC of the Athletics check is equal to the total distance in feet you’re attempting to move during your Leap (so you’d need to succeed at a DC 20 check to Leap 20 feet). You can’t Leap
farther than your Speed. This DC might be increased or decreased due to the situation, as determined by the GM.
If you didn’t Stride at least 10 feet, or if you attempt to jump in a different direction than your Stride, you automatically fail your check //unless you have [[Quick Jump]]//.
//If you have [[Wall Jump]], you can jump a second time off a wall as a single action.//
//If you have [[Cloud Jump]], you jump a number of feet equal to the DC you roll ''tripled'', limited to your Speed times the number of actions you spent jumping.//
{{||ActionSuccessTable}}
You can transform into a specific, curious-looking human form.
This human form is the same age and body type as your tengu form and has roughly analogous physical traits, such as height, though your nose remains as long as your beak and your complexion has red undertones, no matter the skin color of your human form.
Using Long-Nosed Form counts as creating a disguise for the [[Impersonate]] use of [[Deception]].
Due to your imperfect transformation, your transformation doesn’t automatically defeat [[Perception]] DCs to determine whether you are human, though you may be able to explain away or hide your tengu traits. //The meaning of this is unclear, as no form of Impersonate "automatically defeats" Perception.//
You lose your beak unarmed [[Strike]] in your human form, as well as any other unarmed Strikes you gained from a tengu heritage or ancestry feat.
You can remain in your human form indefinitely, and you can shift back to your tengu form by using this action again.
You gain imprecise [[Scent]] with a range of 30 feet. This means you can use your sense of smell to determine a creature’s location. The GM will usually double the range if you’re downwind from the creature or halve the range if you’re upwind.
In addition, you gain a +2 circumstance bonus to [[Perception]] checks to [[Seek]] a creature or object within the range of your scent.
{{||SpellSummaryTable}}
You lengthen your stride beyond what should be possible.
You gain a +10-foot status bonus to your Speed.
''Heightened (2nd)'' The duration increases to 8 hours.
''Key Ability'' [[Intelligence]].
You have specialized information on a narrow topic.
Lore features many subcategories. You might have Military Lore, Sailing Lore, Vampire Lore, or any similar subcategory of the skill.
Each subcategory counts as its own skill, so applying a skill increase to Planar Lore wouldn’t increase your proficiency with Sailing Lore, for example.
You gain a specific subcategory of the Lore skill from your background. The GM determines what other subcategories they’ll allow as Lore skills, though these categories are always less broad than any of the other skills that allow you to Recall Knowledge, and they should never be able to fully or mainly take the place of another skill’s Recall Knowledge action. For instance, Magic Lore wouldn’t enable you to recall the same breadth of knowledge covered by Arcana, Adventuring Lore wouldn’t simply give you all the information an adventurer needs, and Planar Lore would not be sufficient to gain all the information spread across various skills and subcategories such as Heaven Lore.
If you have multiple subcategories of Lore that could apply to a check or that would overlap with another skill in the circumstances, you can use the skill with the better skill modifier or the one you would prefer to use.
If there’s any doubt whether a Lore skill applies to a specific topic or action, the GM decides whether it can be used or not.
''Lore types suggested in backgrounds:'' <$list filter="[each[bg-lore]sort[bg-lore]]"><$link>{{!!bg-lore}}</$link>, </$list>
''Lore types suggested in other abilities:'' <$list filter="[each:list-item[lore-mention]sort[]]"><<currentTiddler>>, </$list>
{{||SkillActionList}}
{{||SkillFeatList}}
{{||MysterySummary}}
You hold more mystical knowledge within you than most. You have one additional spell in your repertoire of each level you can cast. This Mystery also provides training in an extra Lore skill.
!!! Curse of Torrential Knowledge
''Minor Curse'' You take a –4 penalty to initiative, as trying to process a surge of information about what’s happening around you slows your ability to respond to it.
''Moderate Curse'' The flow of information through your mind grows. The attention you divert to process this huge influx of information means you are always [[Flat-Footed]]. At the start of each of your turns, you automatically make one check to [[Recall Knowledge]] as a free action. This uses a skill of your choice that has the [[Recall Knowledge]] action, using a result equal to 10 + your proficiency bonus in that skill (with no other bonuses, penalties, or modifiers).
''Major Curse'' The massive flow of information clouding your mind overwhelms your ability to communicate with others. You can understand all languages, but you can’t speak, use <<tag Linguistic>> effects, or otherwise communicate with your allies. If you Cast a Spell with a verbal component, you must succeed at a DC 5 flat check or the spell is lost. You gain a +4 status bonus on saving throws against linguistic effects.
You see what others don’t, and you’ve developed magical tricks to find hidden truth.
You can cast [[Comprehend Language]], [[Restore Senses]], and [[See Invisibility]] as innate spells, each once per day.
If you could already cast spells, these spells are of the same tradition. Otherwise, they are arcane spells, you use [[Intelligence]] as your spellcasting ability, and you become trained in spell attack rolls and spell DCs for arcane spells.
''Prerequisites'' trained in at least one skill to Decipher Writing.
You’ve compiled a vast repository of information that touches on nearly every subject.
You are trained in Loremaster [[Lore]], a special Lore skill that can be used only to [[Recall Knowledge]], but on any topic.
If you have legendary proficiency in a skill used to Decipher Writing, you gain expert proficiency in Loremaster Lore, but you can’t increase your proficiency rank in Loremaster Lore by any other means.
You can take feats in the loremaster’s additional feats entry even if you don’t meet the enigma muse prerequisite.
If you have the [[Bardic Lore]] class feat, you gain a +1 circumstance bonus to skill checks with Bardic Lore.
<<archetypefeatlist "4 8 10 14 16" "Loremaster">>
{{||SpellSummaryTable}}
''Prerequisites'' [[Enigma Muse]].
''Trigger'' You or an ally within range attempts a skill check to [[Recall Knowledge]].
You call upon your muse’s deep mysteries, granting the target a greater ability to think and recall information.
Roll the triggering Recall Knowledge skill check twice and use the better result.
{{LOWGFeat}}
You’ve learned how to move as one with crowds and hide among them, vanishing into a busy street in the blink of an eye.
You move at full Speed in crowds and can use cover from crowds to [[Hide]] and [[Sneak]], gaining a +2 circumstance bonus on your [[Stealth]] checks when in a crowd of at least 10 creatures and a +4 circumstance bonus on your [[Stealth]] checks when in a crowd of at least 100 creatures.
You can walk on the surface of still water and other non-damaging liquids, moving at half your normal Speed. You can attempt to walk along the surface of flowing water as well, still moving at half Speed, but doing so requires a successful [[Acrobatics]] check to [[Balance]] using the DC of a [[Swim]] check to move through the water; on a failure, you fall into the water. This Acrobatics check doesn’t use an action.
Staying on pitch, proper breath control, and remembering the words are all less important than the real measure of a good singer: volume!
The range of your [[Goblin Song]] is increased to 60 feet, and you can target one additional enemy when you use it.
The creature can see in dim light as though it were bright light.
It ignores the [[Concealed]] condition due to dim light.
//This feat has specific setting requirements described in the Lost Omens World Guide.//
You have incredible empathy for your friends and family, and you have an innate timing for helping others in distress.
You can use the [[Aid]] reaction to grant a bonus to another creature’s [[Will]] saving throw.
As usual for Aid, you need to prepare by using an action on your turn to encourage the creature to bravely withstand the effect.
''Prerequisites'' [[Divine Ally]] (steed)
You and your mount have grown closer, and your loyalty to each other is unbreakable.
The mount you gained through the divine ally class feature is now a mature animal companion.
In addition, your mount never attacks you, even if it is magically compelled to do so.
You catch yourself as you make a mistake.
You can trigger [[Cat's Luck]] when you fail or critically fail on an [[Athletics]] or [[Acrobatics]] skill check, in addition to its normal trigger.
When you do, you reroll the triggering skill check and use the better result.
This still counts against Cat’s Luck’s frequency, as normal.
{{||SpellSummaryTable}}
''Trigger'' You fail (but don’t critically fail) a saving throw.
Reroll the saving throw and use the better result. You then become temporarily immune for 10 minutes.
You have a keepsake that grants you luck.
You gain a +1 circumstance bonus to saves against spells and magical effects at all times, not just when you use [[Leshy Superstition]].
If you lose the keepsake, you lose the bonus until you designate a new keepsake, typically over the course of a week.
You naturally shed light as a torch; this light has the <<tag Evocation>>, <<tag Light>>, and <<tag Primal>> traits. {{TorchLight}} You can extinguish, rekindle, or change the color of this light using a single action, which has the <<tag Concentrate>> trait.
''Requirement'' You are wielding a melee weapon.
Extending your body to its limits, you attack an enemy that would normally be beyond your reach.
Make a [[Strike]] with a melee weapon, increasing your reach by 5 feet for that Strike.
If the weapon has the [[Disarm]], [[Shove]], or [[Trip]] trait, you can use the corresponding action instead of a Strike.
''Requirement'' You are wielding a melee weapon.
Your body coiled to strike, you can lash out at distant enemies.
While you are in this stance, you can use [[Attack of Opportunity]] against a creature that is outside your reach but within the reach you would have with a [[Lunge]].
If you do, you increase your range with the Strike by 5 feet.
{{||SpellSummaryTable}}
Magical monkey spirits fill the area as they pile and climb on top of one another.
Because the monkeys are magical spirits, they can’t be attacked or hurt.
Casting [[Calm Emotions]] or a similar effect over the monkeys makes them docile, causing them to cease making mischief for the duration of mad monkeys.
Choose the kind of mischief your monkeys make when you Cast the Spell. They produce the effect listed for that mischief when you Cast the Spell and each round when you [[Sustain the Spell|Sustain a Spell]]. When you Sustain the Spell, you can move the area of the monkeys by 5 feet.
* ''Flagrant Burglary'' The monkeys try to [[Steal]] any one item from one creature in the area. Use your spell DC – 10 as the monkeys’ [[Thievery]] modifier. Their attempt relies more on distraction than subtlety, so the victim knows what item the monkeys were trying to take and whether it was taken. Getting a stolen item from the monkeys—even for the caster—requires Stealing it from them or [[Disarm]]ing them, using your spell DC. When the spell ends, any stolen items fall to the ground in any square of the spell’s area you choose.
* ''Raucous Din'' The monkeys screech loudly, potentially deafening creatures in the spell’s area. Each creature in the spell’s area must attempt a [[Fortitude]] save.
| !Critical Success |The creature is unaffected and is temporarily immune for 10 minutes. |
| !Success |The creature is unaffected. |
| !Failure |The creature is [[Deafened]] for 1 round. |
| !Critical Failure |The creature is [[Deafened]] for 1 minute. |
* ''Tumultuous Gymnastics'' The monkeys jump and climb all over creatures in the spell’s area, interfering with complex movements. Each creature in the spell’s area must attempt a [[Reflex]] save.
| !Critical Success |The creature is unaffected and is temporarily immune for 10 minutes. |
| !Success |The creature is unaffected. |
| !Failure |For 1 round, the creature must succeed at a DC 5 flat check whenever it attempts a <<tag Manipulate>> action. If it fails this check, the creature loses that action. |
| !Critical Failure |As failure, but the monkeys cling to the creature tenaciously, and the effect lasts until the spell ends, even if the creature leaves the spell’s area. |
Your muse is a virtuoso, inspiring you to greater heights. If it’s a creature, it might be a performance-loving creature such as a choral angel or lillend azata; if a deity, it might be //a god of music//. As a bard with a maestro muse, you are an inspiration to your allies and confident of your musical and oratorical abilities.
You gain the [[Lingering Composition]] feat and add [[Soothe]] to your spell repertoire.
A maestro’s instrument can be crafted in the form of any variety of handheld musical instrument.
A maestro’s instrument grants you a +1 item bonus to [[Performance]] checks while playing music with the instrument.
''Activate'' {{TwoAction}} [[Interact]]; ''Frequency'' once per day; ''Effect'' You play the instrument, causing it to cast a DC 17 [[Charm]] spell.
''Craft Requirements'' You must supply a casting of [[Charm]] of the appropriate level.
| !Type | !Level | !Price | !Item Bonus | !Charm Heighten | !Charm DC |
| Lesser | 3 | 600 | +1 | None | 17 |
| Moderate | 10 | 9000 | +2 | 4th | 27 |
| Greater | 18 | 190000 | +3 | 8th | 38 |
{{LOCGFeat}}
You devote much of your study to halcyon magic.
You gain the ability to cast a single arcane or primal cantrip of your choice, (as is normal for cantrips, it is heightened to a spell level equal to half your level, rounded up).
If you weren’t already, you become trained in that tradition’s spell DCs and spell attack rolls, with [[Intelligence]] as your spellcasting ability if you choose arcane or [[Wisdom]] as your spellcasting ability if you choose primal.
Regardless of whether you choose an arcane or primal cantrip, you also either become trained in [[Arcana]] or [[Nature]], or an expert in one of those skills in which you were already trained.
When you gain this feat, choose to affiliate with the Cascade Bearers, Emerald Boughs, Rain Scribes, Tempest-Sun Mages, or Uzunjati. This grants you additional feats available to only that branch.
''Special'' //You can select Halcyon Speaker Dedication even if you haven't gained two feats from Magaambyan Attendant.//
<<archetypefeatlist "4 6 10" "[[Magaambyan Attendant]]">>
{{||SpellSummaryTable}}
You ward yourself with shimmering magical energy, gaining a +1 item bonus to [[AC]] and a maximum [[Dexterity]] modifier of +5.
While wearing mage armor, you use your unarmored proficiency to calculate your AC.
''Heightened (4th)'' You gain a +1 item bonus to saving throws.
''Heightened (6th)'' The item bonus to AC increases to +2, and you gain a +1 item bonus to saving throws.
''Heightened (8th)'' The item bonus to AC increases to +2, and you gain a +2 item bonus to saving throws.
''Heightened (10th)'' The item bonus to AC increases to +3, and you gain a +3 item bonus to saving throws.
{{||SpellSummaryTable}}
You create a single magical hand, either invisible or ghostlike, that grasps the target object and moves it slowly up to 20 feet.
Because you’re levitating the object, you can move it in any direction.
When you [[Sustain the Spell|Sustain a Spell]], you can move the object an additional 20 feet. If the object is in the air when the spell ends, the object falls.
''Heightened (3rd)'' You can target an unattended object with a [[Bulk]] of 1 or less.
''Heightened (5th)'' The range increases to 60 feet, and you can target an unattended object with a Bulk of 1 or less.
''Heightened (7th)'' The range increases to 60 feet, and you can target an unattended object with a Bulk of 2 or less.
''Trigger'' A creature within your reach [[Casts a Spell|Cast a Spell]].
You use your hatred of magic to lash out at the sight of spellcasting, allowing you to interrupt an enemy’s spell.
Make a melee [[Strike]] against the triggering creature.
If the attack is a critical hit, you disrupt the spell.
A suit of magic armor is simply a suit of armor or explorer’s clothing etched with fundamental runes. An armor potency rune increases the armor’s item bonus to AC, and a resilient rune adds an item bonus to saving throws.
The Prices here are for all types of armor. You don’t need to adjust the Price from leather armor to full plate or the like. These armors are made of standard materials, not precious materials such as mithral.
//The levels and prices below are exactly those of the required combination of runes. These can be taken as "example builds" of applying runes to armor.//
| !Type | !Level | !Price | !Runes |
| +1 | 5 | 1600 | +1 [[Armor Potency]] |
| +1 Resilient | 8 | 5000 | +1 [[Armor Potency]] and [[Resilient]] |
| +2 Resilient | 11 | 14000 | +2 [[Armor Potency]] and [[Resilient]] |
| +2 Greater Resilient | 14 | 45000 | +2 [[Armor Potency]] and Greater [[Resilient]] |
| +3 Greater Resilient | 18 | 240000 | +3 [[Armor Potency]] and Greater [[Resilient]] |
| +3 Major Resilient | 20 | 700000 | +3 [[Armor Potency]] and Major [[Resilient]] |
''Frequency'' once per round
You imbue your ammunition with eldritch power.
When you select this feat, choose three types of common magical ammunition of 4th level or lower from the Core Rulebook or the Advanced Players Guide. Your GM might allow you to choose from other types of magical ammunition, such as uncommon ammunition, or ammunition from other books.
When using [[Magic Arrow]], you transform a non-magical arrow or bolt into a piece of ammunition of one type you chose.
You must shoot the ammunition before the end of your turn or the magic dissipates.
If the ammunition has an Activate entry, you still need to spend the required actions to activate the ammunition before shooting it.
When you use Magic Arrow, you can choose a type of magical ammunition that is typically not available to the type of ammunition you’re using—for example, you can use climbing bolt on an arrow, even though that magical ammunition is normally only found on bolts.
You can select this feat multiple times. Each time you do, select three additional types of ammunition as described above.
{{||SpellSummaryTable}}
You alter the appearance of an item’s magic aura.
You can choose to have the target’s aura appear as that of common magic item of twice magic aura’s level or lower, or to have it register as being under the effects of a spell of your choice of magic aura’s level or lower.
If the target is magical, you can instead choose to have it appear as entirely non-magical.
A caster using [[Detect Magic]] or study aura (//they probably mean [[Read Aura]]//) of an equal or higher spell level can attempt to disbelieve the illusion from magic aura.
Magic aura doesn’t mask the aura of spells that are 9th level or higher or of items that are 19th level or higher.
''Heightened (3rd)'' You can target a creature instead of an object. When you do, you can either conceal the auras of all magic items it has or have that creature’s aura appear as if it were under the effect of a spell you know.
{{||SpellSummaryTable}}
Choose one of the target’s unarmed attacks.
You cause that unarmed attack to shine with primal energy.
The unarmed attack becomes a +1 [[Striking]] unarmed attack, gaining a +1 item bonus to attack rolls and increasing the number of damage dice to two __if it only had one__.
The blessing of your deity heightens your healing ability, making your mundane healing work as if by magic.
When you succeed at a [[Medicine]] check to [[Treat Wounds]], your action gains the divine trait and you heal the maximum amount for the 2d8 (or 4d8 on a critical success).
If you have an ability that adds additional dice to your [[Treat Wounds]], you still roll those normally.
{{||SpellSummaryTable}}
Your animal companion grows a thicker hide, matted fur, or a harder shell, granting it a +1 status bonus to AC.
{{||SpellSummaryTable}}
You send a dart of force streaking toward a creature that you can see.
It automatically hits and deals 1d4+1 <<tag Force>>damage.
For each additional action you use when Casting the Spell, increase the number of missiles you shoot by one, to a maximum of three missiles for 3 actions.
You choose the target for each missile individually.
If you shoot more than one missile at the same target, combine the damage before applying bonuses or penalties to damage, resistances, weaknesses, and so forth.
//If you shoot only one missile, this spell is {{OneAction}} but it still has both Verbal and Somatic components. This is an exception to the usual rules for number of actions to cast.//
''Heightened (+2)'' You shoot one additional missile with each action you spend.
{{||SpellSummaryTable}}
You specify a trigger and a message up to 25 words long.
When the specified trigger occurs within 30 feet of the target, an illusory mouth appears on the target and speaks the message, and the magic mouth spell ends.
//Because the mouth is an illusion, a target immune to illusions may miss the message!//
Your people used powerful magic to travel between distant worlds, and the remnants of that magic make such transportation easier for you.
When you are the target of a <<tag Teleportation>> spell that transports more than one person, it can affect an additional person beyond the normal limit, chosen by the caster.
Additionally, when you’re the target of a [[Teleport]] spell, you and the other targets arrive no farther than 1 mile off target, regardless of distance traveled.
You have a literal sixth sense for ambient magic in your vicinity.
You can sense the presence of magic auras as though you were always using a 1st-level [[Detect Magic]] spell. This detects magic in your field of vision only.
When you [[Seek]], you gain the benefits of a 3rd-level detect magic spell on things you see (in addition to the normal benefits of Seeking).
You can turn this sense off and on with a free action at the start or the end of your turn.
{{||SpellSummaryTable}}
//You can use 1 to 3 actions to cast this spell. Regardless of how many you use, it always has Somatic and Verbal components.//
You pour positive energy into ordinary stones, granting them temporary magical properties.
You can target 1 non-magical stone or sling bullet for every action you use Casting this Spell. The stones must be unattended or carried by you or a willing ally.
The stones become +1 [[Striking]] [[Disrupting]] sling bullets.
Each stone can be used only once, after which it crumbles to dust.
This baton is about a foot long and contains a single spell. The appearance typically relates to the spell within..
A wand contains a spell that can be cast once per day.
Casting a spell from a wand requires holding the wand in one hand and activating the item with a [[Cast a Spell]] activity using the normal number of actions for the spell.
To cast a spell from a wand, it must be on your spell list. Because you’re the one casting the spell, use your spell attack roll and spell DC. The spell is of your tradition.
A spell cast from a wand doesn’t require physical material components, but you must replace any material component normally required to cast the spell with a somatic component.
If the spell requires a focus, you must still have that focus to cast the spell from a wand, and if the spell has a cost, you must still pay that cost to cast the spell from a wand.
After the spell is cast from the wand for the day, you can cast it one more time—overcharging the wand at the risk of destroying it. [[Cast the Spell|Cast a Spell]] again, then roll a DC 10 flat check. On a success, the wand is broken. On a failure, the wand is destroyed.
If anyone tries to overcharge a wand when it’s already been overcharged that day, the wand is automatically destroyed (even if it had been repaired) and no spell is cast.
A wand’s base statistics are the same unless noted otherwise in a special wand. It has light Bulk, and must be held in one hand to be activated. Each wand contains a specific level of the spell, but you can craft a wand with a heightened version of a spell.
Each type of wand has a Level and Price determined by the spell’s level. The wand’s rarity matches the spell’s rarity, and it has its spell’s traits. A wand has the normal Hardness, BT, and HP of a thin item of its material.
''Craft Requirements'' Supply a listed-level casting of the spell.
| !Spell Level | !Wand Level | !Wand Price |
| 1st | 3 | 600 |
| 2nd | 5 | 1600 |
| 3rd | 7 | 3600 |
| 4th | 9 | 7000 |
| 5th | 11 | 15000 |
| 6th | 13 | 30000 |
| 7th | 15 | 65000 |
| 8th | 17 | 150000 |
| 9th | 19 | 400000 |
{{||SpellSummaryTable}}
You call upon the aspect of the animal from your mask, gaining physical features reminiscent of that animal.
You morph slightly into that creature, gaining the Speeds and senses you would gain from using [[Animal Form]] to turn into the type of animal your mask represents; these special Speeds can’t be increased by status bonuses or item bonuses.
{{LOWGFeat}}
''Prerequisites'' ability to cast focus spells.
You have taken up a nameless mask and sworn the oath of the magic warriors.
You become trained in your choice of [[Arcana]] or [[Nature]] and in Magic Warrior [[Lore]]; if you were already trained in the skill, you become an expert instead.
You hide your identity behind a mask representing an animal of your choice, corresponding to one of the general animal types in the [[Animal Form]] spell.
You gain a +1 circumstance bonus to saves against <<tag Divination>> effects, though sometimes refusing to remove your mask can cause issues in areas that don’t respect or understand the magic warrior tradition.
Once you take this feat, if another creature ever learns your true face or name, you lose your abilities from this archetype. Close allies who knew of your decision to take the mask before your dedication don’t break this taboo unless they tell someone else. To regain your abilities, you must discard your mask and obtain a new one of a different animal, then retrain Magic Warrior Dedication into a new Magic Warrior Dedication with your new mask.
Your focus spells from the magic warrior archetype are the same tradition as your other spells (choose one if you have spells from multiple traditions).
<<archetypefeatlist "4 6" "[[Magic Warrior]]">>
{{||SpellSummaryTable}}
You transform into the animal from your mask.
You gain the effects of [[Animal Form]], heightened to magic warrior transformation’s level, and you can transform into only the type of animal your mask represents.
{{||SpellSummaryTable}}
The weapon glimmers with magic and energy.
The target becomes a +1 [[Striking]] weapon, gaining a +1 item bonus to attack rolls and increasing the number of weapon damage dice to two.
A magic weapon is a weapon etched with only fundamental runes. A weapon potency rune gives an item bonus to attack rolls with the weapon, and a striking rune increases the
weapon’s number of weapon damage dice.
The Prices here are for all types of weapons. You don’t need to adjust the Price from a club to a greataxe or the like. These weapons are made of standard materials, not precious materials such as cold iron.
//The levels and prices below are exactly those of the required combination of runes. These can be taken as "example builds" of applying runes to weapons.//
| !Type | !Level | !Price | !Runes |
| +1 | 2 | 350 | +1 [[Weapon Potency]] |
| +1 Striking | 4 | 1000 | +1 [[Weapon Potency]] and [[Striking]] |
| +2 Striking | 10 | 10000 | +2 [[Weapon Potency]] and [[Striking]] |
| +2 Greater Striking | 12 | 20000 | +2 [[Weapon Potency]] and Greater [[Striking]] |
| +3 Greater Striking | 16 | 100000 | +3 [[Weapon Potency]] and Greater [[Striking]] |
| +3 Major Striking | 19 | 400000 | +3 [[Weapon Potency]] and Major [[Striking]] |
{{||SpellSummaryTable}}
A creature becomes a receptacle for pure magical energy sent by your deity.
The target gains a +1 status bonus to saving throws.
Each time you Cast a Spell from your spell slots, you automatically [[Sustain|Sustain a Spell]] this Spell and grant its target resistance to damage from spells until the start of your next turn.
This resistance is equal to the level of the spell you cast.
When an obstacle bars your path, you pull a trick from your sleeve to overcome it.
You can cast [[Darkvision]], [[Spider Climb]], and 4th-level [[Water Breathing]] as innate primal spells, each once per day.
''Prerequisites'' Expert in [[Crafting]].
You can [[Craft]] magic items, though some have other requirements.
When you select this feat, you gain formulas for four common magic items of 2nd level or lower.
You’ve learned those tidbits of magic that are most conducive to furthering your acquisition and transmission of knowledge.
You gain [[Guidance]], [[Message]], and [[Sigil]] as innate occult cantrips.
Magical power has improved your body’s resiliency.
Your proficiency rank for [[Fortitude]] saves increases to expert.
While study is key to your success, a bit of magic is a helpful tool in discovering the secrets of the past.
You gain [[Detect Magic]], [[Guidance]], and [[Read Aura]] as occult innate cantrips.
''Prerequisites'' Expert in [[Arcana]], [[Nature]], [[Occultism]], or [[Religion]].
Learning spells comes easily to you.
If you’re an expert in a tradition’s associated skill, you take 10 minutes per spell level to learn a spell of that tradition, rather than 1 hour per spell level. If you’re a master in the tradition’s associated skill, learning a spell takes 5 minutes per spell level, and if you’re legendary, it takes 1 minute per spell level.
If you fail to learn the spell, you can try again after 1 week or after you gain a level, whichever comes first.
You can use downtime to learn and inscribe new spells. This works as if you were using [[Earn Income]] with the tradition’s associated skill, but instead of gaining money, you choose a spell available to you to learn and gain a discount on learning it, learning it for free if your earned income equals or exceeds its cost.
Your inherent magic pervades your entire being.
All your Strikes are magical, whether with unarmed attacks or weapons.
Whether you’re using magic items, wielding innate magic, or dabbling in spellcasting, you can sneak spells past your foes’ defenses as easily as any blade.
When you succeed at a spell attack roll against a [[Flat-Footed]] foe’s AC and the spell deals damage, you can add your [[Sneak Attack]] damage to the damage roll.
If your single spell leads to multiple separate damage rolls, apply your sneak attack damage only once per target.
{{||SpellSummaryTable}}
You conjure an extradimensional demiplane consisting of a spacious dwelling with a single entrance.
The entrance connects to the plane where you Cast the Spell, appearing anywhere within the spell’s range as a faint, shimmering, vertical rectangle 5 feet wide and 10 feet high.
You designate who can enter when you cast the spell.
Once inside, you can shut the entrance, making it invisible. You and the creatures you designated can reopen the door at will, just like opening a physical door.
Inside, the demiplane appears to be a mansion featuring a magnificent foyer and numerous opulent chambers. The mansion can have any floor plan you imagine as you Cast the Spell, provided it fits within a space 40 feet wide, 40 feet deep, and 30 feet tall.
While the entrance to the mansion is closed, effects from outside the mansion fail to penetrate it, and vice versa, except for [[Plane Shift]], which can be used to enter the mansion.
You can use <<tag Scrying>> magic and similar effects to observe the outside only if they’re capable of crossing planes.
A staff of up to 24 servants attends to anyone within the mansion. These are like the servant created by the [[Unseen Servant]] spell, though they’re visible, with an appearance you determine during casting. The mansion is stocked with enough food to serve a nine-course banquet to 150 people.
You have tuned your spellcasting to the highest caliber.
Add two common 10th-level occult spells to your repertoire.
You gain a single 10th-level spell slot you can use to cast one of those two spells using bard spellcasting.
You don’t gain more 10th-level spells as you level up, unlike other spell slots, and you can’t use 10th-level slots with abilities that give you more spell slots or that let you cast spells without expending spell slots.
You move quickly, snatching a shiny item that catches your eye.
[[Stride]] twice, and you can [[Interact]] to grab an unattended object at any point during your movement.
''Frequency'' once per minute
''Trigger'' You cast a non-cantrip occult spell or an innate spell from a changeling ancestry feat.
You can tap into some of the magic that flows through your blood to give you new life.
You gain a number of temporary Hit Points equal to half your level (minimum 1) that last until the end of your next turn.
This suit of [[+2|Armor Potency]] [[Resilient]] splint mail has a large, green gemstone inset in a prominent location.
''Activate'' {{FreeAction}} envision; ''Frequency'' once per day; ''Trigger'' You are hit or critically hit with an attack, but damage hasn’t been rolled yet; ''Effect'' You force the attacker to reroll the attack roll and use the worse result. This effect has the <<tag Misfortune>> trait.
Activating the armor causes the gemstone to turn gray and become inert. You cannot activate the armor again until the stone returns to its original green color.
The gem turns green again after 1 week or when a significant foe critically succeeds at an attack roll targeting you.
(If an enemy rolls a critical success at an attack against you and you force the attacker to reroll that critical success, that critical success does not recharge the mail of luck.)
Even if the armor’s power returns before a week has elapsed, it can’t be activated more than once per day.
You’ve learned to better balance the conflicting powers wreaking havoc on your body.
Immediately after completing the casting of a revelation spell while you are affected by your moderate curse, your curse progresses to its major effect, rather than overwhelming you.
This effect lasts until you Refocus, which reduces your curse to its minor effect.
If you cast a revelation spell while under the effects of your major curse, you are overwhelmed by your curse.
In addition, increase the number of Focus Points in your focus pool from 2 to 3. If you spend at least 2 Focus Points before you again Refocus, you recover 2 Focus Points when you Refocus instead of 1.
Your patron grants you even greater secrets.
Choose a major, greater, or basic lesson from the list. You gain its associated hex, and your familiar learns the associated spell.
Increase the number of Focus Points in your focus pool by 1.
''Special'' You can select this feat a second time if you’re 14th level or higher, and a third time if you’re 18th level or higher. Choose a different lesson each time.
With at least 1 minute of conversation, during which you engage in charismatic overtures, flattery, and other acts of goodwill, you seek to make a good impression on someone to make them temporarily agreeable.
At the end of the conversation, attempt a [[Diplomacy]] check against the [[Will]] DC of one target, modified by any circumstances the GM sees fit.
Good impressions (or bad impressions, on a critical failure) last for only the current social interaction unless the GM decides otherwise.
//If you have [[Impressive Performance]], you can Make an Impression using [[Performance]] instead of Diplomacy.//
{{||ActionSuccessTable}}
You are a conduit for truly deific power.
You gain an additional 10th-level spell slot.
You quickly snatch up whatever’s nearby and then attack with it as an improvised weapon.
You [[Interact]] to pick up a nearby object you could use as an improvised weapon.
It must be located at around your chest level, such as a mug on a table, rather than an object on the floor.
You then either [[Strike]] or make an [[Improvised Pummel]] with the improvised weapon.
Whether your heart is pure or corrupt, you can call forth a malediction upon your foes.
You can cast [[Bane]] once per day as a 1st-level divine innate spell.
{{||SpellSummaryTable}}
You reshape the target’s shadow into a deadly form, such as strangling hands, a dangerous weapon, harrying runes, or the like, and command it to attack the target.
When you Cast the Spell, and each time you [[Sustain the Spell|Sustain a Spell]], the shadow makes a [[Strike]] against the target. If you Sustain the Spell multiple times in a round, you gain this effect each time. The shadow uses and contributes to your [[Multiple Attack Penalty]].
The shadow moves along with the foe, always remaining within reach.
The shadow’s Strikes are melee spell attacks. Regardless of its shape, the shadow’s Strikes deal damage equal to 1d10 plus your spellcasting ability modifier. You choose the type of damage when you Cast the Spell, choosing from <<tag Bludgeoning>>, <<tag Piercing>>, or <<tag Slashing>> damage.
The shadow doesn’t take up space, grant [[Flanking]], or have any other attributes a creature would.
The shadow can’t make any attacks other than its Strike.
The shadow vanishes if the target moves into an area of complete darkness or enters an area with light from all directions such that the target doesn’t cast a shadow.
If another effect is controlling the target’s shadow when you cast malicious shadow, you can attempt to [[Counteract]] that effect to temporarily take control of the shadow, but the original effect resumes when malicious shadow ends.
''Heightened (+2)'' The Strike damage increases by 1d10.
{{||SpellSummaryTable}}
You embed a seed of negative energy in an <<tag Undead>>creature, restoring its unnatural vigor.
The target gains [[Fast Healing]] 7.
This healing comes from negative energy, so it heals the undead rather than damaging it.
''Heightened (+1)'' The fast healing increases by 2.
Malyass root paste sees use to impede opponents in athletic competitions, in addition to espionage and tracking.
| !Saving Throw |DC 26 [[Fortitude]] |
| !Onset |1 minute |
| !Maximum Duration |6 minutes |
| !Stage 1 |[[Clumsy]] 1 and -10' status penalty to all Speeds (1 minute) |
| !Stage 2 |[[Clumsy]] 2 and -20' status penalty to all Speeds (1 minute) |
| !Stage 3 |[[Clumsy]] 3, [[Flat-Footed]] and -30' status penalty to all Speeds //(1 minute)// |
''Requirements'' You have a fly Speed.
You try a difficult maneuver while flying. Attempt an [[Acrobatics]] check. The GM determines what maneuvers are possible, but they rarely allow you to move farther than your fly Speed.
{{||ActionSuccessTable}}
You’ve learned every possible edge to use against your foes.
When you use [[Hunt Prey]], you can gain a hunter’s edge benefit other than the one you selected at 1st level //instead of the one you would normally have gained//.
If you do, you don’t gain the additional benefit from [[Masterful Hunter]].
You must physically manipulate an item or make gestures to use an action with this trait.
Creatures without a suitable appendage can’t perform actions with this trait.
Manipulate actions often trigger reactions.
//Manipulate actions can trigger an [[Attack of Opportunity]].//
//Having the manipulate trait alone does not necessarily mean that an action requires a ''free'' hand.//
You become a mantis.
You gain the effects of [[Insect Form]], heightened to mantis form’s level, and you can only transform into a mantis.
You can take on any number of mundane guises.
Whenever you change your identity, instead of taking on your social or vigilante identity, you can become someone completely ordinary. This identity isn’t a specific individual—rather, you become a nondescript member of your ancestry, of any gender, with a neutral alignment and a mundane occupation such as common laborer, farmer, or peasant.
Spells and abilities detect you as if you were this ordinary identity, rather than either of your two real identities, unless they succeed at a counteract check against your [[Deception]] DC.
You can’t use either social abilities or vigilante abilities while in this identity.
You channel the magic of marids.
You can cast [[Hydraulic Push]] and [[Obscuring Mist]] each once per day as 2nd-level arcane innate spells.
You’ve befriended a sea creature, which becomes magically bonded to you.
You gain a [[familiar|Familiar (Rule)]]. The type of creature is up to you, but one of its abilities must always be a swim Speed or the amphibious familiar ability.
{{||SpellSummaryTable}}
You afflict the target with the curse of the roiling, unforgiving sea.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
You conjure uncanny orbs of spiritual flame that float above or below the water’s surface.
You can cast the [[Produce Flame]] cantrip as a primal innate spell at will, heightened to a spell level equal to half your level rounded up.
You can cast this cantrip underwater.
''Requirements'' You can see and hear the creature you intend to mark.
You designate a single creature as your mark. This lasts until the mark dies or you use Mark for Death again.
You gain a +2 circumstance bonus to Perception checks to [[Seek]] your mark and on [[Deception]] checks to [[Feint]] against your mark.
Your [[Agile]] and [[Finesse]] weapons and unarmed attacks gain the [[Backstabber]] and [[Deadly]] d6 weapon traits when you’re attacking your mark. If the weapon or unarmed attack already has the deadly trait, increase the size of the deadly damage die by one step instead of giving it deadly d6.
''Prerequisites'' You have a swim Speed.
You are adept at moving through marshy terrain.
When you use the [[Step]] action, you can ignore [[Difficult Terrain]] caused by flooding, swamps, or quicksand.
In addition, when you use the Acrobatics skill to [[Balance]] on narrow surfaces or uneven marshy ground, you aren’t [[Flat-Footed]], and if you roll a success on the Acrobatics check, you get a critical success instead.
''Prerequisites'' trained in martial weapons and either [[Diplomacy]] or [[Intimidation]]
You’ve combined your social skills and combat training to become a talented combat leader.
Choose [[Diplomacy]] or [[Intimidation]]. You become trained in that skill or become an expert if you were already trained in it.
In addition, you’re surrounded by a marshal’s aura in a 10-foot [[Emanation]].
Your aura has the emotion, mental, and visual traits and grants you and allies within the aura a +1 status bonus to saving throws against fear.
<<archetypefeatlist "4 6 8 10 12 14" "Marshal">>
You have trained to use your fists as deadly weapons.
The damage die for your fist unarmed attacks becomes 1d6 instead of 1d4.
You don’t take the –2 circumstance penalty for making a lethal attack with your nonlethal unarmed attacks.
Whenever you gain a class feature that grants you expert or greater proficiency in certain weapons, you also gain that proficiency rank in all unarmed attacks.
<<archetypefeatlist "4 6 8 14 16" "[[Martial Artist]]">>
You’ve crossed blades with a wide variety of foes wielding a wide variety of weapons, and you’ve learned the basics of fighting with nearly any of them.
When wielding a weapon you aren’t proficient with, treat your level as your proficiency bonus.
At 11th level, you become trained in all weapons.
Your muse has taught you how to handle a wider variety of weapons than most bards, empowering you to effortlessly blend your performance into combat even with the most inelegant tools.
You become trained with all martial weapons.
If you gain the [[Bard Weapon Expertise]] class feature, your proficiency rank with martial weapons increases to expert.
You go to extreme lengths to support your allies, even when it means bringing harm to yourself.
If your next action is to cast [[Harm]] or [[Heal]] from your healing or harmful font to restore Hit Points to a single ally, you can channel your own vitality along with the spell.
You lose 1d8 Hit Points per level of the spell, which can’t be reduced or mitigated in any way, and your ally regains an equal number of Hit Points.
This set of healer’s tools contains a seemingly endless supply of bandages, herbs, and healing items of impeccable quality, granting you a +2 item bonus to [[Medicine]] checks.
''Activate'' {{OneAction}} [[Treat Poison]] or {{ClockIcon}} 8 hours ([[Treat Disease]]); ''Effect'' You can activate the tools when you use them to Treat Poison in order to produce the effects of [[Neutralize Poison]], or when you Treat Disease in order to produce the effects of [[Remove Disease]].
Once these medicines have been used to treat a patient’s poison or disease, they can’t be used again to treat the same affliction for that patient.
| !Type | !Level | !Price | !Item Bonus | !Heighten Spells |
| (standard) | 12 | 18000 | +2 | None |
| Greater | 18 | 190000 | +3 | 6th |
Your mask takes on a personality of its own, allowing it to serve as your [[familiar|Familiar (Rule)]]. Though you can still wear it as a mask, you can detach it from your face to grant it a bodily form of colored light that allows it to move around; usually, this is a miniature form of the animal the mask represents.
Detaching or reattaching the familiar to transform it is a two-action activity.
Even in mask form, the familiar can move around on its master’s face and speaks in a distinct voice (if it can talk).
It is easily recognized as more than a simple mask unless the familiar succeeds at a [[Deception]] check to Impersonate a mask.
Other than its appearance and the fact that it can be worn, it functions as other familiars.
Your mask familiar has access to the Mask Freeze [[familiar ability|Familiar Abilities]].
''Trigger'' You start your turn with the [[Frightened]] condition.
''Requirements'' You’re wearing your warmask.
Your warmask burns off of your face, releasing your apprehension.
You remove the [[Frightened]] condition.
Your warmask is destroyed, and you can’t reapply it until your next daily preparations.
''Special'' You can use this reaction even if you have a condition tied to the frightened condition that would normally prevent you from using a reaction, such as “fleeing as long as you’re frightened” or “paralyzed as long as you’re frightened.”
//Since this isn't a reaction, the text above should presumably refer to ".. a free action..".//
''Trigger'' You succeed at a [[Demoralize]] check.
''Requirements'' You’re wearing your warmask.
Your mask has grown into a manifestation of your pain, which you can release.
The creature you successfully [[Demoralize]]d takes 2d6 mental damage, or 4d6 mental damage if you’re legendary in [[Intimidation]].
The target is then temporarily immune to additional damage from Mask of Pain for 24 hours.
Your warmask sharpens your connection to the source of your mask’s power.
During your daily preparations, choose [[Fear]], [[Phantom Pain]], or [[True Strike]]. Until your next daily preparations, you can cast this spell as a 1st-level innate spell once per day; the spell’s tradition is determined by the tradition tied to your warmask.
You must be wearing your warmask to Cast the Spell.
''Frequency'' once per day
''Trigger'' You fail a saving throw against an effect from your warmask’s magical tradition.
''Requirements'' You’re wearing your warmask.
Your warmask projects a white-hot fury that attempts to vaporize the offending magic.
You reroll the triggering check with a +2 circumstance bonus, but you must use the new result, even if it’s worse than your first roll.
{{||SpellSummaryTable}}
The target appears to be a gruesome and terrifying creature. The effect is unique to each observer, so a human viewing the target might see a demon with bloody fangs, but a demon observing the target might see a glowing angelic visage.
When any creature attempts a [[Hostile Action]] against the target, the creature must attempt a [[Will]] save.
It is then temporarily immune until the end of its next turn.
''Heightened (8th)'' You can target up to 5 creatures. If a creature uses a hostile action or reaction that affects multiple targets simultaneously, it needs to attempt only one save against mask of terror.
//The non-heightened version does not explicitly mention reactions, but it is generally assumed that the intent is not that hostile reactions are a different class from hostile actions.//
{{||SaveSuccessTable}}
{{LOCGFeat}}
''Trigger'' You begin [[Casting a Spell|Cast a Spell]].
''Requirements'' You are wearing your signifer’s mask.
You harness the magical energy flowing through your eyeless mask to effortlessly protect you from visual effects.
You [[Avert your Gaze|Avert Gaze]].
{{||SpellSummaryTable}}
You unleash a wave of necromantic energy to snuff out the life force of those in its path.
Each creature of 17th level or lower in the line must attempt a [[Fortitude]] save.
{{||SaveSuccessTable}}
If the damage from massacre reduces a creature to 0 Hit Points, that creature dies instantly.
If massacre doesn’t kill even a single creature, the negative energy violently explodes back toward you, dealing an additional 30 negative damage to every creature in the line (even those above 17th level) and 30 negative damage to you.
''Heightened (10th)'' The spell can affect creatures up to 19th level. Increase the damage to 10d6 on a success, and to 115 on a failure.
* ''Cantrip Connection'': You can prepare an additional cantrip, or if you have a repertoire, instead designate a cantrip to add to your repertoire every time you select this ability; you can retrain it but can’t otherwise change it. You must be able to prepare cantrips or add them to your repertoire to select this.
* ''Extra Reagents'': Your familiar grows extra infused reagents on or in its body. You gain an additional batch of infused reagents. You must have the [[Infused Reagents]] ability to select this ability.
* ''Familiar Focus'': Once per day, your familiar can use 2 actions with the <<tag Concentrate>> trait to regain 1 Focus Point, up to your usual maximum You must have a focus pool to select this.
* ''Innate Surge'': Once per day, you can draw upon your familiar’s innate magic to replenish your own. You can cast one innate spell gained from an ancestry feat that you have already cast today. You must still Cast the Spell and meet the spell’s other requirements.
* ''Lifelink'': If your familiar would be reduced to 0 HP by damage, as a reaction with the <<tag Concentrate>> trait, you can take the damage. If you do, you take all the damage and your familiar takes none. However, if special effects when a hit damages your familiar (such as snake venom) still apply to your familiar.
* ''Share Senses'': Once every 10 minutes, you can use a single action with the concentrate trait to project your senses into your familiar. When you do, you lose all sensory information from your own body, but can sense through your familiar’s body for up to 1 minute. You can [[Dismiss]] this effect.
* ''Spell Battery'': You gain one additional spell slot at least 3 levels lower than your highest-level spell slot; you must be able to cast 4th-level spells using spell slots to select this master ability.
* ''Spell Delivery'': If your familiar is in your space, you can cast a spell with a range of touch, transfer its power to your familiar, and command the familiar to deliver the spell. If you do, the familiar uses its 2 actions for the round to move to a target of your choice and touch that target. If it doesn’t reach the target to touch it this turn, the spell has no effect.
Your [[Advanced Alchemy]] level increases to 7.
For every level you gain beyond 12th, your [[Advanced Alchemy]] level increases by 1.
{{MulticlassMasterSpellcasting}}
{{MulticlassMasterSpellcasting}}
As a master detective, you can solve any case and find all the clues available.
If you’re pursuing the subject of a lead and you enter a new location that includes another clue toward solving the mystery, the GM informs you of the existence of the clue and its type: an object, person, spell effect, or the like.
When you find the clue, the GM informs you that you’ve done so.
If there is more than one clue in the location, the GM chooses one to inform you about. When you find any of the clues in that location, the GM informs you that you’ve done so, even if it wasn’t the clue they’d chosen or there are other clues you haven’t found.
Your proficiency rank for your investigator class DC increases to Master.
{{MulticlassMasterSpellcasting}}
{{MulticlassMasterSpellcasting}}
You have a nearly encyclopedic knowledge of all creatures of the world.
You can use [[Nature]] to [[Recall Knowledge]] to identify any creature.
In addition, you gain the benefits of [[Monster Hunter]] (and [[Monster Warden]], if you have it) on a success as well as a critical success.
__''Trigger'' Your turn begins.__
You move between stances in an unceasing dance.
You use an action with the <<tag Stance>> trait.
Your scroll collection is incredible, brimming with eldritch power, and you can prepare far more
of them than an ordinary scroll trickster.
In addition to your daily scrolls from the Basic and Expert Scroll Caches, add a single scroll with a 6th‑level spell. At 20th level, add a scroll with a 7th-level spell.
''Prerequisite'' You must be legendary in the skill associated with your bloodline.
{{MulticlassMasterSpellcasting}}
Your proficiency ranks for spell attack rolls and spell DCs in your class's magic tradition increase to master.
Your proficiency rank in Perception increases to master.
''Trigger'' Your [[Strike]] hits a [[Flat-Footed]] creature and deals damage.
The target attempts a [[Fortitude]] save at your class DC.
It then becomes temporarily immune to your Master Strike for 1 day.
{{||SaveSuccessTable}}
You have honed your skill in using your body as a weapon.
Your proficiency ranks for unarmed attacks and simple weapons increase to master.
You’ve mastered a rogue’s fighting moves.
Your proficiency ranks increase to master for all simple weapons plus the rapier, sap, shortbow, and shortsword.
{{MulticlassMasterSpellcasting}}
Your animal companion shares your incredible hunting skills, allowing it to take down your shared prey with ease.
When you [[Hunt Prey]], your animal companion gains the [[Masterful Hunter]] benefit associated with your hunter’s edge, rather than just your original hunter’s edge benefit.
You have honed your abilities as a hunter to incredible levels.
Your proficiency rank for your ranger class DC increases to master.
When using a ranged weapon that you have master proficiency in, you can ignore the penalty if attacking your hunted prey within the weapon’s second and third range increments.
If you have master proficiency in [[Perception]], you gain a +4 circumstance bonus to Perception checks when you [[Seek]] your prey, and if you have master proficiency in [[Survival]], you gain a +4 circumstance bonus to Survival checks when you [[Track]] your prey.
You also gain an additional benefit depending on your Hunter’s Edge.
Where others might use sleight of hand or a silver tongue to achieve their objectives, you rely on your intellect to craft intricate schemes. You likely view your operations as a chess game, always planning 10 steps ahead where others might plan three. You might be a detective determined to solve crimes or a spymaster in the service of a powerful family or nation. If you operate outside the law, you might be an aspiring crime lord or information broker, excellent at directing others toward suitable jobs.
If you successfully identify a creature using [[Recall Knowledge]], that creature is [[Flat-Footed]] against your attacks until the start of your next turn; if you critically succeed, it’s flat-footed against your attacks for 1 minute.
You’re trained in [[Society]] and one of the following skills of your choice: [[Arcana]], [[Nature]], [[Occultism]], or [[Religion]].
You can choose [[Intelligence]] as your key ability score.
A material component is a bit of physical matter consumed in the casting of the spell.
Material components aren’t ubiquitous like somatic and verbal components. They’re used primarily for spells with physical effects, especially ones with a longer duration or that alter or control a large area, such as walls or zones of dangerous terrain. A material component pouch typically contains everything you need. This doesn’t mean the materials are interchangeable, though—one spell might need powdered iron and another a particular gemstone.
The spell gains the [[Manipulate]] trait and requires you to have a free hand to retrieve and manipulate a material component.
That component is expended in the casting (even if the spell is disrupted).
Except in extreme circumstances, you can assume all common components are included in a material component pouch.
{{BardConSub}}
__Any character casting an innate spell can replace any material component with a somatic component.__
If you’re a [[Cleric]] Casting a Spell from the [[Divine]] tradition while holding a divine focus (such as a religious symbol or text), you can replace any material component the spell requires by using the divine focus as a [[Focus]] component instead. Unlike the normal rules for a focus component, you can’t retrieve or stow the focus when making this substitution.
If you’re a [[Druid]] Casting a Spell from the [[Primal]] tradition while holding a primal focus (such as holly and mistletoe), you can replace any material component the spell requires by using the primal focus as a [[Focus]] component instead. Unlike the normal rules for a focus component, you can’t retrieve or stow the focus when making this substitution.
If you’re a [[Sorcerer]] Casting a Spell from the magical tradition that matches your bloodline, you can draw on the magic within your blood to replace any material component with a [[Somatic]] component.
Your animal companion grows up, becoming a mature animal companion, which grants it additional capabilities.
Your animal companion is better trained than most. During an encounter, even if you don’t
use the [[Command an Animal]] action, your animal companion can still use 1 action on your turn that round to [[Stride]] or [[Strike]].
All of your animal companions grow up, becoming mature [[Animal Companions]] and gaining additional capabilities.
During an encounter, even if you don’t use the [[Command an Animal]] action, your animal companion can still use 1 action on your turn to either [[Stride]] or [[Strike]].
You specialize in weapons that require two hands.
You become trained in all simple and martial melee weapons that require two hands to wield or have the two-hand trait.
Whenever you gain a class feature that grants you expert or greater proficiency in weapons, you also gain that proficiency rank in these weapons.
If you are at least an expert in such a weapon, you gain access to the critical specialization effect with that weapon.
<<archetypefeatlist "4 6 8 12 14 16" "Mauler">>
{{||SpellSummaryTable}}
You transport the target into an extradimensional maze of eldritch origin and trap it there.
Once each turn, the target can spend 1 action to attempt a [[Survival]] check or [[Perception]] check against your spell DC to escape the maze.
The possible outcomes are as follows.
{{||SaveSuccessTable}}
<<tag Teleportation>>magic doesn’t help the creature escape unless the magic can transport across planes, such as [[Plane Shift]].
When the spell ends, either because the target escaped or the duration ran out, the target returns to the space it occupied when it was banished, or to the nearest space if the original is now filled.
//Note that the target still gets 3 actions per turn and does not have to attempt to escape the maze every round. They can use their remaining actions to, for example, cast spells on themselves.//
You become an expert in [[Medicine]].
When you succeed with [[Battle Medicine]] or [[Treat Wounds]], the target regains 5 additional HP at DC 20, 10 HP at DC 30, or 15 HP at DC 40.
Once per day, you can use Battle Medicine on a creature that’s temporarily immune. If you’re a master in Medicine, you can do so once per hour.
<<archetypefeatlist "4 6 16" "Medic">>
''Key Ability'' [[Wisdom]].
You can patch up wounds and help people recover from diseases and poisons.
{{||SkillActionList}}
{{||SkillFeatList}}
//Implied by [[Fey-Touched Gnome]].//
You can change this cantrip to a different one from the same list once per day by meditating to realign yourself with the First World; this is a 10-minute activity that has the concentrate trait.
''Prerequisites'' ki spells.
Your meditation is so effective that you can achieve a deep focus.
If you have spent at least 2 Focus Points since the last time you [[Refocus]]ed, you recover 2 Focus Points when you Refocus instead of 1.
When you clear your mind, your focus comes flowing back in a powerful rush.
If you have spent at least 3 Focus Points since the last time you Refocused, you recover 3 Focus Points when you Refocus instead of 1.
You’ve learned to defend yourself better against attacks.
Your proficiency ranks for light armor, medium armor, and unarmored defense increase to expert.
Your skill with light and medium armor improves, increasing your ability to dodge blows.
Your proficiency ranks for medium armor, light armor and unarmored defense increase to master.
{{||SpellSummaryTable}}
You make an attack filled with a medusa’s petrifying power.
Make an unarmed [[Strike]].
//If you hit, the target is [[Slowed]] 1 and// must attempt a [[Fortitude]] save at the end of each of its turns; this ongoing save has the <<tag Incapacitation>> trait. ''//(This means that enemies of level higher than double the spell's level promote their save results.)//''
On a failed save, the slowed condition increases by 1 (2 on a critical failure). A successful save reduces the slowed condition by 1.
When a creature is unable to act due to the slowed condition from medusa’s wrath, it is [[Petrified]] permanently.
The spell ends if the creature is petrified or the slowed condition is removed.
//If your unarmed Strike is a critical hit, the target begins Slowed 2.//
''Additive 3''.
''Prerequisites'' [[Expanded Splash]].
Requirements You are holding an <<tag Infused>>alchemical bomb you crafted, with a level at least 3 lower than your advanced alchemy level.
You add an incredibly powerful additive to a held bomb to create a mega bomb, greatly increasing its area and power.
You use an [[Interact]] action to throw the mega bomb, rather than Strike, and you don’t make an attack roll.
The mega bomb affects creatures in a 30-foot-radius burst, centered within 60 feet of you.
The bomb deals damage as if each creature were the primary target, with a basic [[Reflex]] save.
On a failed save, a creature also takes any extra effects that affect a primary target (such as [[Flat-Footed]] from [[Bottled Lightning)]].
While all targets in the area take splash damage as primary targets, there is no further splash beyond that area.
If your next action after creating a mega bomb isn’t an Interact action to throw it, the mega bomb denatures and loses all effects.
{{||SpellSummaryTable}}
You merge with an adjacent block of stone with enough volume to fit you and your worn and held possessions.
You must touch the stone when you Cast the Spell.
You can hear, but not see, what’s going on outside the stone, and you can cast spells while in the stone as long as they don’t require line of effect beyond the stone.
Significant physical damage to the stone while you are inside it expels you and deals 10d6 damage to you.
[[Passwall]] expels you without dealing damage and ends meld into stone.
You can [[Dismiss]] this spell.
You can ask questions of and receive answers from arthropods (insects, spiders, scorpions, crabs, and similar invertebrate animals), as well as use [[Diplomacy]] to [[Make an Impression]] on and [[Request]] things of them. Most bees, butterflies, moths, and beetles have an indifferent or friendly starting attitude toward you and give you time to make your case, though other arthropods react to you like any other adventurer.
You subtly weave your spellcasting into your performance.
If the next action you take is to [[Cast a Spell]], attempt a [[Performance]] check against all observers’ [[Perception]] DCs.
If your Performance check is successful against an observer’s Perception DC, that observer doesn’t notice that you are Casting a Spell, even though normally spells have sensory manifestations that would make spellcasting obvious to those around you, and verbal, somatic, and material components are extremely overt. You hide all of these as part of an ordinary performance.
This hides only the spell’s spellcasting actions and manifestations, not its effects, so an observer might still see a ray streak out from you or see you vanish.
{{||SpellSummaryTable}}
You repair the target item.
You restore 5 Hit Points per spell level to the target, potentially removing the [[Broken]] condition if this repairs it past the item’s [[Broken Threshold]].
You can’t replace lost pieces or repair an object that’s been completely destroyed.
''Heightened (2nd)'' You can target a non-magical object of 1 Bulk or less.
''Heightened (3rd)'' You can target a non-magical object of 2 Bulk or less, or a magical object of 1 Bulk or less.
Affix to a shield or weapon.
''Requirements'' You are an master in [[Crafting]].
''Trigger'' The affixed item would take damage.
This lattice of reinforced iron is shaped into a perfect octagon.
When you activate {{FreeAction}} it, it negates the damage and instantly and completely repairs the affixed item.
A mental effect can alter the target’s mind.
It has no effect on an object or a [[Mindless]] creature.
//Non-area Mental effects have no effect on [[Swarm Mind]]s.//
This polished wooden staff bears a swirling motif reminiscent of the folds of a brain. While wielding the staff, you gain a +2 circumstance bonus to checks to identify mental magic.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 4 | 90 | Cantrip |[[Daze]] |
|~|~|~| 1st |[[Mindlink]], [[Phantom Pain]] |
| Greater | 8 | 4600 | 2nd |[[Paranoia]] |
|~|~|~| 3rd |[[Hypercognition]], [[Phantom Pain]] |
| Major | 12 | 19000 | 4th |[[Modify Memory]], [[Telepathy]] |
|~|~|~| 5th |[[Phantom Pain]], [[Synaptic Pulse]], [[Synesthesia]] |
The band of this ring is made from bluecolored iron and has two sharp, decorative protrusions on each side of the red-stone inlay. It feels quite heavy and reliable.
Wearing this ring grants you a +2 item bonus to [[Deception]] and [[Diplomacy]] checks, but only if the associated checks involve haggling or bargaining over a purchase or trade.
''Activate'' {{ThreeAction}} (envision, interact); ''Effect'' You can determine if an item is magical simply by handling it. You detect no other indication of its power, only whether or not it is magical, granting the effects of a 1st-level [[Detect Magic]] spell that affects only the object.
''Frequency'' once per round
''Trigger'' You craft an [[Elixir of Life]] using [[Quick Alchemy]], and that elixir is at least 2 levels lower than your advanced alchemy level.
''Additive 2''.
You mix a special additive into your elixir that calms the drinker’s body and mind.
The elixir of life attempts to [[Counteract]] one <<tag Fear>> effect or one effect imposing the [[Paralyzed]] condition on the drinker, __using the item’s level and a counteract modifier equal to your class DC – 10.__
Your touch relieves fear and restores movement.
If the next action you use is to cast [[Lay on Hands]], you can attempt to counteract a <<tag Fear>> effect or an effect imposing the [[Paralyzed]] condition on the target, in addition to the other benefits of lay on hands.
When you meet someone’s gaze, they are unable to look away.
Choose one target creature.
That creature must succeed at a [[Will]] save or be [[Fascinated]] until the end of your next turn; the DC for this save is equal to your class DC or spell DC, whichever is higher.
If the creature succeeds at its save or its fascination ends due to a [[Hostile Action]], it becomes temporarily immune to your Mesmerizing Gaze for 1 day.
When you select this feat, it gains either the arcane or occult trait; once you make this choice, you can’t change it.
Affix to armor.
''Trigger'' You attempt a [[Deception]] check to [[Feint]] but you haven't rolled yet.
This silver-bound opal pendant is afire with iridescence.
When you activate it, if the outcome of your triggering [[Deception]] check is a critical failure, you get a failure instead (or if the outcome is a success, you get a critical success instead).
{{||SpellSummaryTable}}
You mouth words quietly, but instead of coming out of your mouth, they’re transferred directly to the ears of the target.
While others can’t hear your words any better than if you normally mouthed them, the target can hear your words as if they were standing next to you.
The target can give a brief response as a reaction, or as a free action on their next turn if they wish, but they must be able to see you and be within range to do so.
If they respond, their response is delivered directly to your ear, just like the original message.
//"Others can't hear your words any better than if you normally mouthed them" implies that others may be able to use [[Lip Reading]].//
''Heightened (3rd)'' The spell’s range increases to 500 feet.
{{||SpellSummaryTable}}
You record a message up to 5 minutes long and inscribe a special rune on any flat unattended surface within reach.
The nature of the rune’s appearance is up to you, but it is visible to everyone and it must be no smaller than 2 inches in diameter.
You also specify a [[Trigger]] that creatures must meet to activate the rune.
For the duration of the spell, creatures who meet the criteria of the trigger can touch the rune to hear the recorded message in their head as though you were speaking to them [[telepathically|Telepathy]].
You know when someone is listening to the message, but you do not know who is listening to it.
You can [[Dismiss]] the spell.
You can adjust your body to make unarmed attacks infused with the mystic energy of rare metals.
Your unarmed attacks are treated as [[Cold Iron]] and [[Silver]].
This allows you to deal more damage to a variety of supernatural creatures, such as demons, devils, and fey.
Metallic veins grow throughout your body, giving your unarmed attacks a metallic sheen.
Choose either [[Cold Iron]] or [[Silver]]. Your unarmed attacks are treated as the chosen type of metal.
Actions with the metamagic trait tweak the properties of your spells.
These actions usually come from metamagic feats.
You must use a metamagic action directly before [[Casting the Spell|Cast a Spell]] you want to alter. If you use any action (including free actions and reactions) other than Cast a Spell directly after, you waste the benefits of the metamagic action.
Any additional effects added by a metamagic action are part of the spell’s effect, not of the metamagic action itself.
Deep understanding of divine revelations into the nature of vital essence allows you to freely manipulate the effects of your positive or negative energy.
Use 1 metamagic action that you can perform that normally takes 1 action and can be applied to the [[Harm]] or [[Heal]] spell.
If you use it in this way, its effects apply only to a harm or heal spell.
Altering your spells doesn’t take any longer than casting them normally.
You can use metamagic single actions as free actions.
You’ve realized that the practice known as metamagic is a holdover from a time long ago, when wizards had to work out their own spells and variations rather than rely on spells recorded by others and passed down over the years. This allows you efficient access to various metamagic effects.
You gain a 1st-level metamagic wizard feat as a bonus feat. Starting at 4th level, during your daily preparations, you can gain a metamagic wizard feat of your choice that has a level requirement of no more than half your level, which you can use until your next daily preparations.
{{||SpellSummaryTable}}
You call down four meteors that explode in a fiery blast.
Each meteor deals 6d10 <<tag Bludgeoning>>damage to any creatures in the 10-foot burst at the center of its area of effect before exploding, dealing 14d6 <<tag Fire>>damage to any creatures in its 40-foot burst. //The target makes a single basic [[Reflex]] save against all the damage.//
The meteors’ central 10-foot bursts can’t overlap, and a creature takes the same amount of fire damage no matter how many overlapping explosions it’s
caught in.
The saving throw applies to both the bludgeoning and the fire damage.
''Heightened (+1)'' The bludgeoning damage increases by 1d10, and the fire damage increases by 2d6.
Thanks to your incredible connection to your armor, you can use it to shrug off an incredible array of dangers.
Your bonus from the [[Bulwark]] armor trait increases from +3 to +4, and it applies on all Reflex saves, not just damaging Reflex saves.
You’ve practiced and increased your draconic might, allowing you to take your draconic form more often.
You can use Shape of the Dragon once per hour instead of once per day.
When you gain this action as a Barbarian, your proficiency rank for your barbarian class DC increases to Expert.
''Trigger'' You use the [[Rage]] action on your turn.
Use an action that has the <<tag Rage>> trait.
Alternatively, you can increase the actions of the triggering Rage to 2 to instead use a 2-action activity with the rage trait.
When you use [[Hunt Prey]] on a foe within 100 feet, you gain resistance 10 to all damage types that target has resistance or immunity to for as long as the foe remains within 100 feet.
{{||SpellSummaryTable}}
Powerful wards hide a creature from divination magic.
The target gains a +4 status bonus to saves against <<tag Mental>>effects.
Mind Blank attempts to [[Counteract]] any <<tag Detection>>, <<tag Revelation>>, and <<tag Scrying>> effects as if its spell level were 1 higher than its actual level.
On a success, the divination effect functions normally except that it detects nothing about the target and its possessions. For instance, [[Detect Magic]] would still detect other magic in the area, but not any magic on the target.
{{||SpellSummaryTable}}
You cast your thoughts through a creature’s mind, sifting for information.
You access the target’s memories and knowledge unless it fends you off with a [[Will]] save.
{{||SaveSuccessTable}}
//If the spell takes effect, then// each round of the spell’s duration, you can [[Sustain the Spell|Sustain a Spell]] to ask a different question and attempt to uncover the answer.
For each question, the target can attempt a [[Deception]] check against your spell DC; if the target succeeds, you don’t learn the answer, and on a critical success, the target gives you a false answer that you believe is truthful.
Once you’ve asked the target a given question, asking it again, even with a separate casting of mind probe, produces the same result.
{{||SpellSummaryTable}}
With a cursory mental touch, you attempt to read the target’s mind.
It must attempt a [[Will]] save.
The target then becomes temporarily immune to your mind reading for 1 hour.
{{||SaveSuccessTable}}
With a minor adjustment of ratios in the formula for your serene mutagen, you gain mental protections.
When you’re affected by a [[Serene Mutagen]], <<tag Detection>>, <<tag Revelation>>, and <<tag Scrying>>effects of 9th level or lower detect nothing from you or your possessions and auras. For instance, [[Detect Magic]] would still detect other magic in the area, but not any magic on you.
Mindfog mist can be used to undermine spellcasters, as its effect on a victim’s mental faculties are swift and powerful.
| !Saving Throw |DC 35 [[Fortitude]] |
| !Onset |1 round |
| !Maximum Duration |6 rounds |
| !Stage 1 |[[Stupefied]] 2 (1 round) |
| !Stage 2 |[[Confused]] and [[Stupefied]] 3 (1 round) |
| !Stage 3 |[[Confused]] and [[Stupefied]] 4 (1 round) |
A mindless creature has either programmed or rudimentary mental attributes.
Most, if not all, of their mental ability modifiers are –5.
They are immune to all [[Mental]] effects.
{{||SpellSummaryTable}}
You link your mind to the target’s mind and mentally impart to that target an amount of information in an instant that could otherwise be communicated in 10 minutes.
Minions are creatures that directly serve another creature.
A creature with this trait can use only 2 actions per turn and can’t use reactions.
Your minion acts on your turn in combat, once per turn, when you spend an action to issue it commands. For an animal companion, you [[Command an Animal]]; for a minion that’s a spell or magic item effect like a summoned minion you [[Sustain a Spell]] or [[Sustain an Activation]]; and if not otherwise specified, you issue a verbal command, which is a single action with the [[Auditory]] and [[Concentrate]] traits.
If given no commands, by default minions use no actions except to defend themselves or to escape obvious harm.
If left unattended for long enough, typically 1 minute, [[Mindless]] minions usually don’t act, animals often indulge their creature comforts, and sapient minions act how they please.
''Prerequisites'' Animal companion or familiar
When you are in your social identity, you can also grant a social identity to an animal companion, familiar, or other minion you gained from a class feature.
When changing to your social identity, you also change your minion’s appearance to that of a socially acceptable creature of its type, such as grooming a wolf to appear as a large dog or disguising a familiar to appear as an exotic pet.
Commanding your minion to use unusual magical or combat abilities it gained from your class features or feats while in this social identity risks exposing your vigilante identity.
You’ve dabbled in a variety of tricks, gaining minor magical abilities from a particular tradition.
Choose <<tag Arcane>>, <<tag Divine>>, <<tag Occult>>, or <<tag Primal>> magic, and gain two cantrips from the common cantrips available to that tradition.
__Your key spellcasting ability is [[Charisma]], and you’re trained in spell attack rolls and DCs for the tradition of your chosen cantrips.__
<ul>
<$list filter="[tag[Spell]tag[Cantrip]!tag[Uncommon]!tag[Rare]]">
<li><$link/></li>
</$list>
</ul>
{{||SpellSummaryTable}}
You request aid directly from your divine source.
Your divine source always refuses a request out of line with its nature, and it might grant a different request (potentially more powerful or better fitting its nature) than the one you asked for.
A casting of miracle can do any of the following things.
* Duplicate any <<tag Divine>> spell of 9th level or lower.
* Duplicate any non-divine spell of 7th level or lower.
* Produce any effect whose power level is in line with the above effects.
* Reverse certain effects that refer to the [[Wish]] spell.
The GM might allow you to try using miracle to produce greater effects than these, but doing so may be dangerous, or the spell may have only a partial effect.
''Divine spells that can be duplicated:''
<$list filter="[tag[Spell]tag[Divine]]" variable="spell">
<$list filter="[<spell>get[m-level]compare:number:lteq[9]]">
<$link to=<<spell>> />,
</$list>
</$list>
''Non-Divine spells that can be duplicated:''
<$list filter="[tag[Spell]!tag[Divine]]" variable="spell">
<$list filter="[<spell>get[m-level]compare:number:lteq[7]]">
<$link to=<<spell>> />,
</$list>
</$list>
''Frequency'' once every 10 minutes.
Your alchemical mastery can resuscitate the recently slain.
You can administer a true [[Elixir of Life]] to a creature who has been dead for no more than 2 rounds.
When you do, that creature is immediately returned to life with 1 Hit Point and becomes [[Wounded]] 1.
Your deity empowers you to perform minor miracles, allowing you to readily adapt to the fluctuating needs of your duties.
Once during your daily preparations, you can use a spell slot to hold sheer divine potential, rather than using it to prepare a spell.
You can use this spell slot to cast any spell you know from the divine spell list that’s at least 2 levels lower than the slot you designate. The spell acts in all ways as a spell of 2 levels lower. You don’t have any particular spell prepared in that slot until you cast it.
You’re exalted by your deity and gain truly incredible spells.
You gain a single 10th-level spell slot and can prepare a spell in that slot using divine spellcasting.
You don’t gain more 10th-level spells as you level up, though you can take the [[Maker of Miracles]] feat to gain a second slot.
__You can’t use this spell slot for abilities that let you cast spells without expending spell slots or that give you more spell slots.__
You have a connection to the muddier denizens of the Plane of Earth from its border with the Plane of Water, and your elemental lineage manifests as clay or mud, reflecting that bond. Your body’s mudlike quality makes it easy for you to compress and squeeze yourself through smaller areas.
You gain the trained proficiency rank in [[Acrobatics]]. If you would automatically become trained in Acrobatics (from your background or class, for example), you instead become trained in a skill of your choice.
You gain the [[Quick Squeeze]] skill feat.
{{||SpellSummaryTable}}
Three illusory images of you swirl about your space, potentially causing those who attack you to hit one of the images instead of you.
Any attack that would hit you has a random chance of hitting one of your images instead of you.
If all three images remain, there is a 1 in 4 chance of hitting you (1 on 1d4).
With two images remaining, there is a 1 in 3 chance of hitting you (1–2 on 1d6).
With only one image, the chances are 1 in 2 (1–3 on 1d6).
Once an image is hit, it is destroyed.
If an attack roll fails to hit your AC but doesn’t critically fail, it destroys an image but has no additional effect (even if the attack would normally have an effect on a failure).
If an attack roll is a critical success and would hit one of the images, one of the images is destroyed and the attack roll becomes a success against you.
Once all the images are destroyed, the spell ends.
''Trigger'' An opponent casting a spell that targets you critically fails a spell attack roll against your AC.
''Requirements'' You have a shield raised.
You reflect the spell back against the triggering opponent.
Make a ranged attack against the triggering creature using your highest proficiency with a ranged weapon. If you can cast spells, you can make a spell attack roll instead.
If you succeed, your opponent takes the effects of a successful spell attack roll for their own spell (or the effects of a critical success if your attack roll was a critical success).
Your tail can bedevil your foes.
You can [[Disarm]] and [[Trip]] creatures with your tail, even if you don’t have a free hand. All restrictions of Skillful Tail otherwise continue to apply.
If you have [[Smashing Tail]], your tail unarmed attack gains the [[Disarm]] and [[Trip]] traits.
{{||SpellSummaryTable}}
You reshape the magic aura of one creature or object to resemble that of another.
You designate one target as the primary target and the other as the secondary target.
Effects that would detect auras on the primary target instead detect the same types of auras from the secondary target.
A creature [[reading the aura|Read Aura]] can attempt to disbelieve the illusion.
You can [[Dismiss]] the spell from up to a mile away.
A misfortune effect detrimentally alters how you roll your dice.
You can never have more than one misfortune effect alter a single roll. If multiple misfortune effects would apply, the GM decides which is worse and applies it.
If a fortune effect and a misfortune effect would apply to the same roll, the two cancel
each other out, and you roll normally.
{{||SpellSummaryTable}}
You turn yourself [[Invisible]] and create an illusory duplicate of yourself.
When you [[Sustain the Spell|Sustain a Spell]], you can mentally dictate a course of action for your duplicate to follow that round.
Your duplicate acts as though it had your full number of actions, though it can’t actually affect anything in the environment.
Both the duplicate and your invisibility persist for the spell’s duration.
Performing a [[Hostile Action]] doesn’t end mislead’s invisibility, just like a 4th-level invisibility spell.
A creature that determines the duplicate is an illusion doesn’t necessarily know you’re invisible, and one that can see your invisible form doesn’t necessarily know your duplicate is an illusion.
If you [[Cast a Spell]], attack, or otherwise interact with another creature, as a part of that action you can attempt a [[Deception]] check against observers’ [[Perception]] DCs to convince them your duplicate used that action. This doesn’t fool anyone who’s aware your duplicate is an illusion, nor does it work if the attack obviously couldn’t have come from the duplicate. For instance, if you fired a ray, you could make it look like it came from the duplicate as long as the duplicate was positioned appropriately, but if you attacked with a sword and your duplicate was across the room from the target, your Deception check would automatically fail.
''Trigger'' A creature attempts a flat check to target you because you’re [[Concealed]] or [[Hidden]] due to fog, haze, mist, or smoke;
You shroud yourself in mist, making it harder for your foe to hit you.
If you’re concealed, the DC of the flat check increases from 5 to 7; if you’re hidden, it increases from 11 to 13.
You blend in with unnatural subtlety.
When you are [[Concealed]] or [[Hidden]], increase the DC of the flat check to target you to 6 if
you’re concealed or 12 if you’re hidden.
You condense the moisture in the air, solidifying it so it can hold your weight.
When you use [[Water Strider]], you can walk on air.
You can ascend and descend at a maximum of a 45-degree angle.
You still [[fall|Falling]] at the end of your movement if you don’t end on a surface that can support you, as normal for Water Strider.
You no longer need to be immersed in water every 24 hours to maintain your skin and can instead mist or wipe your skin with water to live comfortably. Your land Speed is 25 feet, but your swim Speed is only 15 feet.
A faint mist emanates from your skin, making you [[Concealed]] for the listed duration.
As usual, if you become concealed when your position is still obvious, you can’t use this concealment to [[Hide]] or [[Sneak]].
| !Type | !Level | !Price | !Duration |
| Lesser | 4 | 180 | 3 rounds |
| Moderate | 6 | 560 | 1 minute |
| Greater | 10 | 1800 | 5 minutes |
You have a connection to vaporous forms of water, such as fog and mist.
You gain the [[Mist Blending]] reaction.
Mithral is renowned for its lightness, durability, and effectiveness against a range of creatures including devils and lycanthropes. It has the same sheen as silver but a slightly lighter hue.
Mithral weapons and armor are treated as if they were silver for the purpose of damaging creatures with weakness to silver.
A metal item made of mithral is lighter than one made of iron or steel: the item’s Bulk is reduced by 1 (reduced to light Bulk if its normal Bulk is 1, with no effect on an item that normally has light Bulk).
The Price of an item made of this material is based on the item’s normal Bulk, not its reduced Bulk for being made of mithral, but reduce the Bulk before making any further Bulk adjustments for the size of the item.
| !Unit | !Price | !Bulk |
| Branch | 5000 | L |
| Lumber | 50000 | 1 |
| !Grade | !Level | !Price |
| Standard | 8 | 3500/Bulk |
| High | 16 | 60000/Bulk |
| !Item | !Grade | !Hardness | !HP | !BT |
| Thin | Standard | 5 | 20 | 10 |
| Thin | High | 8 | 32 | 16 |
| Item | Standard | 9 | 36 | 18 |
| Item | High | 12 | 48 | 24 |
| Structure | Standard | 18 | 72 | 36 |
| Structure | High | 24 | 96 | 48 |
Mithral armor is 1 Bulk lighter than normal (or light Bulk if its normal Bulk is 1, with no effect on armor that normally has light Bulk).
It’s easier to wear than normal metal armor, reducing the Strength score necessary to ignore its check penalty by 2 and reducing its Speed penalty by 5 feet.
| !Type | !Level | !Price | !Value of Mithral needed | !Hardness | !HP | !BT | !Magic Level Limit |
| Standard-Grade | 12 | 16000 + 1600/Bulk | 2000 + 200/Bulk | 9 | 36 | 18 | 15 |
| High-Grade | 20 | 320000 + 32000/Bulk | 160000 + 16000/Bulk | 12 | 48 | 24 | Any |
Mithral weapons are slightly lighter than silver.
A mithral weapon is 1 Bulk lighter than normal (or light Bulk if its normal Bulk is 1, with no effect on a weapon that normally has light Bulk).
| !Type | !Level | !Price | !Value of Mithral needed |
| Standard-Grade | 11 | 14000 + 1400/Bulk | 1750 + 175/Bulk |
| High-Grade | 17 | 135000 + 13500/Bulk | 67500 + 6750/Bulk |
You combine two different maneuvers together into a single flowing whole.
Choose any two of [[Grapple]], [[Shove]], and [[Trip]].
Attempt both of the attacks you chose against the same or different creatures, but don’t apply the [[Multiple Attack Penalty]] until after resolving both attacks.
Your shots become nimble and deadly.
While you’re in this stance, your ranged [[Strike]]s don’t trigger [[Attacks of Opportunity|Attack of Opportunity]] or other reactions that are triggered by a ranged attack.
If you have Attack of Opportunity, you can use it with a loaded ranged weapon you’re wielding. The triggering creature must be within 5 feet of you for you to do so.
You move in a way that denies your enemies the opportunity to retaliate.
When you take a [[Stride]] action to move half your Speed or less, that movement does not trigger reactions.
You can use Mobility when Climbing, Flying, or Swimming instead of Striding if you have the corresponding movement type.
\define innermodifierblock(for:"")
<$set name="x" value=<<__for__>> >
<$set name="mfield" filter="[title<x>lowercase[]search-replace[(],[]search-replace[)],[]search-replace['],[]split[ ]join[_]addprefix[mod-]]">
<$list filter="[all[tiddlers]has<mfield>]">
<tr><th><$link/></th><td><<x>></td><td><$view field=<<mfield>> /></td></tr>
<$macrocall $name="innermodifierblock" for=<<currentTiddler>> />
</$list>
<$list filter="[list[!!modified-by]]">
<tr><th><$link/></th><td><<x>></td><td></td></tr>
<$macrocall $name="innermodifierblock" for=<<currentTiddler>> />
</$list>
</$set>
</$set>
\end
\define ModifierBlock(for:"")
<table>
<$macrocall $name="innermodifierblock" for=<<__for__>> />
<$set name="x" value=<<__for__>> >
<$set name="tfield" filter="[title<x>lowercase[]split[ ]join[_]addprefix[modtag-]]">
<$list filter="[all[tiddlers]has<tfield>]">
<tr><th><$link/></th><td><<x>></td><td><$view field=<<tfield>> /></td></tr>
</$list>
</$set>
<$list filter="[title<x>tags[]]" variable="tag">
<$set name="tagmod" filter="[<tag>lowercase[]addprefix[modtag-]]" variable="tagmod">
<$list filter="[all[tiddlers]has<tagmod>!title<x>!title<tag>]">
<tr><th><$link/></th><td><<tag>></td><td><$view field=<<tagmod>> /></td></tr>
</$list>
</$set>
</$list>
<$list filter="[list[!!virtual-tags]]" variable="tag">
<$set name="tagmod" filter="[<tag>lowercase[]addprefix[modtag-]]" variable="tagmod">
<$list filter="[all[tiddlers]has<tagmod>!title<x>!title<tag>]">
<tr><th><$link/></th><td><<tag>></td><td><$view field=<<tagmod>> /></td></tr>
</$list>
</$set>
</$list>
</$set>
</table>
\end
<$macrocall $name="ModifierBlock" for=<<currentTiddler>> />
{{||SpellSummaryTable}}
You alter the target’s memories, either erasing a memory, enhancing a memory’s clarity, altering a memory, or adding a false memory.
The target can attempt a [[Will]] save to resist the spell.
Any memories you’ve altered remain changed as long as the spell is active. //This means that others can Dispel the spell to enable the target to recover their original memories.//
If the target moves out of range before the 5 minutes is up, you can’t alter any further memories.
''Heightened (6th)'' You can cast the spell on a willing target to suppress all memory of a particular topic, detailed in 50 words or fewer. The effect is permanent, and it patches these omissions with an indistinct haze.
{{||SaveSuccessTable}}
The weapon has multiple configurations that you can switch between using an [[Interact]] action.
Typically, switching between configurations of a modular weapon allows it to deal different types of damage (listed in the trait, such as “modular B, P, or S”), though it’s possible for a modular weapon’s description to list more complicated configurations.
You push back your rage for a moment in order to think clearly.
Until the end of this turn, you can use actions with the <<tag Concentrate>>trait even if those actions don’t have the <<tag Rage>>trait.
{{||SpellSummaryTable}}
The targets experience a day’s worth of recovery in an instant.
Any detrimental effects that would be gone after 24 hours end, though this doesn’t shorten the duration of any active spells affecting the targets.
The targets regain Hit Points and recover from conditions as if they had taken 24 hours of [[Rest]], but they do not make their daily preparations again or gain any benefits of rest other than healing.
//24 hours of rest normally means that the creature recovers hit points equal to double their Constitution modifier times their level.//
The targets are then temporarily immune for 1 day.
''Requirements'' You are unarmored and wielding a [[Longbow]], [[Shortbow]], or a bow with the <<tag Monk>> trait.
You enter a specialized stance for a unique martial art centered around the use of a bow.
While in this stance, the only [[Strike]]s you can make are those using longbows, shortbows, or bows with the monk trait.
You can use [[Flurry of Blows]] with these bows.
You can use your other monk feats or monk abilities that normally require unarmed attacks with these bows when attacking within half the first range increment (normally 50 feet for a longbow and 30 feet for a shortbow), so long as the feat or ability doesn’t require a single, specific Strike.
''Special'' When you select this feat, you become trained in the longbow, shortbow, and any simple and martial bows with the monk trait. If you gain the [[Expert Strikes]] class feature, your proficiency rank for these weapons increases to expert, and if you gain the [[Master Strikes]] class feature, your proficiency rank for these weapons increases to master.
You have trained with the traditional weaponry of your monastery or school.
You gain access to uncommon weapons that have the monk trait and become trained in simple and martial monk weapons.
When your proficiency rank for unarmed attacks increases to expert or master, your proficiency rank for these weapons increases to expert or master as well.
You can use melee monk weapons with any of your monk feats or monk abilities that normally require unarmed attacks, though not if the feat or ability requires you to use a single specific type of attack, such as Crane Stance.
!! Splats
<$list filter="[tag<currentTiddler>tag[Splat]]" />
!! Class Features
| !Level | !Features |
| 1 | [[Flurry of Blows]], [[Powerful Fist]] |
| 2 | |
| 3 | [[Incredible Movement]] +10 feet, [[Mystic Strikes]] |
| 4 | |
| 5 | [[Alertness]], [[Expert Strikes]] |
| 6 | |
| 7 | [[Incredible Movement]] +15 feet, [[Path to Perfection]], [[Weapon Specialization]] |
| 8 | |
| 9 | [[Metal Strikes]], [[Monk Expertise]] |
| 10 | |
| 11 | [[Incredible Movement]] +20 feet, [[Second Path to Perfection]] |
| 12 | |
| 13 | [[Graceful Mastery]], [[Master Strikes]] |
| 14 | |
| 15 | [[Incredible Movement]] +25 feet, [[Greater Weapon Specialization]], [[Third Path to Perfection]] |
| 16 | |
| 17 | [[Adamantine Strikes]], [[Graceful Legend]] |
| 18 | |
| 19 | [[Incredible Movement]] +30 feet, [[Perfected Form (Monk)]] |
| 20 | |
!! Class Feats
{{||ClassFeatList}}
You become trained in unarmed attacks and gain the [[Powerful Fist]] class feature.
You become trained in your choice of [[Acrobatics]] or [[Athletics]]; if you are already trained in both of these skills, you become trained in a skill of your choice.
You become trained in monk class DC.
<<levelfeatlist "4 6 8 10 12" "[tag[Archetype]field:feat-arch[Monk]]">>
Your proficiency rank for your monk class DC increases to expert.
If you have ki spells, your proficiency rank for spell attacks and spell DCs with the tradition of magic you use for your ki spells increases to expert.
You gain a +10-foot status bonus to your Speed when you’re not wearing armor.
''Prerequisites'' Class granting no more Hit Points per level than 8 + your Constitution modifier.
You gain 3 additional Hit Points for each monk archetype class feat you have.
As you continue selecting monk archetype class feats, you continue to gain additional Hit Points in this way.
You gain the [[Flurry of Blows]] action.
Affix to armor.
''Requirements'' You are trained in [[Athletics]].
This small brass pin is in the shape of a monkey climbing a tree.
When you activate this talisman, use a {{OneAction}} [[Climb]] action.
If you succeed, you move your full Speed during the Climb.
If you roll a critical failure, you get a failure instead.
This is a system tag for monk abilities that modify non-specific unarmed strikes, which are affected by abilities such as [[Monastic Weaponry]].
You swiftly assess your prey and apply what you know.
As part of the action used to [[Hunt your Prey|Hunt Prey]], you can attempt a check to [[Recall Knowledge]] about your prey.
When you critically succeed at identifying your hunted prey with [[Recall Knowledge]], you note a weakness in the creature’s defenses. You and allies you tell gain a +1 circumstance bonus to your next attack roll against that prey.
You can give bonuses from Monster Hunter only once per day against a particular creature.
You understand how to defend yourself and others against your prey.
When you grant bonuses from [[Monster Hunter]], you and your allies also each gain a +1 circumstance bonus to your next saving throw against that particular creature and to your AC against that creature’s next attack against you.
You can transform into a powerful magical creature.
Add the purple worm and sea serpent forms listed in [[Monstrosity Form (Spell)]] to your wild shape list.
If you have [[Soaring Shape]], add the phoenix form listed in [[Aerial Form]] to your wild shape list.
{{||SpellSummaryTable}}
You transform into the shape of a legendary monster, assuming a <<tag Huge>>battle form.
You must have enough space to expand into or the spell is lost.
When you cast this spell, choose phoenix, purple worm, or sea serpent.
While in this form, you gain the <<tag Beast>>trait (for phoenix) or the <<tag Animal>> trait (for purple worm or sea serpent).
You can [[Dismiss]] the spell.
{{BattleFormRestrictions}}
You gain the following statistics and abilities regardless of which battle form you choose:
* AC = 20 + your level. Ignore your armor’s check penalty and Speed reduction.
* 20 temporary Hit Points.
* [[Darkvision]].
* One or more unarmed melee attacks specific to the battle form you choose, which are the only attacks you can use. You’re trained with them. Your attack modifier is +28, and you use the listed damage. These attacks are [[Strength]] based (for the purpose of the [[Enfeebled]] condition, for example). If your unarmed attack modifier is higher, you can use it instead.
* [[Athletics]] modifier of +30, unless your own modifier is higher.
You also gain specific abilities based on the type of monster you choose:
* ''Phoenix'' Speed 30 feet, fly Speed 90 feet; Melee {{OneAction}} beak ([[Reach]] 15 feet), Damage 2d6+12 piercing plus 2d4 fire and 2d4 persistent fire; Melee {{OneAction}} talon ([[Agile]], [[Reach]] 15 feet), Damage 2d8+12 slashing; ''Shroud of Flame'' (aura, evocation, fire, primal) 20 feet. You gain an aura of fire that extends out from you. A creature that enters or ends its turn within the aura takes 2d6 fire damage. A creature can take this damage only once per turn. You can use a single action, which has the <<tag Concentrate>> trait, to activate or deactivate this aura.
* ''Purple Worm'' Speed 40 feet, burrow Speed 30 feet, swim Speed 20 feet; Melee {{OneAction}} jaws (reach 10 feet), Damage 2d12+20 piercing; Melee {{OneAction}} stinger ([[Agile]], [[Reach]] 10 feet), Damage 2d8+15 piercing plus 2d6 persistent poison; Melee {{OneAction}} body (reach 10 feet) Damage 2d8+20 bludgeoning; ''Inexorable'' You automatically recover from the [[Paralyzed]], [[Slowed]], and [[Stunned]] conditions at the end of each of your turns. You’re also immune to being [[Immobilized]] and ignore [[Difficult Terrain]] and greater difficult terrain.
* ''Sea Serpent'' Speed 20 feet, swim Speed 90 feet; Melee {{OneAction}} jaws (reach 15 feet), Damage 2d12+20 piercing; Melee {{OneAction}} tail (reach 25 feet), Damage 2d8+20 bludgeoning; Spine Rake {{TwoAction}} (move) You extend your spines and [[Swim]] or [[Stride]]. Each creature you’re adjacent to at any point during your movement takes 4d8+10 slashing damage (basic [[Reflex]] against your spell DC).
''Heightened (9th)'' You instead gain AC = 22 + your level, 25 temporary HP, attack modifier +31, increase damage by one damage die, and Athletics +33.
Your dual human and orc nature has given you a unique perspective, allowing you to bridge the gap between humans and the many intelligent creatures in the world that humans consider monsters.
You gain a +1 circumstance bonus to [[Diplomacy]] checks against non-humanoid intelligent creatures and against humanoids that are marginalized in human society (at the GM’s discretion, but typically at least including giants, goblins, kobolds, and orcs).
You also gain this bonus on [[Perception]] checks to [[Sense the Motives|Sense Motive]] of such creatures.
{{||SpellSummaryTable}}
A feral aspect overcomes the targets, making them tough and savage.
Targets gain 5 temporary Hit Points, a +10-foot status bonus to their Speeds, and [[Weakness]] 5 to silver.
They also grow vicious fangs and claws, which are unarmed attacks. The fangs deal 2d8 piercing damage; the claws deal 2d6 slashing damage and have the [[Agile]] and [[Finesse]] traits. The targets use their highest weapon or unarmed attack proficiency with these attacks, and if they have weapon specialization or greater weapon specialization, they add this damage as well. On a critical hit with one of these unarmed attacks, the creature struck takes 1d4 persistent bleed damage.
The targets can’t use <<tag Concentrate>>actions unless those actions also have the <<tag Rage>>trait, with the exception of [[Seek]].
A creature can attempt to end the spell’s effect on itself by using a single action, which has the <<tag Rage>>trait, to attempt a [[Will]] save against your spell DC; on a success, it ends the spell’s effect on itself.
If a target is in the light of a full moon, it also grows by one size if it were Medium or smaller. This increases the reach of a Medium or Tiny creature by 5 feet.
''Heightened (6th)'' The temporary Hit Points increase to 10, the silver weakness to 10, and the damage dealt by the attacks to three dice.
''Heightened (10th)'' The temporary Hit Points increase to 20, the silver weakness to 20, and the damage dealt by the attacks to four dice.
Your mother was a moon hag, a handmaiden of Groetus, and you have a single scarlet eye and a sliver of her supernal foresight.
You can cast [[Guidance]] as an occult innate cantrip. A cantrip is heightened to a spell level equal to half your level rounded up.
{{||SpellSummaryTable}}
You shine a ray of moonlight.
Make a spell attack roll.
The beam of light deals 1d6 <<tag Fire>> damage.
Moonbeam deals silver damage for the purposes of weaknesses, resistances, and the like.
''Heightened (+1)'' The ray’s damage increases by 1d6.
{{||ActionSuccessList}}
{{||SpellSummaryTable}}
You summon a bridge of radiant, shimmering moonlight.
The 10‑foot‑wide span must start at the ground on a point within range, and it extends as a horizontal plane, either in a straight line or at any angle up to 45 degrees upward or downward, for up to 120 feet.
This bridge has AC 10, Hardness 30, and 60 Hit Points, and it’s immune to critical hits and precision damage.
You and your allies can cross the bridge normally, but other creatures simply pass through it if they try to do so.
The bridge blocks physical, ethereal, and incorporeal attacks from crossing, whether from above or below.
You can [[Dismiss]] the spell.
''Heightened (+1)'' The length of the bridge increases by 20 feet, and its Hit Points increase by 20.
''Craft Requirements'' The initial raw materials must include 33 gp of silver.
This [[+1|Armor Potency]] [[Silver|Silver Armor]] chain shirt has a collar adorned with stitched images of the phases of the moon.
You can see in moonlight as though you had [[Low-Light Vision]].
''Activate'' {{OneAction}} Interact; ''Frequency'' once per day; ''Effect'' You touch the stitched image of the new moon on the armor’s collar and suppress the [[Dazzled]] condition for 1 minute.
Spells that slightly alter a creature’s form have the morph trait.
Any [[Strike]]s specifically granted by a morph effect are [[Magical]].
You can be affected by multiple morph spells at once, but if you morph the same body part more than once, the second morph effect attempts to [[Counteract]] the first.
Your morph effects might also end if you are [[Polymorph]]ed and the polymorph effect invalidates or overrides your morph effect. For instance, a morph that gave you wings would be dismissed if you polymorphed into a form that had wings of its own (though if your new form lacked wings, you’d keep the wings from your morph).
The GM determines which morph effects can be used together and which can’t.
Much like morrignas, you feel an affinity for spiders.
You can cast [[Animal Messenger]] (spiders only), [[Speak With Animals]] (spiders only), and [[Spider Climb]] each once per day as 2nd-level divine innate spells.
''Prerequisites'' You follow the Laws of Mortality.
You grant greater healing when the gods don’t interfere.
When you roll a success to Treat Wounds for a creature that hasn’t regained Hit Points from divine magic in the past 24 hours, you get a critical success on your check instead and restore the corresponding amount of Hit Points.
{{LOWGFeat}}
Your reckonings have prepared your body for physical punishment.
Choose bludgeoning, piercing, or slashing damage, based on the nature of your physical reckonings.
You gain resistance to the chosen damage type equal to your number of class feats from the Hellknight Armiger archetype and other Hellknight archetypes.
''Frequency'' once per minute
''Trigger'' An adjacent ally is hit by an attack.
You have the protective instinct your own mother lacks and will gladly suffer in another’s place.
You interpose yourself in the attack’s path. You become the target of the triggering attack and are automatically hit by the attack (or critically hit if the ally was critically hit), suffering the full effects in your ally’s place.
Motion sense allows you to detect nearby motion through vibration and air movement.
''Requirements'' You are adjacent to a creature that is at least one size larger than you and is willing to be your mount.
You move onto the creature and ride it.
//If you have the [[Ride]] feat, the creature skips its next turn and acts as a [[Minion]] under your control on your next turn. If you don't, you have to use [[Command an Animal]] to tell the mount what to do.//
If you’re already mounted, you can instead use this action to dismount, moving off the mount into a space adjacent to it.
''Requirements'' You are in [[Mountain Stance]].
You stomp, shaking the earth beneath you.
Creatures on the ground within a 20-foot [[Emanation]] take damage equal to your Strength modifier (minimum 0), which they can resist with a basic [[Fortitude]] save.
On a failure, they also fall prone.
After you use this action, you can’t use it again for 1d4 rounds.
''Special'' If you have this feat, the [[Dexterity]] modifier cap to your AC while using Mountain Stance increases from +1 to +2.
''Requirements'' You are unarmored and touching the ground.
You enter the stance of an implacable mountain—a technique first discovered by dwarven monks—allowing you to strike with the weight of an avalanche.
The only [[Strike]]s you can make are falling stone unarmed attacks. These deal 1d8 bludgeoning damage; are in the brawling group; and have the [[Forceful]], [[Nonlethal]], and [[Unarmed]] traits.
While in Mountain Stance, you gain a +4 status bonus to AC and a +2 circumstance bonus to any defenses against being [[Shove]]d or [[Trip]]ped. However, you have a Dexterity modifier cap to your AC of +0, meaning you don’t add your Dexterity to your AC, and your Speeds are all reduced by 5 feet.
''Requirements'' You are in [[Mountain Stance]].
You focus on your connection to the earth and call upon the mountain to block attacks against you.
You gain a +2 circumstance bonus to [[AC]] until the beginning of your next turn.
''Special'' If you have this feat, the Dexterity modifier cap to your AC while you’re in [[Mountain Stance]] increases from +0 to +1.
Your hardiness lets you withstand more punishment than most before going down.
Increase your maximum Hit Points by your level. __When you have the dying condition, the DC of your recovery checks is equal to 9 + your dying value (instead of 10 + your dying value).__
If you also have the [[Toughness]] feat, the Hit Points gained from it and this feat are cumulative, and __the DC of your recovery checks is equal to 6 + your dying value__.
You can cast the [[Disrupt Undead]] cantrip as a primal innate spell at will.
A cantrip is heightened to a spell level equal to half your level rounded up.
Each time you cast a spell from a tengu heritage or ancestry feat, you can decide whether it’s a divine or primal spell.
You can ride some creatures into combat.
As noted in the [[Mount]] specialty basic action, your mount needs to be at least one size larger than you and willing.
Your mount acts on your initiative.
You must use the [[Command an Animal]] action to get your mount to spend its actions. If you don’t, the animal wastes its actions. For example, if you are mounted on a horse and you make three attacks, your horse would remain stationary since you didn’t command it. If you instead spent your first action to Command an Animal and succeeded, you could get your mount to [[Stride]]. You could spend your next action to attack or to command the horse to attack, but not both.
For an intelligent mount (such as a pegasus or unicorn), use the standard rules for mounted combat, but instead of attempting a check to Command an Animal, the rider uses the same number of actions to ask the creature to do what they want. As the GM, you determine whether the creature does as requested and whether [[Diplomacy]] checks or the like are needed. It’s recommended you disallow humanoid creatures and most other bipeds as mounts, especially if they are PCs. If you choose to allow this anyway, either the rider or mount should use at least one hand to hold onto the other, and both should spend an action on each of their turns to remain mounted.
If you have the [[Ride]] general feat, you succeed automatically when you Command an Animal that’s your mount.
When you’re mounted, attackers can target either you or your mount. Anything that affects multiple creatures (such as an area) affects both of you as long as you’re both in the area.
You are in an attacker’s reach or range if any square of your mount is within reach or range. Because your mount is larger than you and you share its space, you have lesser cover against attacks targeting you when you’re mounted if the mount would be in the way.
Because you can’t move your body as freely while you’re riding a mount, you take a –2 circumstance penalty to Reflex saves while mounted. Additionally, the only move action you can use is the Mount action to dismount.
You’ve trained with your shield to defend both yourself and your mount.
When you [[Raise a Shield]] while mounted, both you and your mount gain the shield’s circumstance bonus to AC.
If you have the [[Shield Block]] reaction, you can use it in response to your mount taking damage, as long as you’re riding your mount. If you do, the shield prevents your mount from taking damage instead of preventing you from taking damage, following the normal rules for Shield Block.
An action with this trait involves moving from one space to another.
Some reactions and free actions are triggered by a creature using an action with the move trait. The most notable example is [[Attack of Opportunity]].
Actions with the move trait can trigger reactions or free actions throughout the course of the distance traveled. Each time you exit a square (or move 5 feet if not using a grid) within a creature’s reach, your movement triggers those reactions and free actions (although no more than once per move action for a given reacting creature).
If you use a move action but don’t move out of a square, the trigger instead happens at the end of that action or ability.
Some actions, such as [[Step]], specifically state they don’t trigger reactions or free actions based on movement.
[[Levitate]]: For the duration of the spell, you can move the target up or down 10 feet with a single action, which has the <<tag Concentrate>> trait.
You make a quick attack and rob your foe in the process.
Make a melee [[Strike]] against an adjacent foe.
If you hit and deal sneak attack damage, you can also attempt to [[Steal]] from the target, even if the target is in combat.
You get the [[Alchemical Crafting]] feat, [[Infused Reagents]] (a pool of
reagents usable to make alchemical items), and [[Advanced Alchemy]] (allowing you to make alchemical items during your daily preparations without the normal cost or time expenditure).
The individual archetype might impose special restrictions or benefits, or adjust the number of reagents you get or your advanced alchemy level.
If you gain infused reagents from more than one source, you use the highest number of reagents to determine your pool rather than adding them together.
Your advanced alchemy level always depends on which ability you’re using.
You gain a 1st- or 2nd- level <$transclude field="feat-arch"/> feat.
<$macrocall name="levelfeatlist" levels="1 2" filter="[tag[Class]tag<feat-arch>]" />
The feat grants a 1st-level spell slot.
At 6th level, they grant you a 2nd‑level spell slot; __and if you have a spell repertoire, you can select one spell from your repertoire as a signature spell.__
At 8th level, they grant you a 3rd-level spell slot.
You are an expert in spell attack rolls and DCs of the appropriate magical tradition and grant you a 4th-level spell slot.
At 14th level, they grant you a 5th-level spell slot, and at 16th level, they grant you a 6th-level spell slot.
__If you have a spell repertoire, you can select a second spell from your repertoire as a signature spell.__
Upon reaching 18th level, these feats make you a master in spell attack rolls and DCs of the appropriate magical tradition and grant you a 7th-level spell slot.
At 20th level, they grant you an 8th-level spell slot.
__If you have a spell repertoire, you can select a third spell from your repertoire as a signature spell.__
Your muse doesn’t fall into a single label.
Choose a type of muse other than that of your own.
You gain a 1st-level feat that requires that muse, and your muse is now also a muse of that type, allowing you to take feats with the other muse as a prerequisite.
You don’t gain any of the other effects of the muse you chose.
''Special'' You can take this feat multiple times. Each time you do, you must choose a different type of muse other than that of your own.
''Prerequisites'' Trained in [[Society]].
You easily pick up new languages.
You learn two new languages, chosen from common languages, uncommon languages, and any others you have access to.
You learn an additional language if you are or become a master in Society and again if you are or become legendary.
You can select this feat multiple times. Each time, you learn additional languages.
You use multiple languages to create and break codes.
You gain a +1 circumstance bonus to [[Decipher Writing]].
If another creature attempts to Decipher Writing you encoded, they take a –2 circumstance penalty unless they speak all the languages you used when you created the writing.
''Requirements'' You are wielding a ranged weapon with reload 0.
You lock yourself in a stable position so you can fire swiftly and accurately.
While you are in this stance, your penalty for [[Double Shot]] is reduced to –1, or –2 if you add the extra action to make three Strikes.
If you move from your position, this stance ends.
You’ve learned to split your focus between multiple classes with ease.
You gain a 2nd-level multiclass dedication feat, even if you normally couldn’t take another dedication feat until you take more feats from your current archetype.
If you’re a [[Half-Elf]], you don’t need to meet the feat’s ability score prerequisites.
Affix to a weapon.
''Requirements'' You are a master in [[Perception]].
This talisman is the magically treated corpse of a tiny bat bound in papyrus.
When you activate {{OneAction}} the bat, the affixed weapon detects vibrations around you and guides your perception. You gain the benefits of the fighter [[Blind-Fight]] class feat for 1 minute.
If you have the Blind-Fight feat, you gain [[Imprecise]] echolocation with a range of 30 feet for 1 minute. This makes creatures that would be [[Undetected]] by you because you can’t see them [[Hidden]] instead.
Affix to a weapon.
''Requirements'' You are an expert with the affixed weapon.
''Trigger'' You damage a [[Flat-Footed]] creature with a [[Strike]] using the affixed weapon.
This black strand of leather is tied to look like a peace knot when the weapon is worn, but it doesn’t hamper drawing the weapon.
When you activate the knot, the creature you damaged takes 1d6 persistent bleed damage.
If you have the [[Twist the Knife]] feat, the talisman instead deals persistent bleed damage equal to your sneak attack damage.
You need only a successful DC 3 flat check when targeting a [[Concealed]] creature and a successful DC 9 flat check when targeting a [[Hidden]] creature.
Your vision pierces through non-magical fog, mist, rain, and snow.
You don’t take circumstance penalties to ranged attacks or [[Perception]] checks caused by non-magical precipitation, and your targeted attacks don’t require a flat check to succeed against a target concealed only by such effects.
Your blood sings with the liberating power of the azatas, living embodiments of freedom from the wild realm of Elysium.
You gain a +1 circumstance bonus to [[Escape]].
When you roll a critical failure on a check to Escape, you get a failure instead, and when you roll a success, you get a critical success instead.
Your familiar’s supernatural spirit has outgrown its corporeal body.
You can conduct a special 10-minute activity to reselect certain familiar abilities, switching one or more of the following abilities for other abilities on this list: amphibious, burrower, climber, darkvision, fast movement, manual dexterity, resistance, and scent.
You can reselect only familiar abilities you would normally be able to reselect each day, not required familiar abilities for your familiar.
You can’t remove an ability that is required for another ability your familiar has (for instance, you can’t remove manual dexterity if the familiar has lab assistant).
''Frequency'' Once per day.
You experience a brief resurgence of a mutagen.
Choose one mutagen you’ve consumed since your last [[daily preparations|Rest]].
You gain the effects of that mutagen for 1 minute.
You focus on bizarre mutagenic transformations that sacrifice one aspect of a creature’s physical or psychological being in order to strengthen another.
''Level 1'': You start with the formulas for two 1st-level mutagens in your formula book, in addition to your other formulas.
''Level 1'': __You gain [[Mutagenic Flashback]].__
''Level 5'': When using [[Advanced Alchemy]] to make mutagens during your daily preparations, you can use a batch of reagents to create any three mutagens instead of just two of the same mutagen.
''Level 13'': If you imbibe another mutagen while you are under the effects of a mutagen that you created, you can gain the benefits and the drawbacks of both mutagens at once, despite the fact that they both have the <<tag Polymorph>> trait and would not normally function together. If you come under the effects of any further mutagens while benefiting from two mutagens, you lose the benefit of one of the former mutagens of your choice, while retaining the drawbacks of all the mutagens. If you are under the effects of two mutagens and you come under the effect of a non-mutagen polymorph effect, you lose the benefits of the mutagens while retaining the drawbacks of both.
Select one unarmed attack you gained with [[Living Weapon]].
The damage die for that attack increases by one step until the end of your turn.
In addition, choose to either have the attack gain a reach of 10 feet until the end of your turn or for you to gain a +1 status bonus to attack rolls with the chosen unarmed attack until the end of your turn.
The DC for your checks to recover from persistent bleed damage is 10 instead of 15, and it’s reduced to 5 instead of 10 if you have particularly effective assistance recovering from the persistent damage.
With a bit of self-discovery, you find a new form.
You gain the alternate form of a kitsune heritage other than your own, adding it to the options for your [[Change Shape|Change Shape (Kitsune)]].
Your mystery holds unknowable depths of magic not always associated with the divine.
You can have one spell in your spell repertoire not on the divine spell list, in addition to spells you’ve added to your spell list from feats like [[Divine Access]].
You cast that spell as a divine spell.
You can swap which spell you add and from which tradition as you could any other oracle spell, but you can’t use this feat to have more than one spell from another tradition in your spell repertoire at the same time.
An oracle wields divine power, but not from a single divine being. This power could come from a potent concept or ideal, the attention of multiple divine entities whose areas of concern all touch on that subject, or a direct and dangerous conduit to raw divine power. This is the oracle’s mystery, a source of divine magic not beholden to any deity.
Your mystery grants you special spells called revelation spells and might later grant you divine domain spells. It dictates the effects of your oracular curse, adds an additional cantrip to your repertoire, and gives you one or more trained skills. Drawing insight and power from the collective divine influences that fuel your magic also provides you with a special benefit.
The powers of your mystery manifest in the form of revelation spells, which are a type of focus spell. Casting a revelation spell costs 1 Focus Point and increases the effects of your oracular curse You start with a focus pool of 2 Focus Points. You refill your focus pool during your daily preparations, and you can regain 1 Focus Point by spending 10 minutes using the [[Refocus]] activity to reconcile the conflicting or unconventional nature of your divine mystery.
Revelation spells have the <<tag Cursebound>> trait, unlike other focus spells. This trait means they increase the severity of your oracular curse when cast. You can’t cast a cursebound spell if you don’t have an oracular curse.
A curse continually gives you a mild but constant reminder that you carry otherworldly power.
Your curse progresses to its minor stage the first time you finish casting a revelation spell after your daily preparations. Once your minor curse has manifested, it remains in effect until you rest for 8 hours and again make your daily preparations.
If you cast a revelation spell while your minor curse is in effect, you progress to the moderate curse effect immediately after you finish Casting the Spell. The minor effect continues to affect you, though some moderate curse effects might alter the specifics of your minor curse.
At higher levels, you can cast more revelation spells, progressing your curse to its major stage and then an extreme stage; these stronger curses are cumulative with the effects of the lower stages and can alter them.
When you [[Refocus]] while under the effects of your moderate or stronger curse, you reduce your curse’s severity to minor in addition to regaining a Focus Point.
Immediately after casting a revelation spell while under the moderate effect of your curse, you are overwhelmed. While overwhelmed, you can’t Cast or Sustain any revelation spells— you effectively lose access to those spells. You can still [[Refocus]] to reduce the effects of your curse and regain a Focus Point, but doing so doesn’t allow you to cast further
revelation spells. These effects last until you rest for 8 hours and make your daily preparations, at which point your curse returns to its basic state.
At higher levels, you can grow to withstand your curse’s major and even extreme effects, enabling you to cast more revelation spells without becoming overwhelmed.
Your curse has the <<tag Curse>>, <<tag Divine>>, and <<tag Necromancy>> traits. You can’t mitigate, reduce, or remove the effects of your oracular curse by any means other than Refocusing and resting for 8 hours. For example, if your curse makes creatures concealed from you, you can’t negate that concealed condition through a magic item or spell, such as true strike (though you would still benefit from the other effects of that item or spell). Likewise, [[Remove Curse]] and similar spells don’t affect your curse at all.
The power of your mystery enables you to cast more than just revelation spells.
When you cast a spell of 5th level or lower that has no duration, instead of spending a spell slot, you can advance the effects of your oracular curse in the same manner as when you cast a revelation spell.
A spell cast in this way gains the <<tag Cursebound>> trait.
<table>
<tr>
<th>Granted Cantrip</th><td><$list filter="[all[current]list[!!my-cantrip]]"> <$link/> </$list></td>
</tr>
<tr>
<th>Trained Skill</th><td><$list filter="[all[current]list[!!my-skill]]"> <$link/> </$list></td>
</tr>
<tr>
<th>Related Domains</th><td><$list filter="[all[current]list[!!my-domain]]"> <$link/> </$list></td>
</tr>
<tr>
<th>Revelation Spells</th><td><$list filter="[all[current]listed[m-mystery]sort[m-level]]">
<$link to=<<currentTiddler>> /><br/> </$list></td>
</tr>
</table>
{{||SpellSummaryTable}}
The next damaging or <<tag Healing>>spell the target casts before the start of your next turn deals damage or restores Hit Points as if the spell were heightened 1 level higher than its actual level.
The spell otherwise functions at its actual level.
Once the target casts the spell, mystic beacon ends.
Focusing your will into your physical attacks imbues them with mystical energy.
Your unarmed attacks become <<tag Magical>>, allowing them to get past resistances
to non-magical attacks.
However, you still need an item such as __[[Handwraps of Mighty Blows]]__ to gain an item bonus to attack rolls or increase your attacks’ weapon damage dice.
{{LOWGFeat}}
Your mask protects you further from divination.
Once per day, you can cast [[Nondetection]] on yourself, heightened to the highest level of spell you can cast; the spell ends immediately if your mask is removed for even a moment.
''Frequency'' once per day.
Your nanites fly out of your body, swarming around you in a cloud.
You become [[Concealed]] for a number of rounds equal to half your level.
You can’t use this concealment to [[Hide]] or [[Sneak]], as normal for concealment that makes your position obvious.
While Nanite Shroud is active, you can’t use other abilities that require the use of your nanites.
''Frequency'' Once per hour.
''Trigger'' You attempt a skill check requiring three actions or fewer.
You stimulate your nanites, forcing your body to temporarily increase its efficiency.
You gain a +2 status bonus to the triggering skill check.
In addition, your circuitry glows, lighting a 10-foot [[Emanation]] with [[Dim Light]] for 1 round..
A narrow surface is so precariously thin that you need to [[Balance]] (see [[Acrobatics]]) or risk falling.
Even on a success, you are [[Flat-Footed]] on a narrow surface.
Each time you are hit by an attack or fail a save on a narrow surface, you must succeed at a [[Reflex]] save (with the same DC as the Acrobatics check to Balance) or fall.
You were raised to be ambitious and always reach for the stars, leading you to progress quickly in your chosen field.
You gain a 1st-level class feat for your class.
You must meet the prerequisites, but you can select the feat later in the character creation process in order to determine which prerequisites you meet.
By drawing upon the First World’s magic, you can siphon a portion of that malleable world to create a convincing illusion.
Once per day, you can cast [[Illusory Disguise]], [[Item Facade]], or [[Ventriloquism]].
At 7th level, the spell is heightened to 2nd level, and every 2 levels thereafter, the spell is heightened an additional spell level.
''Prerequisites'' Trained in [[Nature]].
You can apply natural cures to heal your allies. You can use Nature instead of [[Medicine]] to [[Treat Wounds]].
If you’re in the wilderness, you might have easier access to fresh ingredients, allowing you to gain a +2 circumstance bonus to your check to Treat Wounds using Nature, subject to the GM’s determination.
Entertainment comes naturally to you.
You become trained in [[Performance]] and gain one 1st-level Performance skill feat.
Your ingenuity allows you to learn a wide variety of skills.
You gain the trained proficiency rank in two skills of your choice.
''Key Ability'' [[Wisdom]].
You know a great deal about the natural world, and you command and train animals and magical beasts.
{{||SkillActionList}}
{{||SkillFeatList}}
{{||SkillRitualList}}
{{||SpellSummaryTable}}
The primal power of the world flows through you.
You transform into an incarnation of nature, either a green man or a kaiju.
Your battle form is Medium for a green man or Gargantuan (30-foot-by-30-foot space) for a kaiju.
You must have enough space to expand into or the spell is lost.
While in this form, you gain the <<tag Plant>>trait (for a green man) or the <<tag Beast>> trait (for a kaiju).
You can [[Dismiss]] the spell.
{{BattleFormRestrictions}}
You gain the following statistics and abilities regardless of which battle form you choose:
* AC = 25 + your level. Ignore your armor’s check penalty and Speed reduction.
* 30 temporary Hit Points.
* [[Darkvision]].
* One or more attacks specific to the battle form you choose, which are the only attacks you can use. You’re trained with them. Your attack modifier is +34, and you use the listed damage. These attacks are [[Strength]] based (for the purpose of the [[Enfeebled]] condition, for example). If your unarmed attack modifier is higher, you can use it instead.
* [[Athletics]] modifier of +36, unless your own modifier is higher.
You also gain specific abilities based on the type of incarnation you choose:
* ''Green Man'' Speed 40 feet, climb Speed 40 feet; Melee {{OneAction}} vines (reach 30 feet, [[Versatile]] P), Damage 6d8+12 bludgeoning; Ranged {{OneAction}} thorns (range 100 feet), Damage 6d6+6 piercing; ''Green Caress'' (aura, primal, transmutation) 60 feet. Enemies other than plants must succeed at a [[Fortitude]] save against your spell DC or become [[Clumsy]] 1 for 1 round (clumsy 2 on a critical failure).
* ''Kaiju'' Speed 50 feet; [[Resistance]] 5 to physical damage; Melee {{OneAction}} jaws ([[Reach]] 30 feet), Damage 6d10+10 piercing; Melee {{OneAction}} claws ([[Agile]], reach 30 feet), Damage 6d8+8 slashing; Melee {{OneAction}} foot (agile, reach 15 feet), Damage 6d6+10 bludgeoning; ''Unstoppable'' You are immune to being [[Immobilized]] and ignore [[Difficult Terrain]] and greater difficult terrain; Trample {{ThreeAction}} You move up to double your Speed and move through the spaces of Huge or smaller creatures, trampling each creature whose space you enter. A trampled creature takes foot damage with a basic [[Reflex]] save against your spell DC.
{{||SpellSummaryTable}}
''Requirements'' You have a free hand.
A palm-sized raw fruit or vegetable appears in your open hand. You choose the specific type of food.
A creature can consume the food with an [[Interact]] action to regain 3d10+12 Hit Points and be nourished as if it had eaten a meal.
If uneaten, the food rots and crumbles to dust after 1 minute.
''Heightened (+1)'' The Hit Points restored increase by 6.
You always find the weak points in your foes’ defenses when they’re on unfavorable terrain.
Enemies are [[Flat-Footed]] to you if they’re in natural [[Difficult Terrain]], or in difficult terrain resulting from a snare.
{{||SpellSummaryTable}}
Animals and plants in the area turn against the targets.
Each target suffers from the following effects as long as it remains in the area.
* Vegetation springs up from every surface, giving each target a –10-foot circumstance penalty to its [[Speed]] any time it’s adjacent to the plants.
* Aggressive animals attack unpredictably. At the start of its turn, each target rolls a DC 8 flat check. On a failure, it’s attacked by swarming creatures that deal 2d10 slashing damage. The target attempts a basic [[Reflex]] save, and it is [[Flat-Footed]] for 1 round on any outcome other than a critical success.
* The target loses any connection to nature or natural creatures. The target has to succeed at a DC 5 flat check when casting any <<tag Primal>>spell or the spell fails. Furthermore, <<tag Animal>> or <<tag Plant>>creatures become [[Hostile]] to it, even one with a strong bond to the target, such as an animal companion.
The GM might decide that you can’t subject some creatures, such as an emissary of a nature deity, to the ire of nature.
Necromancy spells harness the power of life and death.
They can sap life essence or sustain creatures with life-saving healing.
Necromancy spells often have the <<tag Curse>>, <<tag Death>>, <<tag Healing>>, <<tag Negative>>, or <<tag Positive>> traits.
Your unusual physiology has developed in a way that makes it difficult for parasites and other infestations to prey upon you.
You gain a +2 circumstance bonus to saves against [[Disease]]s.
As part of your training, you’ve inured yourself against necromancy through repeated exposure.
You gain a +1 circumstance bonus to saves against <<tag Necromancy>> effects and gain resistance to negative damage equal to half your level.
Your training against necromantic effects allows you to escape the worst of their touch.
If you roll a success on a saving throw against a necromancy effect, you get a critical success instead; if you roll a critical failure on such a save, you get a failure instead.
''Prerequisites'' harmful font, evil alignment
You pour negative energy into your undead subject to empower its attacks.
If the next action you use is to cast [[Harm]] to restore Hit Points to a single undead creature, the target then deals an additional 1d6 negative damage with its melee weapons and unarmed attacks until the end of its next turn.
If the harm spell is at least 5th level, this damage increases to 2d6, and if the harm spell is at least 8th level, the damage increases to 3d6.
{{||SpellSummaryTable}}
You imbue the touched object or space with slow-acting necrotic radiation.
If you cast the spell on an object, any creature ending its turn holding or carrying the object takes 2d6 negative damage.
If you cast the spell on an area, any creature ending its turn in the area takes 2d6 negative damage.
You can attempt to use this spell on an attended object by touching the object. If you do, the creature attempts a [[Reflex]] save to reduce the effect.
''Heightened (+2)'' Increase the radiation's negative damage by 1d6.
{{||SaveSuccessTable}}
A shimmering liquid, nectar of purification is often stored in bottles similar to those used for vinegar.
This oil casts a 1st-level [[Purify Food and Drink]] spell over any food or drink onto which it’s poured.
The nectar evaporates as it takes effect, leaving the taste and texture of the food or drink unaltered.
{{||SpellSummaryTable}}
A long, jagged needle jabs into the target foe’s psyche whenever it tries to attack a specifically forbidden creature.
Name yourself or one of your allies. The target takes 2 <<tag Mental>> damage any time it uses a [[Hostile Action]] against the named creature.
''Heightened (+1)'' Increase the damage by 2.
{{||SpellSummaryTable}}
The target loses its odor, preventing creatures from passively noticing its presence via smell alone, even if the creatures have precise or imprecise [[Scent]].
A creature attempting a [[Perception]] check to [[Seek]] with scent and other senses might notice the lack of natural scent.
If the target has any abilities that result from its smell, such as an overpowering scent, those abilities are also negated.
''Heightened (5th)'' The range increases to 30 feet, and you can target up to 10 creatures.
A creature with negative healing draws health from negative energy rather than positive energy.
It is damaged by positive damage and is not healed by positive healing effects.
It does not take negative damage, and it is healed by negative effects that heal undead.
//Note: a creature with Negative Healing is subject to positive ''damage'', but is ''not'' damaged by positive healing effects. Likewise, they are not automatically healed by negative ''damage''.//
You trust the strength of your wings and can spread them to glide safely to the ground.
As long as you can act, you take no damage from falling, no matter what distance you fall.
Mindfog mist can be used to undermine spellcasters, as its effect on a victim’s mental faculties are swift and powerful.
| !Saving Throw |DC 27 [[Fortitude]] |
| !Onset |1 minute |
| !Maximum Duration |6 minutes |
| !Stage 1 |8d6 poison damage (1 minute) |
| !Stage 2 |10d6 poison damage (1 minute) |
| !Stage 3 |13d6 poison damage (1 minute) |
{{||SpellSummaryTable}}
You pour healing magic through the target in an attempt to cure one [[Poison]] afflicting it.
Attempt a [[Counteract]] check against the poison.
''Trigger'' You would gain the [[Fatigued]] condition.
''Requirements'' You are observed by at least three creatures who aren’t foes.
As long as you have an audience, you can continue to perform. Indeed, you must—you have an obligation to your fans!
You delay the effects of the [[Fatigued]] condition for 1 minute or until you are no longer observed by the required creatures, whichever comes first.
If the fatigued condition has a duration, the duration begins to elapse only after the delay.
You can’t further delay or prevent the fatigued condition after this ability ends.
<<ModifierBlock "NewTiddler">>
the next time you make your [[daily preparations|Rest]]
<!--
Decoration icons-->
<$list filter="[all[current]field:a-actions[1]]">
{{OneAction}}
</$list>
<$list filter="[all[current]field:a-actions[2]]">
{{TwoAction}}
</$list>
<$list filter="[all[current]field:a-actions[3]]">
{{ThreeAction}}
</$list>
<$list filter="[all[current]tag[Reaction]]">
{{ReactionIcon}}
</$list>
<$list filter="[all[current]tag[Free]]">
{{FreeAction}}
</$list>
<$list filter="[all[current]tag[Focus Spell]]">
{{SpellIcon}}
</$list>
<!--
Feat link-->
<$link />
<!--
Aftertags -->
<$list filter="[all[current]tag[Focus Spell]!tag[Cantrip]]">
(Focus Spell)
</$list>
<$list filter="[all[current]tag[Focus Spell]tag[Cantrip]]">
(Focus Cantrip)
</$list>
<$list filter="[all[current]tag[Uncommon]]">
(Uncommon)
</$list>
<$list filter="[all[current]tag[Rare]]">
(Rare)
</$list>
<!--
Feat prereqs -->
<$list filter="[all[current]has[feat-fpre]]">
(Requires
<$list filter="[all[current]list[!!feat-fpre]]">
<$link/></$list>)</$list>
<!--
Splat prereqs -->
<$list filter="[all[current]has[feat-sppre]]">
(Requires
<$list filter="[all[current]list[!!feat-sppre]]">
<$link/></$list>)</$list>
<!--
Stat prereqs -->
<$list variable="checkAbpreExists" filter="[all[current]has[feat-abpre]]">
<$set name="statps" filter="[all[current]list[!!feat-abpre]count[]]">
<$list variable="index" filter="[all[current]range<statps>]">
(Requires <$list filter="[all[current]list[!!feat-abpre]nth<index>]"><$link /></$list>
<$list filter="[all[current]list[!!feat-abprel]nth<index>]"><<currentTiddler>></$list>)
</$list>
</$set>
</$list>
<!--
Skill prereqs -->
<$list filter="[all[current]list[!!feat-skill]]" variable="skill">
(Requires
<$transclude tiddler="SkillProficiencyLongName" index={{!!feat-spre}} />
<$link to=<<skill>> />)</$list>
You can tap into the magic that runs through your blood.
You gain [[Animal Form]] (wolf only, using the statistics for a canine) and [[Obscuring Mist]] as 2nd-level divine innate spells.
You can cast each of these spells once per day.
{{||SpellSummaryTable}}
You send disturbing nightmares to your target.
The next time the target falls asleep, it must attempt a [[Will]] save.
If you know the target only by name and have never met them, the target gets a +4 circumstance bonus to the Will save.
{{||SaveSuccessTable}}
Purportedly sourced from any number of outlandish locales, nightmare vapor is most often created by boiling the sweat collected from humanoids caught in the throes of terrible nightmares.
| !Saving Throw |DC 36 [[Fortitude]] |
| !Onset |1 round |
| !Maximum Duration |6 rounds |
| !Stage 1 |[[Confused]] (1 round) |
| !Stage 2 |[[Confused]] and [[Flat-Footed]] (1 round) |
| !Stage 3 |[[Confused]], [[Flat-Footed]] and [[Stupefied]] 2 (1 round) |
The nanites in your ocular processors have adapted to darkness, enhancing your ability to see in the dark.
You gain [[Darkvision]].
''Prerequisites'' Expert in [[Acrobatics]].
You can [[Crawl]] incredibly swiftly—up to half your Speed, rather than 5 feet.
If you’re a master in Acrobatics, you can Crawl at full Speed.
If you’re legendary, you aren’t [[Flat-Footed]] while [[Prone]].
''Trigger'' A creature targets you with an attack and you can see the attacker.
''Requirements'' You are not [[Encumbered]].
You deftly dodge out of the way, gaining a +2 circumstance bonus to AC against the triggering attack.
Your muscles are tightly honed.
Your Speed increases by 5 feet.
Your legs end in hooves rather than feet, with joints and tendons that allow you to move with great haste.
Your Speed increases by 5 feet.
''Special'' The Speed increase from this feat isn’t cumulative with any Speed increase from your ancestry feats (such as [[Nimble Elf]]).
You throw yourself into a roll to escape imminent danger.
You can use [[Nimble Dodge]] before attempting a [[Reflex]] save in addition to its original trigger.
If you do, the circumstance bonus applies to your Reflex save against the triggering effect.
When you use [[Nimble Dodge]] and the triggering attack fails or critically fails, or when you succeed or critically succeed at the saving throw, you can also [[Stride]] up to 10 feet as part of the reaction.
If you do, the reaction gains the <<tag Move>> trait.
You can use Nimble Roll while Flying or Swimming instead of Striding if you have the corresponding movement type.
You are so used to wielding a shield that you can do so even while using the hand that’s holding it for other purposes.
The hand you use to wield a shield counts as a free hand for the purposes of the [[Interact]] action. You can also hold another object in this hand (but you still can’t use it to wield a weapon).
This benefit doesn’t apply to tower shields, which are still too cumbersome.
If you are reduced to 0 Hit Points by a critical hit on an attack roll, you become [[Dying]] 1 instead of [[Dying]] 2.
You attempt to reduce panic.
Attempt a [[Diplomacy]] check, comparing it to the [[Will]] DC of creatures in a 10-foot emanation around you who are [[Frightened]].
{{||ActionSuccessTable}}
Each of them is temporarily immune for 1 hour.
// Yes, someone with a better Will DC is ''harder'' to free from fear. //
''Trigger'' A foe within reach attempts to move away from you.
You keep pace with a retreating foe.
[[Stride]] up to your Speed, following the foe and keeping it in reach throughout its movement until it stops moving or you’ve moved your full Speed.
You can use No Escape to [[Burrow]], [[Climb]], [[Fly]], or [[Swim]] instead of Stride if you have the corresponding movement type.
You leave little sign when attempting to remain unseen.
When you [[Avoid Notice]], you also gain the benefits of [[Cover Tracks]] unless you choose not to.
The supernatural charm of your vampiric progenitor hangs about you, and you’ve learned to use it on mortals.
Against humanoids (or other creatures of your type, if you’re not a humanoid), you gain a +1 circumstance bonus to [[Deception]] checks to [[Lie]], and to [[Diplomacy]] checks to [[Gather Information]] and [[Make an Impression]].
''Prerequisites'' [[Acute Scent]]; or precise or imprecise scent and [[Low-Light Vision]].
Your senses gain even greater clarity.
While raging, you gain [[Darkvision]] if you don’t already have it, and the range of your imprecise [[Scent]] increases to 60 feet.
You gain two additional languages of your choice, chosen from among the common and uncommon languages available to you, and every time you take the [[Multilingual]] feat, you gain another new language.
{{||SpellSummaryTable}}
You erect protective wards that make the target difficult to detect via magic.
Nondetection attempts to [[Counteract]] all <<tag Detection>>, <<tag Revelation>>, and <<tag Scrying>> <<tag Divination>>s made against the target or the target’s gear throughout the duration, counting cantrips as 1st-level spells for this purpose.
Successfully counteracting a divination that targets an area or multiple targets negates the effects only for nondetection’s target.
Attacks with this weapon are nonlethal, and are used to knock creatures unconscious instead of kill them.
You can use a nonlethal weapon to make a lethal attack with a –2 circumstance penalty.
You can alter offensive spells to be less deadly.
If your next action is to [[Cast a Spell]] that deals damage and doesn’t have the <<tag Death>> or <<tag Negative>> trait, that spell gains the <<tag Nonlethal>> trait.
1:U
2:U
3:U
4:U
5:U
6:U
7:U
8:U
9:U
10:U
11:U
12:U
13:U
14:U
15:U
16:U
17:U
18:U
19:U
20:U
Many psychopomps wear masks when dealing with the living, and many cultures believe that seeing an unmasked psychopomp’s face invites death.
You are trained in [[Intimidation]] and gain the [[Intimidating Glare]] skill feat. If you were already trained in Intimidation (from your background or class, for example), you instead become trained in a skill of your choice.
You also know how to make masks like those worn by psychopomps, a process that takes 1 hour and 1 sp of appropriate material.
If you instead pay 50 gp for a splendid psychopomp mask, the mask grants you a +1 item bonus to [[Intimidation]] while you are wearing it. Its usage is worn (mask).
{{||SpellSummaryTable}}
You emit a cloud of toxic smoke that temporarily obscures you from sight.
Each creature except you in the area when you Cast the Spell takes 1d6 poison damage (basic [[Fortitude]] save).
A creature that critically fails the saving throw also becomes [[Sickened]] 1. All creatures in the area become [[Concealed]], and all creatures outside the smoke become concealed to creatures within it.
This smoke can be dispersed by a strong wind.
''Heightened (+1)'' The damage increases by 1d6.
{{||SpellSummaryTable}}
You read slightly into the future and give fate a tiny push to achieve the result you desire.
Once during the duration, when the target fails an attack roll, skill check, or saving throw and a +1 status bonus would turn a critical failure into a failure, or failure into a success, you grant the target a +1 status bonus to the check retroactively, changing the outcome appropriately.
The spell then ends, and the target is temporarily immune for 1 minute.
If you cast nudge fate while a previous casting of this hex is still in effect, the previous effect ends.
''Prerequisites'' You have died at least once.
Your past has left you numb to death’s call.
The first time each day that you regain Hit Points while you are [[Dying]], you regain additional Hit Points equal to your level, and you neither gain the [[Wounded]] condition nor increase the value of this condition.
As long as you can hear normally, you can use the [[Seek]] action to sense [[Undetected]] creatures in a 60-foot cone instead of a 30-foot cone. You also gain a +2 circumstance bonus to locate undetected creatures that you could hear within 30 feet with a Seek action.
{{||SpellSummaryTable}}
You grant an ally a token of favor.
You create a token, such as a lock of your hair or a flower, that persists for the spell’s duration; as part of Casting the Spell, you can [[Interact]] to pass the token to an ally within your reach.
As long as the ally has the token on their person, they gain a +1 status bonus to [[Performance]] checks and [[Will]] saves.
You can [[Dismiss]] the spell as a free action.
''Heightened (4th)'' As long as the ally has the token on their person, you can cast spells that have a range of [[Touch]] on them at a range of 30 feet.
You gain a +1 circumstance bonus to [[Perception]] checks to [[Sense Motive]] and to Perception DCs against attempts to [[Lie]] to you.
Furthermore, you gain a +2 circumstance bonus to [[Diplomacy]] checks to convince others you speak the truth when you are telling the truth, and you take a –4 circumstance penalty to [[Lie]] and to your [[Deception]] DC against [[Sense Motive]].
{{||SpellSummaryTable}}
A magical indicator assures a creature that you’ve upheld your end of a bargain.
When you Cast the Spell, you create a bracelet, flower, or other such trinket.
If, while the spell persists, you complete the terms of the promise or deal you made, the trinket fades away with a pleasant chime; if you violate the terms instead, the trinket breaks with a dissonant crash.
''Heightened (3rd)'' The duration becomes 1 day.
''Heightened (5th)'' The duration becomes 1 week.
''Heightened (7th)'' The duration becomes 1 month.
''Heightened (9th)'' The duration becomes 1 year.
You can spread this blue-gray gel on a single item with a Bulk of 3 or less to ward it against magical detection.
It becomes immune to <<tag Divination>> magic of 8th level or lower (such as locate).
This oil is permanent, but it can be removed with acid.
Removing the oil in this way usually takes 1 minute for objects with Bulk of 1 or less, or a number of minutes equal to the item’s Bulk.
{{||SpellSummaryTable}}
By touching an object, you draw forth the experience of those who created and used it.
If you touch a weapon, your proficiency rank with that weapon temporarily increases to trained (if it is not already higher).
If you touch a tool, your proficiency rank with the next skill check you attempt with that tool (such as a [[Crafting]] check with a blacksmith’s hammer) within the spell’s duration temporarily increases to trained (if it is not already higher).
This spell has no benefit for activities that take longer than a minute to complete.
''Heightened (6th)'' Your proficiency rank increases to expert instead of trained.
{{||SpellSummaryTable}}
You place a hand on an object to learn a piece of information about an emotional event that occurred involving the object within the past week, determined by the GM.
If you cast object reading on the same item multiple times, you can either concentrate on a single event to gain additional pieces of information about that event, or gain a piece of information about another emotional event in the applicable time frame.
''Heightened (2nd)'' You can learn about an event that occurred within the last month.
''Heightened (4th)'' You can learn about an event that occurred within the last year.
''Heightened (6th)'' You can learn about an event that occurred within the last decade.
''Heightened (8th)'' You can learn about an event that occurred within the last century.
''Heightened (9th)'' You can learn about an event that occurred within the entirety of the object’s history.
{{||SpellSummaryTable}}
You call forth a cloud of mist.
All creatures within the mist become [[Concealed]], and all creatures outside the mist become
concealed to creatures within it.
You can [[Dismiss]] the cloud.
You gain a +1 circumstance bonus to your [[Perception]] DC, though not to your Perception checks.
Anything in plain view is observed by you.
If a creature takes measures to avoid detection, such as by using [[Stealth]] to [[Hide]], it can become [[Hidden]] or [[Undetected]] instead of observed.
If you have another precise sense instead of or in addition to sight, you might be able to observe a creature or object using that sense instead.
You can observe a creature only with [[Precise]] senses. When [[Seek]]ing a creature using only imprecise senses, it remains [[Hidden]], rather than [[Observed]].
The practitioners of occult traditions seek to understand the unexplainable, categorize the bizarre, and otherwise access the ephemeral in a systematic way.
[[Bard]]s are the most iconic occult spellcasters, collecting strange esoterica and using their performances to influence the mind or elevate the soul, and occult [[Sorcerer]]s strive to understand the mysterious power in their blood.
<<schoolspelllist Occult>>
Your repertoire expands, and you can cast more occult spells each day.
Increase the number of spells in your repertoire and the number of spell slots you gain from bard archetype feats by 1 for each spell level other than your two highest __Bard spell slots__.
''Prerequisites'' bloodline that grants occult spells
Glimpses of the obscure secrets of the universe loan you power.
You become trained in one skill of your choice.
Additionally, once per day, you can spend 1 minute to choose one mental occult spell you don’t know and add it to your spell repertoire.
You lose this temporary spell the next time you make your daily preparations (though you can use this ability to add it again later).
''Prerequisites'' expert in [[Occultism]].
Your study of occult practices has shown you how to best defend against them.
You gain a +1 circumstance bonus to all saving throws against <<tag Occult>> effects.
You draw upon magic from esoteric knowledge. You can cast <<tag Occult>> spells using the [[Cast a Spell]] activity, and you can supply material, somatic, and verbal components when casting spells.
{{BardConSub}}
''Key Ability'' [[Intelligence]].
You know a great deal about ancient philosophies, esoteric lore, obscure mysticism, and supernatural creatures.
{{||SkillActionList}}
{{||SkillFeatList}}
{{||SkillRitualList}}
''Prerequisites'' Trained in [[Occultism]].
You have a sense for spells that twist minds or reveal secrets.
You gain a +2 circumstance bonus to [[Occultism]] checks to [[Identify Magic]] with the [[Mental]], [[Possession]], [[Prediction]], or [[Scrying]] traits.
{{||SpellSummaryTable}}
''Trigger'' A creature's [[Dying]] condition would reach the value at which they would die.
Your ode temporarily staves off death.
The target’s dying condition remains 1 below the value at which it dies.
This doesn’t help prevent death from effects that kill the target without increasing its dying condition, such as [[Disintegrate]] and <<tag Death>> effects.
You can enhance your senses and mental state to consider every aspect of an attack.
You can cast [[True Strike]] as a divine innate spell once per day.
Nanites augment your attacks.
You can choose to activate [[Nanite Surge]] when you attempt an attack roll, instead of when you attempt a skill check. If you do, you gain a +1 status bonus to the triggering attack roll.
Oils are magical gels, ointments, pastes, or salves that are typically applied to an object and are used up in the process.
They have the oil trait.
Applying an oil usually takes two hands: one to hold the jar containing the oil, and another to extract the oil and apply it.
You can only apply an oil to an item or creature within your reach.
Because the process is so thorough, it is usually impossible to apply an oil to an unwilling target or an item in the possession of an unwilling target unless that target is [[Paralyzed]], [[Petrified]], or [[Unconscious]].
You can rub this bronze-colored oil onto a melee weapon to grant it the benefits of the [[Dancing]] rune.
Once you fail a flat check for the weapon, causing it to fall, this effect ends.
When this silvery salve is applied to a melee weapon that deals piercing or slashing damage, the weapon grows sharper and more dangerous for 1 minute, granting it the benefits of the [[Keen]] rune.
A vial of oil of mending appears to have countless translucent threads swirling within.
//It takes an [[Interact]] action lasting 1 minute to apply this oil.//
Applying this oil to an item casts a 2nd-level [[Mending]] spell to repair the item.
When you apply this thick, viscous oil to a non-magical weapon or suit of armor, that item immediately becomes magically potent.
If the item is a weapon, it temporarily becomes a [[+1|Weapon Potency]] [[Striking]] weapon, or, if it’s armor, it temporarily becomes [[+1|Armor Potency]] [[Resilient]] armor.
This lasts for 1 minute.
This oil contains magnetically charged iron filings repelled into opposite ends of the vial.
For 1 minute after you apply this oil to armor, any creature that hits you with a melee [[Strike]] must attempt a DC 28 [[Fortitude]] save with the following effects.
{{||SaveSuccessTable}}
You can spread this shimmering oil on an item of 1 Bulk or less to make it feel weightless.
It has negligible Bulk for 1 hour.
| !Type | !Level | !Price | !Maximum Bulk | !Duration |
| Standard | 2 | 60 | 1 | 1 hour |
| Greater | 6 | 360 | 2 | 8 hours |
''Prerequisites'' at least 100 years old
Your immortal lineage has granted you a lifespan much longer than most mortals, and you’ve learned a lot along the way.
You become trained in two skills of your choice.
''Frequency'' once per day
You have a connection to olethroses, the enigmatic psychopomps who successfully swayed the yamaraj to permit the creation of the first duskwalkers.
You place a finger on fate’s scales by wrapping silk around your bow.
The first time this turn that you hit a creature with a [[Strike]] using a weapon in the bow group you’ve modified in this way, that creature takes an additional 60 damage (basic [[Fortitude]] save using your class DC or spell DC, whichever is higher) as the arrow works to cut short their very destiny. This additional damage is of the same type as the initial attack dealt.
If you hit more than one creature at the same time, choose one to suffer the effect of your decree.
This frothing fluid causes the drinker’s body to exude trace odor absorbing oils.
For the listed duration after drinking this elixir, your scent is nearly unnoticeable. Creatures with imprecise [[Scent]] don’t detect you with that sense unless they [[Seek]] for you, and you are [[Concealed]] from creatures that perceive you with precise scent.
You gain a +4 item bonus against attempts to [[Seek]] you by creatures using only scent-based senses; if they use any other senses as well, the bonus doesn’t apply.
| !Type | !Level | !Price | !Duration |
| (standard) | 3 | 90 | 10 minutes |
| Greater | 10 | 2250 | 8 hours |
You’ve learned to harness your connection to the earth to travel through it.
You gain a [[Burrow]] Speed of 15 feet.
You put all your force into a single mighty, carefully controlled blow.
Make an unarmed [[Strike]].
If you spend two actions and this Strike hits, you deal an extra die of weapon damage.
You can instead spend 3 actions to perform an even more powerful attack, dealing a second additional die of weapon damage on a hit.
If you’re at least 10th level, the number of additional dice you add from this feat doubles, for a total of 2 additional dice if you spend 2 actions, or 4 additional dice if you spend 3 actions.
If you’re at least 18th level, the number of additional dice you add from this feat triples, for a total of 3 additional dice if you spend 2 actions, or 6 additional dice if you spend 3 actions.
Your punches have incredible force and control.
When you damage a target using One-Inch Punch, you can focus your ki to send the foe flying. If you do, the target must attempt a [[Fortitude]] save against your class DC.
{{||SaveSuccessTable}}
Assuming a peculiar stance, you make a short hop on each toe.
You make a vertical [[Leap]] without triggering reactions that can be triggered by move actions or upon leaving or entering a square.
<svg xmlns="http://www.w3.org/2000/svg" width="1em" height="1em" viewBox="0 0 100 100">
<polygon points="50,0 100,50 50,100 0,50" fill="black" stroke="white" stroke-width="7" />
<polyline points="0,50 25,25 50,50 25,75" stroke="white" fill="black" stroke-width="7" />
</svg>
You’re always investigating what’s around you, even as you perform other activities.
You can move at full Speed while using the [[Investigate]] exploration activity, and you can use another exploration activity while Investigating.
Your powerful personality and incredible ego demand that you protect yourself above all else.
After you use [[Selfish Shield]], you gain resistance to all further damage from the triggering enemy until the end of the turn on which you used the reaction.
This resistance is equal to half your Selfish Shield resistance.
You’re constantly studying small aspects of everyone’s movements, even if you don’t have a stratagem in place ahead of time.
On any Strike for which you didn’t Devise a Stratagem, you still deal precision damage equal to your number of strategic strike damage dice so long as the weapon or unarmed attack you used is one that would have let you use your Intelligence modifier had you Devised a Stratagem.
Affix to armor.
''Requirements'' You are are trained in [[Stealth]].
''Trigger'' You use a [[Sneak]] action.
This small stone is a stylized panther shape.
When you activate {{FreeAction}} it, you can move your full Speed (instead of half) during the triggering [[Sneak]] and any other time you Sneak this turn.
These maneuvers work only as the first salvo in the attacks you make on your turn.
You can use an action with the open trait only if you haven’t used an action with the <<tag Attack>> or open trait yet this turn.
The following text is the property of Wizards of the Coast, Inc. and is Copyright 2000 Wizards of the Coast, Inc ("Wizards"). All Rights Reserved.
1. Definitions:
a) "Contributors" means the copyright and/or trademark owners who have contributed Open Game Content;
b) "Derivative Material" means copyrighted material including derivative works and translations (including into other computer languages), potation, modification, correction, addition, extension, upgrade, improvement, compilation, abridgment or other form in which an existing work may be recast, transformed or adapted; (
c) "Distribute" means to reproduce, license, rent, lease, sell, broadcast, publicly display, transmit or otherwise distribute;
d) "Open Game Content" means the game mechanic and includes the methods, procedures, processes and routines to the extent such content does not embody the Product Identity and is an enhancement over the prior art and any additional content clearly identified as Open Game Content by the Contributor, and means any work covered by this License, including translations and derivative works under copyright law, but specifically excludes Product Identity.
e) "Product Identity" means product and product line names, logos and identifying marks including trade dress; artifacts; creatures characters; stories, storylines, plots, thematic elements, dialogue, incidents, language, artwork, symbols, designs, depictions, likenesses, formats, poses, concepts, themes and graphic, photographic and other visual or audio representations; names and descriptions of characters, spells, enchantments, personalities, teams, personas, likenesses and special abilities; places, locations, environments, creatures, equipment, magical or supernatural abilities or effects, logos, symbols, or graphic designs; and any other trademark or registered trademark clearly identified as Product identity by the owner of the Product Identity, and which specifically excludes the Open Game Content;
f) "Trademark" means the logos, names, mark, sign, motto, designs that are used by a Contributor to identify itself or its products or the associated products contributed to the Open Game License by the Contributor
g) "Use", "Used" or "Using" means to use, Distribute, copy, edit, format, modify, translate and otherwise create Derivative Material of Open Game Content.
h) "You" or "Your" means the licensee in terms of this agreement.
2. The License: This License applies to any Open Game Content that contains a notice indicating that the Open Game Content may only be Used under and in terms of this License. You must affix such a notice to any Open Game Content that you Use. No terms may be added to or subtracted from this License except as described by the License itself. No other terms or conditions may be applied to any Open Game Content distributed using this License.
3. Offer and Acceptance: By Using the Open Game Content You indicate Your acceptance of the terms of this License.
4. Grant and Consideration: In consideration for agreeing to use this License, the Contributors grant You a perpetual, worldwide, royalty-free, non-exclusive license with the exact terms of this License to Use, the Open Game Content.
5. Representation of Authority to Contribute: If You are contributing original material as Open Game Content, You represent that Your Contributions are Your original creation and/or You have sufficient rights to grant the rights conveyed by this License.
6. Notice of License Copyright: You must update the COPYRIGHT NOTICE portion of this License to include the exact text of the COPYRIGHT NOTICE of any Open Game Content You are copying, modifying or distributing, and You must add the title, the copyright date, and the copyright holder's name to the COPYRIGHT NOTICE of any original Open Game Content you Distribute.
7. Use of Product Identity: You agree not to Use any Product Identity, including as an indication as to compatibility, except as expressly licensed in another, independent Agreement with the owner of each element of that Product Identity. You agree not to indicate compatibility or co-adaptability with any Trademark or Registered Trademark in conjunction with a work containing Open Game Content except as expressly licensed in another, independent Agreement with the owner of such Trademark or Registered Trademark. The use of any Product Identity in Open Game Content does not constitute a challenge to the ownership of that Product Identity. The owner of any Product Identity used in Open Game Content shall retain all rights, title and interest in and to that Product Identity.
8. Identification: If you distribute Open Game Content You must clearly indicate which portions of the work that you are distributing are Open Game Content.
9. Updating the License: Wizards or its designated Agents may publish updated versions of this License. You may use any authorized version of this License to copy, modify and distribute any Open Game Content originally distributed under any version of this License.
10. Copy of this License: You MUST include a copy of this License with every copy of the Open Game Content You Distribute.
11. Use of Contributor Credits: You may not market or advertise the Open Game Content using the name of any Contributor unless You have written permission from the Contributor to do so.
12. Inability to Comply: If it is impossible for You to comply with any of the terms of this License with respect to some or all of the Open Game Content due to statute, judicial order, or governmental regulation then You may not Use any Open Game Material so affected.
13. Termination: This License will terminate automatically if You fail to comply with all terms herein and fail to cure such breach within 30 days of becoming aware of the breach. All sublicenses shall survive the termination of this License.
14. Reformation: If any provision of this License is held to be unenforceable, such provision shall be reformed only to the extent necessary to make it enforceable.
''Trigger'' A creature within your melee reach is hit by a melee attack from one of your allies.
When your enemy is hit by your ally, you capitalize upon the distraction.
Make a [[Strike]] against the triggering creature.
''Trigger'' A foe within your reach critically fails a Strike against you.
You take advantage of an opening from your enemy’s fumbled attack.
You either make a melee [[Strike]] against the triggering foe or attempt to [[Disarm]] it of the weapon it used for the Strike.
''Trigger'' A creature within 10 feet of you uses a <<tag Manipulate>> action or a <<tag Move>> action, makes a ranged attack, or leaves a square during a move action it’s using.
''Requirements'' You are [[Juggling|Juggle]] a thrown weapon.
You make a thrown ranged [[Strike]] with the required weapon against the triggering creature.
If you critically succeed and the trigger was a manipulate action, you disrupt that action.
This Strike doesn’t count against your multiple attack penalty, and your multiple attack penalty doesn’t apply to this Strike.
You gain the [[Attack of Opportunity]] reaction.
''Requirements'' Your prey is within your reach, you have at least one free hand, and your target is no more than one size larger than you.
''Trigger'' Your prey critically fails on a melee [[Strike]]’s attack roll against you.
You attempt an [[Athletics]] check to [[Grapple]] your prey.
!! Splats
<$list filter="[tag<currentTiddler>tag[Splat]]" />
!! Class Features
| !Level | !Features |
| 1 | [[Mystery]] (and Oracular Curse), 5 cantrips, 2 1st-level slots |
| 2 | +1 1st-level slot |
| 3 | [[Signature Spells]], 2 2nd-level slots |
| 4 | +1 2nd-level slot |
| 5 | 2 3rd-level slots |
| 6 | +1 3rd-level slot |
| 7 | 2 4th-level slots, [[Resolve]], [[Expert Spellcaster]] |
| 8 | +1 4th-level slot |
| 9 | 2 5th-level slots, [[Magical Fortitude]] |
| 10 | +1 5th level slot |
| 11 | 2 6th-level slots, [[Alertness]], [[Major Curse]], [[Weapon Expertise]] |
| 12 | +1 6th-level slots |
| 13 | 2 7th-level slots, [[Light Armor Expertise]], [[Lightning Reflexes]], [[Weapon Specialization]] |
| 14 | +1 7th-level slot |
| 15 | 2 8th-level slots, [[Master Spellcaster]] |
| 16 | +1 8th-level slot |
| 17 | 2 9th-level slots, [[Extreme Curse]], [[Greater Resolve]] |
| 18 | +1 9th-level slot |
| 19 | [[Legendary Spellcaster]], [[Oracular Clarity]] |
| 20 | |
!! Class Feats
{{||ClassFeatList}}
You now fully grasp the nature of the divine power behind your mystery, allowing you to work magic akin to miracles.
Add two common 10th-level divine spells to your repertoire. You gain a single 10th-level spell slot you can use to cast one of those two spells using oracle spellcasting.
You don’t gain more 10th-level spells as you level up, unlike other spell slots, and you can’t use 10th-level slots with abilities that give you more spell slots or that let you cast spells without expending spell slots.
You can take the [[Oracular Providence]] feat to gain a second slot.
Your mystery grants you access to deep reserves of truly miraculous divine power.
You gain an additional 10th-level spell slot.
''Trigger'' You are about to roll initiative.
You have a flash of insight about impending danger related to one ally, and you can shout or gesture to warn that ally of the threat a moment before it materializes.
One ally of your choice can roll twice for initiative and use the better result; this is a <<tag Fortune>> effect. If you are legendary in Religion, you receive two visions and can warn two allies, granting them both this benefit.
You are momentarily thrown off by the divine insight, however, and you must roll twice for your initiative roll and use the worse result. This is a <<tag Misfortune>> effect.
The two effects are tied together; if you would avoid the misfortune effect for any reason, or if any of your allies would negate their fortune effect, your Oracular Warning does nothing.
Depending on whether you use gestures or call out, this action gains either the <<tag Visual>> or <<tag Auditory>> trait, respectively.
''Frequency'' once per day.
''Trigger'' You would be reduced to 0 Hit Points but not immediately killed.
Fierceness in battle runs through your blood, and you refuse to fall from your injuries.
You avoid being knocked out and remain at 1 Hit Point, and your [[Wounded]] condition increases by 1.
The hold elders taught you your people’s histories, told tales of great athletic feats, and shared with you the hardships your ancestors endured so that you can pass this wisdom down to future generations.
You become trained in [[Athletics]] and [[Survival]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Orc [[Lore]].
''Prerequisites'' [[Low-Light Vision]].
Your orc blood is strong enough to grant you the keen vision of your orc forebears.
You gain [[Darkvision]], allowing you to see in darkness and dim light just as well as you can in bright light. However, in darkness, you see in black and white only.
''Special'' You can take this feat only at 1st level, and you can’t retrain out of this feat or into this feat.
''Trigger'' You attempt a saving throw against a spell or magical effect, before rolling.
You defend yourself against magic by relying on techniques derived from orc cultural superstitions.
You gain a +1 circumstance bonus to your saving throw against the triggering spell or magical effect.
You paint your face to create a warmask, an invested magic item of negligible Bulk with an item level equal to your level and a usage of worn (mask). It has the <<tag Divination>>
trait and a magical tradition trait depending on its type.
Donning or removing your warmask requires 1 minute of work, though you don’t need to Invest the mask each time.
The warmask is unique to you and might signify your hold, your accomplishments, or your faith.
While creating your mask, you must choose the source of your warmask’s power from the options below. This source determines the mask’s associated skill as well as magical tradition. Once you select this source, it can’t be changed.
You become trained in the associated skill, and you gain the [[Dubious Knowledge]] skill feat as a bonus feat.
You can spend 1 hour performing a ceremony that costs 50 gp to attune yourself more deeply with your warmask. If you do, you gain a +1 item bonus to the associated skill whenever you wear the warmask.
* ''The Gods'': [[Religion]], divine tradition
* ''The Land'': [[Nature]], primal tradition
* ''Magic'': [[Arcana]], arcane tradition
* ''The Unknown'': [[Occultism]], occult tradition
You are brutally efficient with the weapons of your orc ancestors.
Whenever you critically hit using a [[Falchion]], a [[Greataxe]], or an orc weapon, you apply the weapon’s [[Critical Specialization Effect]].
Your orc affinity blends with your class training, granting you great skill with orc weapons.
Whenever you gain a class feature that grants you expert or greater proficiency in a given weapon or weapons, you also gain that proficiency in the [[Falchion]], the [[Greataxe]], and all orc weapons in which you are trained.
In combat, you favor the brutal weapons that are traditional for your orc ancestors.
You are trained with the [[Falchion]] and [[Greataxe]].
In addition, you gain access to all uncommon orc weapons.
For __the purpose of determining your proficiency__, martial orc weapons are simple weapons, and advanced orc weapons are martial weapons.
You have learned the secrets of another druidic order, passing whatever rites of initiation that order requires and gaining access to its secrets.
Choose an order other than your own. You gain a 1st-level feat that lists that order as a prerequisite, and you are now a member of that order for the purpose of meeting feat prerequisites.
If you commit acts anathema to your new order, you lose all feats and abilities requiring that order but retain your other druid feats and abilities.
You don’t gain any of the other benefits of the order you chose.
''Special'' You can take this feat multiple times. Each time you do, you must choose a different order other than your own.
You have delved deeper into the teaching of a new order, gaining access to a coveted order spell.
Choose an order you have selected with [[Order Explorer]]. You gain the initial order spell from that order.
''Special'' You can take this feat multiple times. Each time you do, you must choose a different order you have selected with Order Explorer.
You gain the initial order spell from your order.
If you don’t already have one, you gain a focus pool of 1 Focus Point, which you can [[Refocus]] by being one with nature.
{{LOCGFeat}}
You gain the lesser order benefit for the Hellknight order to which you belong.
//This is one of the following. See the Character Guide for which is associated with which order.//
* [[Shackles of Law]]
* [[Locate Lawbreakers]]
* [[Dedication to the Five]]
* [[Trailblazing Stride]]
* [[Righteous Resistance]]
* [[Disillusionment]]
* [[Fear No Law, Fear No One]]
An earth elemental ancestor has influenced your bloodline, and your features highlight this elemental planar connection. You might have a crystalline or metallic sheen to your skin or hair, rough and stony flesh, or glittering gemstone eyes.
You gain the <<tag Oread>> trait, in addition to the traits from your ancestry.
You also gain [[Low-Light Vision]], or you gain [[Darkvision]] if your ancestry already has low-light vision.
You can choose from <<tag Oread>> feats and feats from your ancestry whenever you gain an ancestry feat.
{{||VHerFeatList}}
The most rare and valuable skymetal, orichalcum is coveted for its incredible time-related magical properties.
This dull, coppery metal isn’t as physically sturdy as adamantine, but orichalcum’s time-bending properties protect it, granting it greater Hardness and Hit Points.
If an orichalcum item takes damage but isn’t destroyed, it repairs itself completely 24 hours later.
| !Unit | !Price | !Bulk |
| Chunk | 10000 | L |
| Ingot | 100000 | 1 |
| !Grade | !Level | !Price |
| High | 17 | 100000/Bulk |
| !Item | !Grade | !Hardness | !HP | !BT |
| Thin | High | 16 | 64 | 32 |
| Item | High | 18 | 72 | 36 |
| Structure | High | 35 | 140 | 70 |
Orichalcum armor can be etched with four magic property runes instead of three due to the magical empowerment of orichalcum.
If you are wearing armor made of orichalcum, the armor grants you insights into the future, granting you a +1 circumstance bonus to [[Initiative]] rolls.
If an orichalcum item takes damage but isn’t destroyed, it repairs itself completely 24 hours later.
| !Type | !Level | !Price | !Value of Orichalcum needed | !Hardness | !HP | !BT | !Magic Level Limit |
| High-Grade | 20 | 550000 + 55000/Bulk | 275000 + 27500/Bulk | 18 | 72 | 36 | Any |
Orichalcum weapons can have four magic property runes instead of three.
Due to orichalcum’s temporal properties, etching the [[Speed|Speed (Rune)]] weapon property rune onto an orichalcum weapon costs half the normal Price (though transferring the rune to a weapon made of another material requires you to first pay the remaining Price and then pay the cost to transfer).
| !Type | !Level | !Price | !Value of Orichalcum needed |
| High-Grade | 18 | 225000 + 22500/Bulk | 112500 + 11250/Bulk |
{{LOCGFeat}}
You expand your tattoos to encompass greater magic.
Choose a 1st‑level arcane spell from the same school as your Arcane Tattoos, either a common spell or another to which you have access.
You can cast that spell once per day as an innate arcane spell.
You understand the principles that underlie all written words, allowing you to read nearly any text.
You can attempt to [[Decipher Writing]] using Loremaster Lore in place of the required skill.
''Prerequisites'' at least one innate spell gained from an elf ancestry feat.
The arcane magic you possess grows in power and complexity.
Choose one common 2nd-level spell from the same tradition as an innate spell you previously gained from another elf ancestry feat (from the arcane list if you have [[Otherworldly Magic]], for example).
You can cast that spell as an innate spell once per day, using the same tradition as the list you chose the spell from.
Your magic is adaptable. By spending 1 day of downtime, you can change the spell you chose to a different common 2nd-level spell from the same tradition.
Your elven magic manifests as a simple arcane spell, even if you aren’t formally trained in magic.
Choose one cantrip from the arcane spell list. You can cast this cantrip as an arcane innate spell at will. A cantrip is heightened to a spell level equal to half your level rounded up.
''Available Spells:''
<<bulletlist "[tag[Arcane]tag[Cantrip]]">>
{{||SpellSummaryTable}}
You afflict the target with a curse that makes its presence abrasive and off-putting.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
You are talented at outwitting and evading your prey.
You gain a +2 circumstance bonus to [[Deception]] checks, [[Intimidation]] checks, [[Stealth]] checks, and any checks to [[Recall Knowledge]] about the prey, and a +1 circumstance bonus to AC against your prey’s attacks.
When you gain [[Masterful Hunter]], your mastery of skills allows you to overwhelm your prey. If you have master proficiency in [[Deception]], [[Intimidation]], [[Stealth]], or the skill you use to [[Recall Knowledge]] about your prey, increase the circumstance bonus against the prey with that skill from +2 to +4. If you have master proficiency with your armor, increase the circumstance bonus to AC against the prey from +1 to +2.
Your physiology is slight, and you can pack into small spaces with others of similar stature.
As long as you are Small, you can end your movement in the same square as a Small ally.
Only two creatures total can share the same space when using this ability or a similar one.
When you trick a foe, instead of catching them off guard, you goad them into overextending their next attack.
On a successful [[Feint]], you can use the following success and critical success effects instead of any other effects that would occur when you Feint.
You can choose a different effect each time you Feint against a given foe.
''Critical Success'' The target takes a –2 circumstance penalty to all attack rolls against you before the end of its next turn.
''Success'' The target takes a –2 circumstance penalty to its next
attack roll against you before the end of its next turn.
{{||SpellSummaryTable}}
Sadness flows out of you into nearby creatures, blotting out any other thoughts they had.
The first time a creature begins its turn in the area or enters the area, it must attempt a [[Will]] save. If it later leaves and reenters the area, it uses the same effect as before.
''Heightened (+2)'' When you Cast the Spell, you can choose to increase the area by 5 feet.
{{||SaveSuccessTable}}
Many consider half-orcs little more than dumb brutes. This is offensive to you, but it can occasionally be useful.
You are trained in [[Deception]] (or another skill of your choice if you were already trained in Deception), and you gain a +2 circumstance bonus to Deception checks to [[Lie]] when specifically claiming ignorance and to Deception DCs against Sense Motive checks to uncover such lies.
You trample your foes as you charge past them.
When you use Barreling Charge and successfully move through a creature’s space, that creature takes bludgeoning damage equal to your [[Strength]] modifier.
If you critically succeed, the creature takes twice this amount of damage and becomes [[Flat-Footed]] until the end of your next turn.
With a great heave, you seize a piece of your surroundings, such as a boulder, log, table, wagon, or chunk of earth, and hurl it at your foes.
The object must be your size or one size smaller than you, and it must not have too much [[Bulk]] for you to lift it in the first place.
Make a ranged [[Strike]] with the object; regardless of the result, the object takes the same amount of damage it would deal on a success.
The object is a simple ranged weapon that deals 1d10 bludgeoning damage, has a [[Range Increment]] of 20 feet, and has the [[Thrown]] weapon trait.
The damage increases to 2d10 if you have [[Weapon Specialization]] in simple weapons, or 3d10 if you have [[Greater Weapon Specialization]].
{{||SpellSummaryTable}}
Huge amounts of food and drink fill the target.
It receives a full meal’s worth of nourishment and must attempt a [[Fortitude]] save.
A target sickened by this spell takes a –10-foot status penalty to its [[Speed]] until it’s no longer sickened.
{{||SaveSuccessTable}}
You throw your weight into a powerful attack that leaves you vulnerable.
Make a melee [[Strike]].
This counts as three attacks when calculating your multiple attack penalty.
If this Strike hits, you get a critical hit.
If you roll a critical hit, your attack also gains the [[Deadly]] d12 trait.
Whether or not you hit, you become [[Stunned]] 1 and are [[Flat-Footed]] until the start of your next turn.
''Prerequisites'' ki spells.
You control your breathing and align it with your ki, exhaling with controlled force in order to overcome your opponent’s resistance.
If you use your next action to [[Cast a Spell]] that has the <<tag Monk>> trait and no duration, the spell and any Strikes you make as a result of casting it ignore an amount of the target’s resistance to physical damage equal to your level.
If the next action you use is to [[Cast a Spell]], the spell ignores an amount of the target’s resistance to acid, cold, electricity, fire, or sonic damage equal to your level.
This applies to all damage the spell deals, including persistent damage and damage caused by an ongoing effect of the spell, such as the wall created by [[Wall of Fire]].
A creature’s immunities are unaffected.
{{||SpellSummaryTable}}
You surround yourself with supernatural splendor, appearing to be a god or similarly majestic being. You choose the aspects of your new majestic appearance.
This causes the targets to pay tribute to you by bowing or using some other action in keeping with your appearance.
Paying tribute is a <<tag Manipulate>>action or <<tag Move>>action, as chosen by the creature paying tribute.
A creature under this effect must pay tribute to you at least once on each of its turns if possible.
The number of times a target must do this depends on the result of their Will save.
While affected by this spell, a creature is [[Fascinated]] by you and can’t use [[Hostile Action]]s against you.
The target is then temporarily immune for 1 minute.
{{||SaveSuccessTable}}
Affix to a weapon.
''Trigger'' You critically succed at an attack roll with the affixed weapon.
This small stone is a stylized panther shape.
This claw set in an iron clasp and chain isn’t always the claw of an owlbear.
When you activate {{FreeAction}} the claw, the triggering attack gains the weapon’s [[Critical Specialization Effect]].
Years of packing for travel have taught you how to cram vast quantities into small spaces.
You can fit an additional 50% of the listed Bulk capacity into mundane storage containers or vehicles. For example, you can fit 6 Bulk in a backpack, or 12 Bulk in a chest.
This doesn’t alter the items’ Bulk, nor does it change how much you can store in a magical or extradimensional storage space, such as a bag of holding.
You have mastered how to hunt with your pack.
If an enemy is within reach of you and at least two of your allies, that enemy is [[Flat-Footed]] against you.
You ignore [[Difficult Terrain]] and greater difficult terrain from bogs. When you roll a success to Swim, you get a critical success instead.
You’re honorable, forthright, and committed to pushing back the forces of cruelty.
Your code is:
* You must never perform acts anathema to your deity or willingly commit an evil act, such as murder, torture, or the casting of an evil spell.
* You must never knowingly harm an innocent, or allow immediate harm to one through inaction when you know you could reasonably prevent it. (This tenet doesn’t force you to take action against possible harm to innocents at an indefinite time in the future, or to sacrifice your life to protect them.)
* You must act with honor, never taking advantage of others, lying, or cheating.
* You must respect the lawful authority of legitimate leadership wherever you go, and follow its laws.
You gain the [[Lay on Hands]] devotion spell. Your champion's reaction is [[Retributive Strike]].
Prerequisites [[Steed Ally|Divine Ally]], tenets of evil.
Your mount becomes a grotesque creature of foreboding when you ride it. Its appearance transforms as flames erupt from its skin, a whorl of negative energy surrounds it, or poison leaks from its flesh.
When you [[Mount]] your steed ally, you can choose <<tag Fire>>, <<tag Negative>>, or <<tag Poison>>.
As long as you ride it, your steed gains resistance 10 to the chosen damage type, and any creature that touches your steed takes 1d6 damage of the chosen type; this includes hitting the steed with unarmed attacks or with a melee weapon Strike while adjacent to the steed.
This damage increases to 2d6 at 16th level and 3d6 at 20th level.
Palming a small, unattended object without being noticed requires you to roll a single [[Thievery]] check against the [[Perception]] DCs of all creatures who are currently observing
you.
You take the object whether or not you successfully conceal that you did so.
You can typically only Palm Objects of negligible Bulk, though the GM might determine otherwise depending on the situation.
{{||ActionSuccessTable}}
This potion appears to shift colors, and no two observers describe it in the same way.
When consumed, it attempts to counteract all <<Tag Curse>>s and <<tag Disease>>s affecting you, as well as the [[Blinded]] and [[Deafened]] conditions from spells affecting you.
The potion has a counteract level of 7 and a +20 modifier for the roll.
You care as much about the way you accomplish something as whether you actually accomplish it in the first place.
When you perform an action with particular bravado, you can leverage this moment of verve to perform spectacular, deadly maneuvers. This state of flair is called panache, and you are either in a state of panache or you are not.
You gain panache by successfully performing the skill check associated with specific actions that have a bit of flair, including [[Tumble Through]] and additional actions determined by your swashbuckler’s style.
At the GM’s discretion, after succeeding at a check to perform a particularly daring action, such as swinging on a chandelier or sliding down a drapery, you also gain panache if your result is high enough (typically the very hard DC for your level, but the GM can choose a different threshold).
While you have panache, you gain a +5-foot status bonus to your Speeds and gain a +1 circumstance bonus to checks to [[Tumble Through]] or to take any actions that give you
panache due to your style.
The [[Precise Strike]] class feature also causes you to deal extra precision damage while you have panache.
Powerful finisher actions, including [[Confident Finisher]], can be used only while you have panache and cause you to lose your panache.
Normally, you gain and use panache only in combat encounters; when an encounter ends, you lose panache.
The truest depths of your divine mystery are fathomless and contradictory, granting you changing powers that even you can barely begin to fathom.
Each day during your daily preparations, choose one basic or advanced domain spell from any domain from the Core Rulebook or another domain to which you have access, or any initial or advanced revelation spell from another mystery.
You gain that spell as a revelation spell until your next daily preparations, and it has the <<tag Cursebound>> trait.
''Requirements'' You are wielding a shield.
Once you’ve had a moment to set your stance, you always have your shield ready without a thought.
While you are in this stance, you constantly have your shield raised as if you’d used the [[Raise a Shield]] action, as long as you meet that action’s requirements.
{{||SpellSummaryTable}}
You block the target’s motor impulses before they can leave its mind, threatening to freeze the target in place.
The target must attempt a [[Will]] save.
''Heightened (7th)'' You can target up to 10 creatures.
{{||SaveSuccessTable}}
Your body is frozen in place.
You have the [[Flat-Footed]] condition and can’t act except to [[Recall Knowledge]] and use actions that require only the use of your mind (as determined by the GM).
Your senses still function, but only in the areas you can perceive without moving your body, so you can’t [[Seek]] while paralyzed.
{{||SpellSummaryTable}}
You cause the target to see all other creatures as dire threats.
The target is stricken by intense paranoia toward all creatures around it and must attempt a [[Will]] save.
''Heightened (6th)'' You can target up to 5 creatures.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
Dry winds dehydrate a creature.
The target must attempt a [[Fortitude]] save; if used on a creature with the <<tag Water>> trait or a creature made primarily of liquid (such as many oozes), the creature uses the outcome for one degree of success worse than the result.
Creatures whose bodies contain no significant moisture (such as earth elementals) are immune to parch.
If a creature affected by parch drinks a liquid, such as a swig of water or a potion, the spell ends.
Affected creatures that have the water trait or are made primarily of liquid, as well as affected creatures that can’t drink, can end the effect as a two-action activity, which has the <<tag Concentrate>> trait.
''Heightened (4th)'' You can target up to 4 creatures.
{{||SaveSuccessTable}}
This weapon can be used defensively to block attacks.
While wielding this weapon, if your proficiency with it is trained or better, you can spend an [[Interact]] action to position your weapon defensively, gaining a +1 circumstance bonus to AC until the start of your next turn.
You were hatched from an unfertilized egg during hard times for your people, and you are a biological copy of your mother.
You gain a +1 circumstance bonus to saving throws against <<tag Disease>>s. Each of your successful saving throws against a disease reduces its stage by 2, or by 1 for a virulent disease. Each critical success against an ongoing disease reduces its stage by 3, or by 2 for a virulent disease.
You take damage only every 2 hours from [[Thirst]] and every 2 days from [[Starvation]], rather than every hour and every day.
''Special'' You can take this feat only at 1st level.
''Requirements'' You are wielding a loaded ranged weapon or a ranged weapon with reload 0.
You jump back and fire a quick shot that catches your opponent off guard.
You [[Step]] and then make a ranged [[Strike]] with the required weapon.
Your target is [[Flat-Footed]] against the attack.
You attend all the fashionable society parties, no matter how exclusive they might be.
Any time you encounter a social event you would ordinarily be denied access to, such as a coronation, royal gala, or other society function, you can spend 1d4 hours to secure entry without the need for a skill check.
You find invitations, invitees looking for fashionable dates, temporary jobs with the caterers, event staff willing to look the other way, or some other mode of access for yourself and your allies.
This ability doesn’t apply to secret events or other small private gatherings with no staff, dates, or outsiders involved.
{{||SpellSummaryTable}}
You obscure the tracks you leave behind and make it harder for others to find you.
The DC of checks to [[Track]] you gains a +4 status bonus or is equal to your spell DC, whichever results in a higher DC.
You can benefit from only one pass without trace spell at a time.
''Heightened (2nd)'' The duration increases to 8 hours.
''Heightened (4th)'' The duration increases to 8 hours. The spell has a range of 20 feet and an area of a 20-foot-emanation, affecting up to 10 creatures of your choice within that area.
{{||SpellSummaryTable}}
You create a visible tunnel through the wall in the chosen area, replacing the area with empty space.
If the wall is thicker than 10 feet, the tunnel ends 10 feet in.
Even a small layer of metal in the wall prevents this spell from functioning.
This spell doesn’t reduce the integrity of the structure.
When the spell ends, anyone inside the tunnel is shunted to the nearest exit.
''Heightened (7th)'' The tunnel can be up to 20 feet deep. The areas of the wall that contain your tunnel’s entrance appear completely normal (unless viewed with [[True Seeing]] or a similar effect), despite the tunnel’s existence. The tunnel’s entrance functions as a solid wall, but you can specify a password or a [[Trigger]], allowing creatures to enter the tunnel freely.
''Frequency'' once per minute.
With a burst of effort, you weave a path through your enemies, striking each in turn as you move past them.
You [[Stride]]; this movement doesn’t trigger reactions.
You can [[Strike]] up to three times at any point during your movement, each against a different enemy.
Each attack counts toward your [[Multiple Attack Penalty]], but your multiple attack penalty doesn’t increase until you have made all your attacks.
You have progressed along your own path to enlightenment.
Choose your [[Fortitude]], [[Reflex]], or [[Will]] saving throw.
Your proficiency rank for the chosen saving throw increases to master.
When you roll a success on the chosen saving throw, you get a critical success instead.
{{LOWGFeat}}
Your Pathfinder training has broadened your horizons and made you more flexible at various skills, since you never know when you might need an obscure skill to complete your mission.
You become trained in one skill of your choice, or expert in a skill of your choice in which you were trained.
You also become trained in Pathfinder [[Lore]], or an expert if you were already trained.
When using a skill untrained, your proficiency bonus is equal to your level instead of 0.
You gain access to [[Wayfinder]]s.
<<archetypefeatlist "4 6 8 10 12" "[[Pathfinder Agent]]">>
Your patron grants you the power to command incredible works of magic.
You gain a single 10th-level spell slot and can prepare a spell in that slot using witch spellcasting.
Unlike with other spell slots, these spell slots can’t be used for abilities that let you cast spells without expending spell slots or abilities that give you more spell slots. You don’t gain more 10th-level spells as you level up, though you can take the [[Patron’s Truth]] feat to gain a second slot.
You have mastered the greatest secrets of your patron’s magic and learned a fundamental truth about your patron, even if their identity still remains a mystery.
You gain an additional 10th-level spell slot.
//Implied by [[Overwhelming Presence]].//
Paying tribute is a <<tag Manipulate>>action or <<tag Move>>action, as chosen by the creature paying tribute.
''Requirements'' You are wielding a sword that has the <<tag Monk>> trait in one hand.
You enter a tall and proud stance while remaining mobile, with all the grace and composure of a peafowl.
While in this stance, the only [[Strike]]s you can make are melee Strikes with the required sword.
Once per round, after you hit with a monk sword Strike, you can [[Step]] as a free action as your next action.
''Requirements'' You are in [[Peafowl Stance]].
You slowly move across the battlefield with dangerous grace.
[[Step]] twice and then [[Strike]]. The Strike must be made with the sword required by Peafowl Stance.
You’ve learned special tricks to survive underwater.
You gain the trained proficiency rank in [[Survival]].
When in an aquatic environment, if you roll a critical failure on a Survival skill check to [[Sense Direction]] or [[Subsist]], you get a failure instead.
Ammunition: Arrow or Bolt.
This ammunition has a slender shape and a viciously pointed tip.
When you activate ({{OneAction}} [[Interact]]) and shoot penetrating ammunition, the [[Strike]] takes the shape of a 60-foot line originating from you.
Roll one attack roll and compare the result to the AC of each target in the line.
The ammunition ignores up to 10 of a target’s resistance, and it can penetrate walls up to 1 foot thick with Hardness 10 or less.
Each target that takes damage from this ammunition also takes 1d6 persistent bleed damage.
If your attack roll result is a natural 20, you improve your degree of success only against the first target in the line, but you can still score a critical hit on other targets if your result exceeds their AC by 10 or more.
If you have access to your bow’s critical specialization effect, penetrating ammunition applies that effect only against a target in the last square of the line.
''Requirements'' You are wielding a ranged or thrown weapon that deals piercing damage.
Your projectiles are unhindered by flesh and bone.
Make a ranged [[Strike]] against each creature in a 30-foot line.
These attacks ignore lesser cover, [[Cover]], and greater cover granted by creatures.
Roll damage only once and apply it to each creature you hit.
Each attack counts toward your [[Multiple Attack Penalty]], but don’t increase your penalty until you have made all your attacks.
''Requirements'' You are wielding a ranged weapon.
You shoot clear through an intervening creature to hit your prey.
Choose a target that is giving lesser [[Cover]] to your hunted prey.
Make a single ranged [[Strike]] with the required weapon against the chosen target and your hunted prey.
This attack ignores any lesser cover the chosen target provides your hunted prey.
Roll damage only once, and apply it to each creature you hit.
A Penetrating Shot counts as two attacks for your [[Multiple Attack Penalty]].
{{||SpellSummaryTable}}
You envelop the target in a shroud of shadow.
The target perceives light as one step lower than it actually is ([[Bright Light]] becomes [[Dim Light]], for example), affecting their ability to sense creatures and objects accordingly.
The shroud also provides the target a +1 status bonus to saving throws against <<tag Light>> effects.
While this effect is helpful to creatures sensitive to light, if the creature is unwilling, it can attempt a [[Reflex]] save to avoid the shroud and reduce the effect.
//Perception behaves like a skill, with a key ability of [[Wisdom]]. However, it isn't a part of any skill list and you can't spend skill upgrades on it.//
''Trigger'' You fail or critically fail an attack roll or [[Will]] save.
You burn out all of your rage to ensure that your attack lands and your mind remains free.
Reroll the triggering attack roll or Will save with a +2 circumstance bonus, use the better result, and resolve the effect.
You then immediately stop raging.
You have perfected the formulas for bombs that impede your enemies.
When you use [[Debilitating Bomb]], your target avoids the condition the bomb imposes only if it critically succeeds at its saving throw.
You use clever tactics to mislead your foes as you sneak away.
You [[Sneak]] while leaving a decoy behind.
The decoy acts as the spell [[Mislead]], though you aren’t [[Invisible]], just [[Undetected]].
You can continue to concentrate to move your decoy, as with the spell, whether or not you remain hidden throughout the duration.
Once you use Perfect Distraction, you need to spend 10 minutes to set up another decoy before you can use it again.
You dive into the water with exceptional skill and connection to the waves, urging the water itself to cushion your fall.
You intentionally [[Leap]] or otherwise fall into the water, taking no falling damage regardless of the distance.
You develop another incredible creation.
You gain an additional 10th-level spell slot.
''Prerequisites'' [[Strength]] 18.
Thanks to magic and muscle memory, you can stay in your alternate forms indefinitely; you may have even forgotten your original form.
When you use [[Form Control]], instead of lasting 1 hour, wild shape is permanent until you [[Dismiss]] it.
{{LOWGFeat}}
You gain the appropriate ki spell for your School of Perfection: [[Unblinking Flame Revelation]], [[Unbreaking Wave Advance]], [[Unfolding Wind Rush]], or [[Untwisting Iron Buffer]].
Increase the number of Focus Points in your focus pool by 1.
You have enhanced the formulas for your mutagens, aligning them perfectly to your physiology.
When under the effect of a <<tag Mutagen>> you crafted, you do not suffer its drawback.
''Requirements'' You are wielding a loaded ranged weapon with reload 1 or more, and you have not reloaded your weapon since your last turn.
After watching the motions of combat with incredible intensity and precision, you fire at your prey at the perfect moment to deliver maximum pain.
Make a ranged [[Strike]] with the required weapon against your hunted prey.
If you hit, the Strike deals maximum damage.
After the Strike, your turn ends.
{{||SpellSummaryTable}}
''Trigger'' You miss a [[Strike]] with an unarmed attack.
You call upon insight from your training to recover accuracy.
Reroll the missed attack roll and keep the new result.
{{||SpellSummaryTable}}
''Trigger'' You fail a saving throw against a <<tag Morph>>, <<tag Petrification>>, or <<tag Polymorph>> effect.
Reroll the saving throw and use the better result.
You have purged incompetence from your techniques.
On your first [[Strike]] of your turn, if you roll lower than 10, you can treat the attack roll as a 10.
This is a fortune effect.
{{||SpellSummaryTable}}
You meditate upon perfection to remove all distractions from your mind.
Attempt a new [[Will]] save against one mental effect currently affecting you that required a Will save.
Use the result of this new save to determine the outcome of the mental effect, unless the new save would have a worse result than the original save, in which case nothing happens.
You can use perfected mind against a given effect only once.
''Prerequisites'' Expert in at least one saving throw.
Choose one saving throw ([[Fortitude]], [[Reflex]], or [[Will]]) in which you are an expert.
Your proficiency rank in the chosen saving throw increases to master.
When making a brief performance—one song, a quick dance, or a few jokes—you use the Perform action //with the [[Performance]] skill.//
This action is most useful when you want to prove your capability or impress someone quickly.
Performing rarely has an impact on its own, but it might influence the DCs of subsequent [[Diplomacy]] checks against the observers—or even change their attitudes — if the GM sees fit.
//If you have [[Fascinating Performance]], you can use Perform to inflict the [[Fascinated]] condition on an observer by beating their [[Will]] DC.//
Performing gains additional traits based on the type of performance you do, as follows:
{{PerformanceTraits}}
{{||ActionSuccessTable}}
''Key Ability'' [[Charisma]].
You are skilled at a form of performance, using your talents to impress a crowd or make a living.
Some performances require you to be more than just charismatic, and if you don’t meet the demands of the art form or the audience, the GM might apply a penalty based on the relevant ability score. For example, if you’re dancing and have a negative [[Dexterity]] modifier, you might take a penalty to your attempt at dancing. Likewise, if you are orating and have a negative [[Intelligence]] modifier, you might have to hope your raw Charisma can overcome the penalties from your intellectual shortcomings—or ask someone to help write your speeches!
When you use an action that utilizes the Performance skill, it gains one or more traits relevant to the type of performance. The GM might change these depending on the circumstances, but the most common performance based traits are listed below.
{{PerformanceTraits}}
{{||SkillActionList}}
{{||SkillFeatList}}
|! Performance |! Additional Traits |
| Act or perform comedy | [[Auditory]], [[Linguistic]], and [[Visual]] |
| Dance | [[Move]] and [[Visual]] |
| Play an instrument | [[Auditory]] and [[Manipulate]] |
| Orate or sing | [[Auditory]] and [[Linguistic]] |
You’re skilled with flashy weapons.
You are trained with the [[Bo staff]], [[Dueling cape]], [[Spiked chain]], [[Sword cane]], and [[Whip]].
Whenever you gain a class feature that grants you expert or greater proficiency in a given weapon or weapons, you also gain that proficiency in the weapons listed.
The shimmering embers of the righteous peris crackle at your fingertips.
You can cast [[Glitterdust]] and [[Status]] each once per day as 2nd-level divine innate spells.
You have expanded your supply of near-infinite items.
Choose a research field. Add one item from the list of options available to that field from perpetual infusions, or two items if you choose your own field.
If you have [[Perpetual Potency]] or [[Perpetual Perfection]], you gain an additional item (or items if you chose your own field) appropriate to the field you chose, for instance a higher-level version of the bomb you chose or a new poison.
You have learned how to create perpetual alchemical infusions that can provide a near-infinite supply of certain simple items.
You gain the ability to create two 1st-level alchemical items using [[Quick Alchemy]] without spending a batch of infused reagents. The items you can select depend on your research field and must be in your formula book.
[[Bomber]]: Choose two of the following formulas: [[Lesser Acid Flask]], [[Lesser Alchemist’s Fire]], [[Lesser Bottled Lightning]], __[[Lesser Frost Vial]]__, [[Lesser Tanglefoot Bag]], [[Lesser Thunderstone]].
[[Chirurgeon]]: [[Lesser Antidote]] and [[Lesser Antiplague]].
[[Mutagenist]]: Choose two of the following formulas: [[Lesser Bestial Mutagen]], __[[Lesser Serene Mutagen]]__, [[Lesser Cognitive Mutagen]], [[Lesser Juggernaut Mutagen]], [[Lesser Silvertongue Mutagen]], [[Lesser Quicksilver Mutagen]].
[[Toxicologist]]: Choose two common 1st-level alchemical poisons.
You have perfected your perpetual infusions, allowing you to use [[Quick Alchemy]] to create even more powerful items at no cost.
The items you can select depend on your research field and must be in your formula book.
[[Bomber]]: The greater versions of the bombs you chose for [[Perpetual Infusions]].
[[Chirurgeon]]: Greater antidote and antiplague.
[[Mutagenist]]: The greater versions of the mutagens you chose for perpetual infusions.
[[Toxicologist]]: Choose two common 11th-level or lower alchemical poisons.
Your perpetual infusions improve, allowing you to use [[Quick Alchemy]] to create more powerful items with no cost.
The items you can select depend on your research field and must be in your formula book.
[[Bomber]]: The moderate versions of the bombs you chose for [[Perpetual Infusions]].
[[Chirurgeon]]: Moderate antidote and antiplague.
[[Mutagenist]]: The moderate versions of the mutagens you chose for perpetual infusions.
[[Toxicologist]]: Choose two common 5th-level or lower alchemical poisons.
You spot anything out of place in the areas you know best.
While in your favored terrain, you always gain the benefits of the [[Scout]] exploration activity, even if you are performing another exploration activity.
If you’re legendary in [[Survival]], you gain these benefits in any terrain.
You can cast [[Creation|Creation (Spell)]] as an innate spell at will, choosing whether it is arcane or primal each time.
The created object lasts until you spend 1 hour not within its immediate vicinity or until it is destroyed.
Such objects are called persistent creations.
If you cast creation again, any persistent creation you previously created with the spell immediately disintegrates.
Persistent damage comes from effects like <<tag Acid>>, being on <<tag Fire>>, or many other situations.
It appears as “X persistent [type] damage,” where “X” is the amount of damage dealt and “[type]” is the damage type.
Instead of taking persistent damage immediately, you take it at the end of each of your turns as long as you have the condition, rolling any damage dice anew each time.
After you take persistent damage, roll a DC 15 flat check to see if you recover from the persistent damage. If you succeed, the condition ends.
Persistent damage runs its course and automatically ends after a certain amount of time as fire burns out, blood clots, and the like. The GM determines when this occurs, but it usually takes 1 minute.
Immunities, resistances, and weaknesses all apply to persistent damage. If an effect deals initial damage in addition to persistent damage, apply immunities, resistances, and weaknesses separately to the initial damage and to the persistent damage.
Usually, if an effect negates the initial damage, it also negates the persistent damage, such as with a slashing weapon that also deals persistent bleed damage because it cut you. The GM might rule otherwise in some situations.
You can be simultaneously affected by multiple persistent damage conditions so long as they have different damage types.
If you would gain more than one persistent damage condition with the same damage type, the higher amount of damage overrides the lower amount.
The damage you take from persistent damage occurs all at once, so if something triggers when you take damage, it triggers only once; for example, if you’re [[Dying]] with several types of persistent damage, the persistent damage increases your dying condition only once.
Can be mitigated by [[Assist Recovery]].
''Prerequisites'' [[Extend Elixir]].
You’ve trained your physical form to remain stable within the a given altered state.
Once per day, when you consume an alchemical item with the <<tag Infused>>and <<tag Mutagen>> traits, you can retain its effects until the next time you make your [[daily preparations|Rest]] instead of its normal duration.
{{||SpellSummaryTable}}
You summon an isolated blizzard of obscuring, scouring ice to follow your target.
The target attempts a [[Fortitude]] save.
''Heightened (+1)'' The cold damage and persistent cold damage increase by 1 (2 on a critical failure).
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You conjure a 5-foot-wide rain cloud that follows the target wherever it goes. It stays roughly an arm’s length overhead, unless it must drift lower to fit under a ceiling. The cloud rains constantly on the target, keeping it wet and dampening the ground in the wake of any movement.
The rain extinguishes non-magical flames.
The target gains <<tag Fire>> resistance 2.
Creatures with weakness to <<tag Water>> take damage equal to their weakness at the end of each of their turns.
Creatures can attempt a [[Reflex]] save to avoid the cloud.
''Heightened (+1)'' The amount of fire resistance increases by 2.
You steep yourself in superstition and practice ancient orc mental exercises for shrugging off the effects of magic.
You gain a +1 circumstance bonus to saving throws against spells and magical effects at all times.
{{AoA5Feat}}
''Requirements'' You are transformed into a plant by a <<tag Polymorph>> spell.
Your plant form sprouts hundreds of spines, and your blood causes mild hallucinations in creatures exposed to it.
Each time a creature touches you, hits you with an unarmed attack, or hits you with a melee weapon attack while adjacent to you, that creature takes 1d6 piercing damage.
Increase the damage to 2d6 if the polymorph spell is 8th level or higher, or to 3d6 if it’s 10th level.
When an adjacent creature damages you with piercing or slashing damage, it must succeed at a [[Fortitude]] save against your class DC or become [[Stupefied]] 1 (or stupefied 2 on a critical failure) until the end of its next turn.
These benefits last until you’re no longer polymorphed into a plant.
{{||SpellSummaryTable}}
You transform into a the battle form of a Tiny animal, such as a cat, insect, lizard, or rat.
You can decide the specific type of animal (such as a rat or praying mantis), but this has no effect on the form’s Size or statistics.
While in this form, you gain the <<tag Animal>>trait.
You can [[Dismiss]] the spell.
{{BattleFormRestrictions}}
You gain the following statistics and abilities:
* AC = 15 + your level. Ignore your armor’s check penalty and Speed reduction.
* Speed 10 feet.
* [[Weakness]] 5 to physical damage.
* [[Low-Light Vision]] and imprecise [[Scent]] 30 feet.
* [[Acrobatics]] and [[Stealth]] modifiers of +10, unless your own modifier is higher; [[Athletics]] modifier –4.
''Heightened (4th)'' You can turn into a flying creature, such as a bird, which grants you a fly Speed of 20 feet.
{{||SpellSummaryTable}}
You open your cloak or create a gap with your hands, drawing the target into a pocket dimension just large enough for its basic comfort.
No other creature can enter this extradimensional space, and the target can bring along objects only if they were designed to be worn by a creature of its kind.
The space has enough air, food, and water to sustain the target for the duration.
You can [[Dismiss]] the spell.
The spell also ends if you die or enter an extradimensional space.
When the spell ends, the target reappears in the nearest unoccupied space (outside of any extradimensional space you may have entered).
You have been turned to stone.
You can’t act, nor can you sense anything.
You become an object with a Bulk double your normal Bulk (typically 12 for a petrified Medium creature or 6 for a petrified Small creature), AC 9, Hardness 8, and the same current Hit Points you had when alive. You don’t have a Broken Threshold.
When you’re turned back into flesh, you have the same number of Hit Points you had as a statue.
If the statue is destroyed, you immediately die.
While petrified, your mind and body are in stasis, so you don’t age or notice the passing of time
{{||SpellSummaryTable}}
A vision of apocalyptic destruction fills the mind of each creature in the area.
The vision deals 11d6 mental damage (basic [[Will]] save).
On a critical failure, the creature must also succeed at a [[Reflex]] save or believe it’s trapped (stuck in a fissure, adrift at sea, or some other fate in keeping with its vision).
If it fails the second save, it’s also [[Stunned]] for 1 minute. It can attempt a new [[Will]] save at the end of each of its turns, and on a success, it disbelieves the illusion and recovers from the stunned condition.
''Heightened (+1)'' The damage increases by 2d6.
{{||SpellSummaryTable}}
You create a phantasmal image of the most fearsome creature imaginable to the target.
Only the spell’s target can see the killer, though you can see the vague shape of the illusion as it races forth to attack.
The effect of the killer is based on the outcome of the target’s [[Will]] save.
''Heightened (+1)'' The damage increases by 2d6 on a failure and by 3d6 on a critical failure.
{{||SaveSuccessTable}}
//The Incapacitation trait on the Fortitude save means that a creature higher level than you is only scared to death on a critical failure.//
{{||SpellSummaryTable}}
A phantasmal image of the most precious thing imaginable to the target appears in a location of your choice within the spell’s range.
Only the spell’s target can see the treasure, though you can see the vague shape of the treasure—be it a pile of items, a deific avatar, or a cherished loved one or hero.
The target’s response to the treasure is based on the outcome of the target’s [[Will]] save.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
Illusory pain wracks the target, dealing 2d4 mental damage and 1d4 [[persistent|Persistent Damage]] mental damage. The target must attempt a Will save.
''Heightened (+1)'' The damage increases by 2d4 and the persistent damage by 1d4.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You conjure a Large, magical, equine creature that only you (or another Medium or Small creature you choose) can ride.
The horse is clearly phantasmal in nature, has 20 AC and 10 Hit Points, and automatically fails all saves.
If it’s reduced to 0 Hit Points, it disappears and the spell ends.
The steed has a Speed of 40 feet and can hold its rider’s body weight, plus 20 Bulk.
''Heightened (4th)'' The steed has a Speed of 60 feet, can walk on water, and ignores areas of natural [[Difficult Terrain]].
''Heightened (5th)'' The steed has a Speed of 60 feet, can walk on water, and ignores areas of natural difficult terrain. It can also [[Air Walk]] but must end its turn on solid ground or fall.
''Heightened (6th)'' The steed can walk or fly at a Speed of 80 feet, can walk on water, and ignores natural difficult terrain.
''Frequency'' once per day
You can concentrate an immense amount of magic to create a piece of ammunition that phases through everything but your target.
Make a bow [[Strike]] against a foe who is [[Observed]] or [[Hidden]] to you (but not [[Undetected]]).
The ammunition travels to your target in a straight line, passing through any non‑magical barriers or walls in its way, though magical barriers stop the arrow.
The shot ignores all [[Cover]], the [[Concealed]] condition, the [[Hidden]] condition, and circumstance bonuses to AC from shields. It has a +4 status bonus to hit creatures wearing any type of armor.
The [[Strike]]’s damage can’t be reduced with a [[Shield Block]] reaction using a non‑magical shield.
{{||SpellSummaryTable}}
''Trigger'' Your familiar would take damage.
You draw upon your patron’s power to momentarily shift your familiar from its solid, physical form into an ephemeral version of itself shaped of mist.
Your familiar gains resistance 5 to all damage and is immune to precision damage. These apply only against the triggering damage.
''Heightened (+1)'' Increase the resistance by 2.
An alchemist with the [[Craft Philosopher’s Stone]] feat can create a philosopher’s stone once per month by spending 1 batch of infused reagents during their daily preparations using the [[Advanced Alchemy]] class feature. This is the only way to create a philosopher’s stone.
At a glance, a philosopher’s stone appears to be an ordinary, sooty piece of natural rock.
Breaking the rock open with a [[Force Open]] action (DC 35) reveals a cavity at the stone’s heart. The cavity is lined with a rare type of quicksilver that can transmute base metals into precious metals or create an [[Elixir of Rejuvenation]].
To use the quicksilver, you must be legendary in [[Crafting]] and have the [[Alchemical Crafting]] feat.
You can then use the stone’s quicksilver for one of two effects:
* You can apply the stone’s quicksilver to an <<tag Infused>>true [[Elixir of Life]] using an [[Interact]] action. This turns the elixir into an infused [[Elixir of Rejuvenation]] instantaneously. This doesn’t require any crafting time or additional materials.
* You can spend up to a month of downtime applying the quicksilver either to iron to create silver or to lead to create gold. Treat this as a 20th-level task to [[Earn Income]] using [[Crafting]], except that you create 500 gp worth of your chosen metal per day on a success or 750 gp worth per day on a critical success.
You can pronounce and repeat words with near-perfect accuracy even if you don’t understand their meaning, and you can write them down in a phonetic script that allows you or another creature with Phonetic Training to read it later.
Even if the words are in a language with sound you can’t pronounce, you can faithfully transcribe them.
Memorizing long sequences of words remains just as difficult as it is normally.
{{||SpellSummaryTable}}
You temporarily improve the target’s physique.
The target gains a +2 status bonus to the next [[Acrobatics]] check, [[Athletics]] check, [[Fortitude]] save, or [[Reflex]] save it attempts.
''Requirements'' You have [[Thieves’ Tools]].
Opening a lock without a key is very similar to Disabling a Device, but the DC of the //[[Thievery]]// check is determined by the complexity and construction of the lock you are attempting to pick.
Locks of higher qualities might require multiple successes to unlock, since otherwise even an unskilled burglar could easily crack the lock by attempting the check until they rolled a natural 20.
If you lack the proper tools, the GM might let you used improvised picks, which are treated as [[Shoddy]] tools, depending on the specifics of the lock.
{{||ActionSuccessTable}}
''Prerequisites'' Constitution 14.
You lead by example and can help others push themselves beyond their normal limits.
When [[Hustling|Hustle]] in a group during exploration mode, your group can Hustle for up to 20 additional minutes, to a maximum of the amount of time the character with the highest Constitution modifier could Hustle alone.
''Prerequisites'' Trained in [[Thievery]].
You can [[Steal]] or [[Palm an Object]] that’s closely guarded, such as in a pocket, without taking the –5 penalty.
You can’t steal objects that would be extremely noticeable or time consuming to remove (like worn shoes or armor or actively wielded objects).
If you’re a master in Thievery, you can attempt to Steal from a creature in combat or otherwise on guard. When doing so, Stealing requires 2 manipulate actions instead of 1, and you take a –5 penalty.
{{||SpellSummaryTable}}
Your performance enraptures those who hear it, compelling them to follow you about in admiration.
Each creature within the emanation must attempt a Will save when you Cast the Spell or the first time they enter the area, after which they become temporarily immune for 1 day.
Once per turn, you can spend a single action, which has the <<tag Concentrate>> trait, to increase the emanation’s radius by 5 feet.
You can [[Dismiss]] the spell.
{{||SaveSuccessTable}}
You tear the veil between the Material Plane and its shadow.
You can cast [[Plane Shift]] twice per week as an occult innate spell that can only target yourself; you can travel only to the Material or Shadow Planes, and your body serves as the focus component.
You carry a small token of protection from a site holy to your faith, or you touched your religious symbol to a relic or altar at such a site.
So long as this token is in your possession, when you tie an adversary’s initiative roll, you go first.
''Special'' If you select this feat at 1st level, you receive your pilgrim’s token for free. Alternately, if you have a religious symbol, it is already attuned, as described above.
If you select this feat at a later level, or if you lose your pilgrim’s token, you must purchase or [[Craft]] a replacement and attune it at a holy site.
Such a token usually costs at least 2 sp, and the attunement takes 10 minutes of prayer and requires a successful DC 20 Religion check. Your GM might adjust the price and DC depending on the token’s material and quality and the religious significance of the site; the more significant the location, the easier the attunement.
{{||SpellSummaryTable}}
You create a large, self-contained cylinder of still fresh water.
The pillar has a maximum radius of 15 feet and a maximum height of 60 feet. Creatures inside the pillar can swim through the water as normal ([[Swim]] DC 10), or, if the spell was cast on solid ground, walk along the bottom (which is [[Difficult Terrain]]).
Any creature that exits the pillar falls or lands accordingly.
{{||SpellSummaryTable}}
You raise one or more pillars of solid sand from the earth.
The total height of the pillars is 30 feet, which must be used in 10-foot increments (for example, you could create three 10-foot-tall pillars, one 20-foot-tall pillar and one 10-foot-tall pillar, or one 30-foot-tall pillar). Each pillar is 5 feet by 5 feet in length and width.
The pillars must be conjured on a relatively flat area of natural earthen terrain such as sand, dirt, stone, or clay. Regardless of the terrain, the pillars are always made of tightly compacted sand particles that together become as hard and solid as stone (DC 15 [[Athletics]] to Climb).
If a creature occupies the space where you cast this spell, it is carried upward atop the pillar. The creature can attempt a [[Reflex]] save (DC equal to the caster’s spell DC); on a success, the creature can either attempt to [[Grab an Edge]] or move into an adjacent unoccupied square.
If the pillar would rise higher than the ceiling, it firmly abuts the ceiling but does not rise any higher. A creature caught between a pillar and a ceiling takes no damage (subject to GM discretion, such as is in the case of stalactites or other hazards) but becomes [[Immobilized]]. The creature can attempt an [[Escape]] check to free itself, but it must thereafter [[Grab an Edge]], [[Climb]] down, or [[fall|Falling]] from the top of the pillar. The Grab an Edge and Escape DCs are the same as the Reflex save.
As part of your action to Sustain the Spell, you can choose to either destroy one of your pillars, causing it to immediately crumble into nothing, or create a new pillar, as long as doing so wouldn’t exceed the total number of feet of pillar you can create. You can Sustain the Spell two or more times on a single turn to destroy or create a pillar.
''Heightened (+1)'' The total height of the pillars increases by 10 feet, but must still be used in 10-foot increments (this also increases the total number of pillars that can be created by one).
One of your parents has a human life span and another an elven life span, with your own somewhere between. As a result, you have an unusual perspective on time, which you’ve learned to manifest to aid yourself in moments of stress.
You gain [[Haste]] as a 3rd-level arcane innate spell, though you can target only yourself. You can Cast this Spell once per day.
''Trigger'' You use [[Flurry of Blows]] to make two ranged piercing weapon Strikes against the same target.
You target your opponent’s clothing, equipment, or loose flesh with piercing projectiles to pin them to the ground or a nearby surface.
If both your attacks hit, the target must succeed at a [[Reflex]] save against your class DC or become [[Immobilized]] until it or an adjacent creature succeeds at a DC 10 [[Athletics]] check to remove the pinning projectiles.
The creature doesn’t become stuck if it is incorporeal, is liquid (like a water elemental or some oozes), or could otherwise escape without effort.
Unsuspecting targets are especially vulnerable to your poisons.
When you successfully [[Strike]] a [[Flat-Footed]] creature with a poisoned weapon or expose a flat-footed creature to an inhaled poison, the flat-footed condition also gives that creature a –2 circumstance penalty to its initial save against that poison.
As a pirate, you sail the seas in search of enemy ships to plunder.
You become trained in Sailing [[Lore]], or become an expert in it if you were already trained.
You ignore the effects of [[Difficult Terrain]] or [[Uneven Ground]] caused by a ship’s movement.
Additionally, you gain the [[Boarding Assault]] action.
<<archetypefeatlist "4 8" "Pirate">>
You’re particularly skilled at wielding traditional pirate weapons.
You become trained with the following weapons: [[Hatchet]], [[Rapier]], [[Scimitar]], and [[Whip]].
Whenever you gain a class feature that grants you expert or greater proficiency with a given weapon or weapons, you also gain that proficiency rank for these weapons.
Your blood bears the mark of a demon, a living embodiment of sin from the fetid depths of the Abyss. Demonic power pulses through your veins and manifests in a different way for each pitborn, whether you have webbed fingers and thrive in the water, large hands capable of wrestling larger foes, or some other manifestation.
You are trained in [[Athletics]]. If you were already trained in Athletics (from your background or class, for example), you instead become trained in a skill of your choice.
You also gain any one common 1st-level skill feat with a prerequisite of trained in Athletics, as reflects the manifestation of your Abyssal blood.
''Feats Available:''
<<bulletlist "[tag[Feat]tag[Skill]field:feat-level[1]field:feat-skill[Athletics]field:feat-spre[T]]">>
''Requirements'' You are wielding your staff.
You [[Leap]] and then [[Strike]] using your staff.
You gain a circumstance bonus to damage for the Strike equal to twice the number of weapon damage dice.
Regardless of whether your Strike hit, you can then attempt to [[Shove]] or [[Trip]] the target.
Instead of Tiny, your size is Small.
You can sniff out the pungent tang of disease.
When you detect a creature by [[Scent]], you can also detect if that creature is suffering from a disease at a non-carrier state.
If the disease is particularly subtle, you might need to attempt a [[Perception]] check against the disease’s DC (subject to the GM’s discretion).
{{||RitualSummaryTable}}
''Cost'' rare incense and offerings worth a total value of 2 gp times the spell level times the target’s level.
Secondary casters must share your religion.
You call upon your deity to grant you aid in the form of a divine servitor of your deity’s choice of a level no greater than double planar ally’s spell level.
While performing this ritual, the secondary casters entreat your deity, explaining what sort of assistance you need and why you need it; if the task is incredibly fitting to your deity, the GM can grant a circumstance bonus to the secondary [[Diplomacy]] check or rule that the check is automatically a critical success.
If the ritual succeeds, you must offer the servitor payment depending on factors such as the duration and danger of the task. Payment always costs at least as much as a consumable item of the creature’s level, even for a short and simple task, and it often costs as much as a permanent magic item of the creature’s level to persuade a creature to fight alongside you.
If you use the ritual without good reason, the result is automatically a critical failure.
{{||ActionSuccessTable}}
{{||RitualSummaryTable}}
''Cost'' warding diagram ingredients worth a total value of 2 gp times the spell level times the target’s level.
You call forth an extraplanar creature of a level no greater than double that of the planar binding ritual’s level and attempt to bargain with it.
The secondary caster attempting the Crafting check creates a warding diagram to prevent the extraplanar creature from attacking or leaving during the bargain; if that caster fails or critically fails, then instead of the usual effects of a failure or critical failure of the secondary skill check, the extraplanar creature can attack or leave instead of negotiate.
You can also leave out this step, removing the need for a [[Crafting]] check, with the same result (if you’re summoning a good outsider you trust, for example).
The creature can also attack or leave if you use any [[Hostile Action]] against it or if the warding diagram breaks.
Once the diagram is complete, you and the secondary casters each take your places at specific points at the diagram’s edge where power concentrates. You conjure the extraplanar creature within your wards and negotiate a deal with it, generally to perform a task for you in exchange for payment.
A creature that doesn’t wish to negotiate at all can attempt a [[Will]] save to stay on its home plane.
Most good and neutral extraplanar creatures feel that they have something better to do than cater to the whims of mortals and require a significant gift, especially if your task poses significant risks. Evil extraplanar creatures are more likely to accept a bargain for a lower cost as long as it allows them to wreak havoc on the Material Plane or inflict evil upon the world along the way.
Monetary prices usually range from the cost of a consumable item of the creature’s level for a short and simple task to a permanent magic item of the creature’s level or more to persuade the creature to fight alongside you. However, some extraplanar creatures may want payments other than money, such as permission to cast a [[Geas]] on you to fulfill an unspecified later favor or obtain ownership of your soul via an infernal contract.
If you can’t come to an agreement in a reasonable length of time after you’ve made your case, the extraplanar creature can return from whence it came at any time.
{{||ActionSuccessTable}}
''Prerequisites'' Master in [[Survival]].
You can [[Subsist]] using Survival on different planes, even those without resources or natural phenomena you normally need. For instance, you can forage for food even if the plane lacks food that could normally sustain you.
A success on your check to Subsist can also reduce the damage dealt by the plane, at the GM’s discretion.
{{||SpellSummaryTable}}
You and your allies traverse the barriers between planes of existence.
The targets move to another plane, such as the Plane of Fire, the Shadow Plane, or the Abyss.
You must have specific knowledge of the destination plane and use a magic tuning fork created from material from that plane as a focus for the spell. While the tuning forks for most prominent planes are <<tag Uncommon>>, just like the spell Plane Shift, more obscure planes and demiplanes often have <<tag Rare>> tuning forks.
The spell is highly imprecise, and you appear 1d20×25 miles from the last place one of the targets (of your choice) was located the last time that target traveled to the plane. If it’s the first time traveling to a particular plane for all targets, you appear at a random location on the plane.
Plane shift doesn’t provide a means of return travel, though casting plane shift again allows you to return to your previous plane unless there are extenuating circumstances.
You can put a single item you’re holding of light or negligible Bulk onto a person without them noticing by succeeding at a [[Thievery]] check against their [[Perception]] DC.
If you have the [[Ruffian]] racket, you can do this as a free action when you successfully [[Shove]] a target.
{{||SpellSummaryTable}}
Taking inspiration from verdant creatures, you transform into a Large plant battle form.
You must have space to expand into or the spell is lost.
When you cast this spell, choose arboreal, flytrap, or shambler. You can substitute a similar specific plant to turn into (such as a pitcher plant instead of a flytrap), but this has no effect on the form’s Size or statistics.
While in this form, you gain the <<tag Plant>>trait.
You can [[Dismiss]] the spell.
{{BattleFormRestrictions}}
You gain the following statistics and abilities regardless of which battle form you choose:
* AC = 19 + your level. Ignore your armor’s check penalty and Speed reduction.
* 12 temporary Hit Points.
* Resistance 10 to poison.
* [[Low-Light Vision]].
* One or more unarmed melee attacks specific to the battle form you choose, which are the only attacks you can use. You’re trained with them. Your attack modifier is +17, and your damage bonus is +11. These attacks are [[Strength]] based (for the purpose of the [[Enfeebled]] condition, for example). If your unarmed attack modifier is higher, you can use it instead.
* [[Athletics]] modifier of +19, unless your own modifier is higher.
You also gain specific abilities based on the type of plant you choose:
* ''Arboreal'' Speed 30 feet; Melee {{OneAction}} branch (reach 15 feet), Damage 2d10 bludgeoning; Melee {{OneAction}} foot, Damage 2d8 bludgeoning; you can speak in this form, but you still can’t [[Cast a Spell]] or supply verbal components.
* ''Flytrap'' Speed 15 feet; resistance 10 to acid; Melee {{OneAction}} leaf (reach 10 feet), Damage 2d8 piercing, and you can spend an action after a hit to [[Grab]] the target.
* ''Shambler'' Speed 20 feet, swim Speed 20 feet; resistance 10 to electricity; Melee {{OneAction}} vine (reach 15 feet), Damage 2d8 slashing.
''Heightened (6th)'' Your battle form is Huge, and the reach of your attacks increases by 5 feet. You instead gain AC = 22 + your level, 24 temporary HP, attack modifier +21, damage bonus +16, and Athletics +22.
{{||RitualSummaryTable}}
You cause the plants within the area to be healthier and more fruitful.
In addition to other benefits of healthy plants, this increases the crop yield for farms, depending on your success.
If you cast it in the area of a [[Blight]], plant growth attempts to [[Counteract]] the blight instead of producing its usual effect.
{{||ActionSuccessTable}}
You gain nourishment in the same way that the plants or fungi that match your body type normally do, through some combination of photosynthesis, absorbing minerals with your roots, or scavenging decaying matter.
You typically do not need to pay for food.
If you normally rely on photosynthesis and go without sunlight for 1 week, you begin to [[starve|Starvation]]. You can derive nourishment from specially formulated bottles of sunlight instead of natural sunlight, but these bottles cost 10 times as much as standard rations (or 40 sp).
''Prerequisites'' [[Leaf Order]] or [[Wild Shape]].
You can take the form of a plant creature.
Add the forms listed in [[Plant Form]] to your [[Wild Shape]] list.
If you don’t have wild shape, you can instead cast [[Plant Form]] once per day, heightened to the __same level as your highest Druid spell slot__.
Whenever you’re polymorphed into another form using wild shape, you gain resistance 5 to poison.
This suit of [[+2|Armor Potency]] greater [[Resilient]] full plate is decorated with swirling, ornate motifs of waves and fish scales.
While wearing it, you take no Speed reduction or check penalty from armor when Swimming, gain a +2 item bonus to [[Athletics]] checks to [[Swim]], can breathe underwater, and can speak Aquan.
''Trigger'' You reduce an enemy to 0 Hit Points during a non‑trivial combat encounter with spectators.
You show off for the crowd.
Attempt a [[Performance]] check; the DC is determined by the GM but is typically the standard DC for your level or the DC to [[Make an Impression]] on the spectators, whichever is higher.
On a success, choose one of the following benefits. On a critical success, choose two benefits:
* A number of temporary Hit Points equal to your character level; these last for 1 minute.
* A +1 circumstance bonus to AC until the end of your next turn.
* A +1 circumstance bonus to your next attack roll before the end of your next turn.
You can prepare incredible numbers of snares each day out of simple ingredients.
Double the number of prepared snares granted by Snarecrafter Dedication.
You spend 10 minutes in contemplation to uncannily predict how events will play out.
Choose a particular goal or activity you plan to engage in within 1 week, or an event you expect might happen within 1 week.
You analyze whether it’s likely to come to pass, learning whether it’s highly likely, somewhat likely, somewhat unlikely, or highly unlikely.
You also gain a piece of advice suggesting a course of action you or your allies could take that might make the chosen event more or less likely, whichever you prefer.
The GM determines the likeliness of the event and the piece of advice you learn.
Your blood soars with the power of the magnificent garuda, proud and stoic avian warriors.
You only take half the normal damage from falling and gain a +2 circumstance bonus to saving throws against effects with the <<tag Air>> trait.
This item appears to be a miniature replica of a theater. It includes a small pocket full of minute set dressing and costumed paper dolls.
''Activate'' {{ClockIcon}} 1 minute (command, envision, [[Interact]]); ''Effect'' You place the miniature theater on the ground, filling it with any set dressing and up to six figures you choose. Then, you tap a rhythm on the miniature, causing it to grow into a modest stage 20 feet wide and 15 feet deep.
It’s dressed with the decorations you selected, and simple mannequins wear the costumes you chose. A wooden proscenium arch frames the stage, and simple curtains along the sides conceal the wings.
As a magical structure, the stage has the structure trait.
All the stage’s set dressing is illusory and disappears if taken more than 20 feet from the stage. The costumes are physical but with illusory embellishments that fade at the same range, revealing only plain, white smocks.
''Requirements'' A creature is undetected by one or more of your allies but isn’t undetected by you.
You indicate a creature that you can see to one or more allies, gesturing in a direction and describing the distance verbally.
That creature is [[Hidden]] to your allies, rather than [[Undetected]].
This works only for allies who can see you and are in a position where they could potentially detect the target.
If your allies can’t hear or understand you, they must succeed at a [[Perception]] check against the creature’s [[Stealth]] DC or they misunderstand and believe the target is in a different location.
''Requirements'' You are wielding a ranged weapon.
You take aim to pick off nearby enemies quickly.
When using a ranged [[Volley]] weapon while you are in this stance, you don’t take the penalty to your attack rolls from the volley trait.
When using a ranged weapon that doesn’t have the volley trait, you gain a +2 circumstance bonus to damage rolls on attacks against targets within the weapon’s first range increment.
You ask a question that charms or needles someone in just the right way.
Ask a question of a non-allied creature that you can see and have been conversing with.
Attempt a [[Diplomacy]] check against the creature’s [[Will]] DC. The creature is then temporarily immune for 1 hour.
{{||ActionSuccessTable}}
Poisons are a form of [[Affliction]].
Unlike other forms of Affliction, poison has an effect if you are re-exposed to the same poison while already under its effects. Failing a save against a re-exposure increases the stage by 1, or 2 on a critical failure. It does not extend the maximum duration.
In nature, certain animals are covered in venomous spines, such that even touching them is deadly.
To use this reaction, you must have brushed poison onto your clothing or woven sharp poisoned needles into the garment’s fabric. This takes 10 minutes and uses one dose of contact or injury poison. You can have only one such poison suffused into your clothing at a time.
When you use this reaction, the triggering creature is exposed to the suffused poison.
Repeated exposure to toxic reagents has fortified your body against poisons of all kinds.
You gain <<tag Poison>> resistance equal to half your level, and you gain a +1 status bonus to saving throws against poisons.
''Requirements'' You are wielding a piercing or slashing weapon.
You apply a poison to the required weapon. __If you’re not holding a poison and have a free hand, you can [[Interact]] to draw a poison as part of this action.__
If your next attack with that weapon before the end of your next turn hits and deals damage, it applies the effects of the poison, provided that poison can be delivered by contact or injury.
If you critically fail the attack roll, the poison is wasted as normal.
''Special'' During your daily preparations, you can prepare a number of simple injury poisons equal to your rogue level.
These poisons deal 1d4 poison damage.
Only you can apply these poisons properly, and they expire the next time you prepare.
You make a point of always having a few toxins near at hand—you never know when some arsenic or the like might prove useful.
{{MulticlassBasicAlchemy}}
//The above alchemy benefits// can be used only for alchemical poisons.
You gain batches of infused reagents per day equal to your level.
Your advanced alchemy level for creating these is 1 and doesn’t increase on its own.
//The book lists Improved Poison Weapon twice, at levels 10 and 12, but doesn't state which is correct.//
<<archetypefeatlist "4 6 8 10 18" "Poisoner">>
''Requirements'' Your last action was a successful melee Strike that dealt damage against a target that is afflicted by a poison, and you know which poison.
Poisons attack specific parts of the body—one venom might target the lungs, another the circulatory system, while another deteriorates the nerves. You know how to take advantage of such weaknesses.
You deal 1d6 damage of the required Strike’s damage type and 1d6 poison damage to the target.
If you’re at least 18th level, you deal 2d6 damage of each type.
{{||SpellSummaryTable}}
You fire a blue-white ray of freezing air and swirling sleet from your finger that can chill your target to the bones.
You must succeed at a spell attack roll to affect the target, which then takes 10d8 cold damage and is [[Drained]] 2.
''Heightened (+1)'' The damage increases by 2d8.
You learn two new languages, chosen from common languages and any uncommon languages you have access to. These languages take the same form (signed or spoken) as your other languages. If you select the [[Multilingual]] feat, you learn three new languages instead of two.
Your muse is a jack of all trades, flitting between skills and pursuits. If it’s is a creature, it might be an eclectic creature like a fey. As a bard with a polymath muse, you are interested in a wide array of topics but rarely dedicated to any one, and you rarely make up your mind—you want to try everything.
You gain the [[Versatile Performance]] feat and add [[Unseen Servant]] to your spell repertoire.
These effects transform the target into a new form.
A target can’t be under the effect of more than one polymorph effect at a time.
If it comes under the effect of a second polymorph effect, the second polymorph effect attempts to [[Counteract]] the first. If it succeeds, it takes effect, and if it fails, the spell has no effect on that target.
Any [[Strike]]s specifically granted by a polymorph effect are [[Magical]].
Unless otherwise stated, polymorph spells don’t allow the target to take on the appearance of a specific individual creature, but rather just a generic creature of a general type or ancestry.
If you take on a battle form with a polymorph spell, the special statistics can be adjusted only by circumstance bonuses, status bonuses, and penalties. Unless otherwise noted, the battle form prevents you from casting spells, speaking, and using most manipulate actions that require hands. (If there’s doubt about whether you can use an action, the GM decides.)
Your gear is absorbed into you; the constant abilities of your gear still function, but you can’t activate any items.
//Implied by [[Blister]].//
You can spend a single action, which has the Concentrate trait, to pop a blister.
Your spellcasting is rife with strange lights, esoteric gestures, and other captivating effects that befuddle your foes.
If the next action you use is to [[Cast a Spell]], any creature that attempts to use a reaction triggered by your Cast a Spell activity takes a –2 circumstance penalty to attack rolls and skill checks rolled as part of the reaction.
In addition, if the spell includes a spell attack roll or requires a saving throw, creatures you hit or that fail their saves are [[Fascinated]] with you until the start of your next turn.
''Requirements'' You are wielding a two-handed melee weapon and your target is within your reach.
With punishing blows, you force your opponent into position.
Make a [[Strike]] with the required weapon. If you hit, you move the target 5 feet into a space in your reach.
{{||SpellSummaryTable}}
Drawing life force into yourself, you become a beacon of positive energy.
You glow with [[Bright Light]] in a 10-foot [[Emanation]], and you gain an internal pool of light called a luminance reservoir, which begins with a value of 4.
At the start of each of your turns, you can use a free action to increase the luminance reservoir by 4. If you do, the radius of your light increases by 10 feet.
If an <<tag Undead>>creature damages you with an attack or spell while it’s within the area of your light, that creature takes positive damage equal to half your luminance reservoir value. It takes this damage only the first time it damages you in a round.
You can [[Dismiss]] this Spell. When you do, you can target a creature within your light and direct the positive energy into it. The target must be a willing living creature or an undead creature. This heals a living target or damages an undead target by an amount equal to your luminance reservoir’s value.
When you cast positive luminance, any other positive luminance spell you already had in effect ends.
''Heightened (+1)'' Both the initial value of your luminance reservoir and the amount you gain each turn increase by 1.
''Requirements'' You have designated prey with [[Hunt Prey]].
By spending 1 minute giving guidance to help hunt down your prey, you instruct up to five willing creatures to assist you.
They gain a +1 circumstance bonus to [[Seek]] your prey, to [[Track]] your prey, and to [[Gather Information]] about your prey.
You and the creatures assisting you gain a +1 circumstance bonus to [[Initiative]] rolls when entering combat with your prey.
This benefit lasts until you designate a new prey or your prey dies, whichever comes first.
An individual creature assisting you loses this benefit if they’re out of your presence for too long to benefit from your instructions. This is usually 1 hour, but is determined by the GM.
{{||SpellSummaryTable}}
You send your mind and soul into the target’s body, attempting to take control.
The target must attempt a [[Will]] save. You can choose to use the effects of a degree of success more favorable to the target if you prefer.
While you’re possessing a target, your own body is [[Unconscious]] and can’t wake up normally.
You can sense everything the possessed target does.
You can [[Dismiss]] this spell.
If the possessed body dies, the spell ends and you must succeed at a [[Fortitude]] save against your spell DC or be [[Paralyzed]] for 1 hour, or 24 hours on a critical failure.
If the spell ends during an encounter, you act just before the possessed creature’s initiative count.
''Heightened (9th)'' The duration is 10 minutes, and you can physically enter the creature’s body, protecting your physical body while the spell lasts.
{{||SaveSuccessTable}}
An array of semiprecious stones is set into the ornate silver and beaten copper cover of this thick and weighty tome.
If you open the book before it’s been activated, its vellum pages are blank and pristine, but once activated, words dance and swim onto the pages before your eyes.
''Activate'' {{ClockIcon}} 10 minutes (Envision, Interact); ''Effect'' As you flip through the book, you think about a broad topic you want to know more about. Choose one skill: [[Arcana]], [[Crafting]], [[Medicine]], [[Nature]], [[Occultism]], [[Religion]], [[Society]], or a single subcategory of [[Lore]]. The book’s pages fill with information about that skill, though only you can see the information.
While the pages are full, you can spend an [[Interact]] action perusing the book just before attempting a check to [[Recall Knowledge]] with the chosen skill. This grants you a +3 item bonus to the check, and if you roll a critical failure, you get a failure instead.
The information within the book disappears after 24 hours or when the tome is activated again.
Affix to a weapon.
''Trigger'' You make an attack with the affixed weapon, but you haven’t rolled yet.
This fluorite crystal glows with a strange phosphorescence.
When you activate {{FreeAction}} the crystal, the weapon becomes a [[+1|Weapon Potency]] [[Striking]] weapon for the rest of the turn, gaining a +1 item bonus to the attack roll and increasing the damage on a hit to two weapon damage dice.
''Prerequisite'' [[Powerful Alchemy]].
By concentrating your poisons’ toxic components, you make them harder for victims to resist.
When you craft an alchemical item with the <<tag Poison>>trait by any means, the DC is increased by up to 4, to a maximum of your class DC.
Upon drinking this effervescent concoction, you gain a fly Speed of 40 feet for 1 minute.
| !Type | !Level | !Price | !Duration |
| Standard | 8 | 1000 | 1 minute |
| Greater | 15 | 10000 | 1 hour |
For 1 minute after you drink this fizzy potion, whenever you [[Leap]], you gain the effect of the 1st-level [[Jump]] spell.
Drinking this silver potion grants you the effects of [[Haste]] for 1 minute.
Drinking this thick, fortifying potion grants resistance against a single damage type for 1 hour.
Each potion of resistance is created to defend against <<tag Acid>>, <<tag Cold>>, <<Tag Electricity>>, <<tag Fire>>, or <<tag Sonic>> damage (and is called a lesser potion of fire resistance or the like).
| !Type | !Level | !Price | !Resistance |
| Lesser | 6 | 450 | 5 |
| Moderate | 10 | 1800 | 10 |
| Greater | 14 | 8500 | 15 |
This potion tastes like salt water, and sandy grit settles to the bottom of its container.
When you drink it, you gain a swim Speed equal to your land Speed for 10 minutes.
| !Type | !Level | !Price | !Duration |
| Standard | 6 | 500 | 10 minutes |
| Greater | 11 | 2500 | 1 hour |
This sour potion enlivens your tongue with unusual flavors and uncommon eloquence, allowing you to speak and understand all languages for 4 hours after you drink it.
This doesn’t allow you to read these languages in their written form.
Drinking this dull-black liquid makes you undetectable to divinations.
This grants the same effects as [[Mind Blank]], but without the bonus against <<tag Mental>> effects.
You also gain the effects of a 4th-level [[Invisibility]] spell, which protects against [[See Invisibility]] spells of 8th level and lower and has a DC of 36 against [[True Seeing]].
The potion’s effects last for 10 minutes.
This filmy, gray potion smells of an old fish midden and tastes even worse.
After drinking this potion, you gain the effects of a 2nd-level [[Water Breathing]] spell for 1 hour.
When you create an herbal elixir, you can prepare it as a poultice instead.
A poultice gains the oil trait (but remains alchemical, not magical) and loses the elixir and ingested traits.
You can apply a poultice by [[Interact]]ing with one hand.
When you apply a poultice, in addition to the item's normal effects, the recipient can attempt an immediate flat check to recover from a single source of persistent acid, bleed, or fire damage, with the DC reduction from appropriate assistance.
You unleash a particularly powerful attack that clobbers your foe but leaves you a bit unsteady.
Make a melee [[Strike]]. This counts as two attacks when calculating your [[Multiple Attack Penalty]].
If this Strike hits, you deal an extra die of weapon damage.
If you’re at least 10th level, increase this to two extra dice, and if you’re at least 18th level, increase it to three extra dice.
{{||SpellSummaryTable}}
You utter an arcane word of power that can make the target blinded upon hearing it.
Once targeted, the target is then temporarily immune for 10 minutes.
The effect of the spell depends on the target’s level.
* ''11th or Lower'' The target is [[Blinded]] permanently.
* ''12th–13th'' The target is blinded for 1d4 minutes.
* ''14th or Higher'' The target is [[Dazzled]] for 1 minute.
''Heightened (+1)'' The levels at which each outcome applies increase by 2.
{{||SpellSummaryTable}}
You utter the most powerful arcane word of power.
Once targeted, the target is then temporarily immune for 10 minutes.
The effect of the spell depends on the target’s level.
* ''14th or Lower'' The target dies instantly.
* ''15th'' If the target has 50 Hit Points or fewer, it dies instantly; otherwise, it drops to 0 Hit Points and becomes [[Dying]] 1, or increases its dying condition by 1 if it’s already dying.
* ''16th or Higher'' The target takes 50 damage; if this brings the target to 0 Hit Points, the target dies instantly.
''Heightened (10th)'' The levels at which each outcome applies increase by 2.
{{||SpellSummaryTable}}
You stun the target with an arcane word of power.
Once targeted, the target is then temporarily immune for 10 minutes.
The effect of the spell depends on the target’s level.
* ''13th or Lower'' The target is [[Stunned]] for 1d6 rounds.
* ''14th–15th'' The target is [[Stunned]] for 1 round.
* ''16th or Higher'' The target is [[Stunned]] 1.
''Heightened (+1)'' The levels at which each outcome applies increase by 2.
Alchemical items you create on the fly are particularly potent.
When you use [[Quick Alchemy]] to create an <<tag Infused>> alchemical item that allows a saving throw, you can change its DC to your class DC.
//This was changed from a class feat to an ability in November 2020.//
You know how to wield your fists as deadly weapons.
The damage die for your fist __increases__ to 1d6 instead of 1d4.
Most people take a –2 circumstance penalty when making a lethal attack with nonlethal unarmed attacks, because they find it hard to use their fists with deadly force. You don’t take this penalty when making a lethal attack with your fist or any other unarmed attacks.
Your stomach is particularly durable.
When you succeed at a [[Fortitude]] save to reduce your [[Sickened]] value, you reduce it by 2 (or by 3 on a critical success).
''Prerequisites'' Expert in [[Athletics]].
When you [[Leap]], you can jump 5 feet up with a vertical Leap.
You increase the distance you can jump horizontally by 5 feet.
You can push larger foes around with your attack.
You can use [[Aggressive Block]] or [[Brutish Shove]] against a creature up to two sizes larger than you.
When a creature you [[Shove]] has to stop moving because it would hit an object, it takes damage equal to your Strength modifier (minimum 1). This happens regardless of how you Shoved the creature.
Your snares are particularly difficult for enemies to avoid.
When you set a snare, the saving throw DC for that snare is equal to its normal DC or your class DC, whichever is higher.
You have learned to exploit your enemies’ lowered defenses.
When you succeed or critically succeed at a [[Strike]] using your [[Strength]] modifier on the attack roll and you would deal [[Sneak Attack]] damage, you can change the additional damage from sneak attack into ordinary damage of the same type as your Strike, rather than precision damage.
{{||SpellSummaryTable}}
''Trigger'' You or an ally within range fails a skill check for a skill in which you or they are trained.
The target gains a +2 status bonus to the triggering check, or a +3 bonus if the target has master or better proficiency in the skill. This bonus can change the outcome of the target’s check.
Making one’s way to safety can be harrowing, but you have extensive practice at helping others along that path.
When you roll a success to [[Aid]] a member of your crop, you get a critical success instead.
You’re skilled at navigating bogs and marshes, even for a paddler shoony.
You gain a swim Speed of 15 feet.
You grew up riding your clan’s shaggy ponies and riding dogs.
You become trained in [[Nature]]. If you would automatically become trained in Nature (from your background or class, for example), you instead become trained in a skill of your choice.
You also get a +1 circumstance bonus to [[Command an Animal]] if the target is a traditional halfling mount, such as a pony or riding dog.
You enchant a piece of ammunition with the magical essence of a precious material, allowing you to leverage certain creatures’ weaknesses.
Choose [[Cold Iron]] or [[Silver]]; if you shoot the arrow before the end of your turn, it counts as that material.
At 14th level, add [[Adamantine]] to the list of materials you can choose from.
{{||SpellSummaryTable}}
Your deity blesses base metals to transform them into precious materials.
The target item transforms from its normal metal into [[Cold Iron]], [[Copper]], [[Gold]], [[Iron]], [[Silver]], or [[Steel]].
An item transmuted in this way deals damage according to its new material. For example, a steel sword transmuted to cold iron would deal additional damage to a creature with a weakness to cold iron.
This change is clearly magical and temporary, so the item’s monetary value doesn’t change; you couldn’t transmute copper coins to gold and use those coins to purchase something or as a cost for a spell.
''Heightened (8th)'' Add [[Adamantine]] and [[Mithral]] to the list of metals you can transform the item into.
Average vision is a precise sense—a sense that can be used to perceive the world in nuanced detail.
The only way to target a creature without having drawbacks is to use a precise sense.
You can usually detect a creature automatically with a precise sense unless that creature is [[hiding|Hide]] or obscured by the environment, in which case you can use the [[Seek]] basic action to better detect the creature.
You carefully aim and gracefully deliver your debilitations.
Add the following debilitations to the list you can choose from when you use [[Debilitating Strike]].
* ''Debilitation'' The target takes an additional 2d6 precision damage from your attacks.
* ''Debilitation'' The target becomes [[Flat-Footed]].
You strike with flair.
When you have [[Panache]] and you [[Strike]] with an [[Agile]] or [[Finesse]] melee weapon or [[Agile]] or [[Finesse]] unarmed attack, you deal 2 additional precision damage.
If the strike is part of a <<tag Finisher>>, the additional damage is 2d6 precision damage instead.
As your swashbuckler level increases, so does your additional damage for precise strike. Increase the amount of additional damage on a [[Strike]] and the number of additional dice on a finisher by one at 5th, 9th, 13th, and 17th levels.
| !Level | !Extra Dice |
| 1 | 2d6 |
| 5 | 3d6 |
| 9 | 4d6 |
| 13 | 5d6 |
| 17 | 6d6 |
You have trained to aim for your prey’s weak points.
The first time you hit your hunted prey in a round, you also deal 1d8 additional precision damage. (Precision damage increases the damage you already deal, using the same type, but is ineffective against creatures that lack vital organs or weak points.)
At 11th level, the extra damage increases to 2d8 precision damage, and at 19th level, the extra damage increases to 3d8 precision damage.
When you gain [[Masterful Hunter]], your weapon mastery allows you to hit your prey’s vital areas multiple times. The second time in a round you hit your hunted prey, you also deal 1d8 precision damage. At 19th level, your second hit in a round against your hunted prey deals 2d8 precision damage, and your third hit in a round against your hunted prey deals 1d8 precision damage.
You gain a talon melee unarmed attack that deals 1d4 slashing damage. Your talon attack is in the brawling group and has the [[Agile]], [[Finesse]], and [[Unarmed]] traits.
''Trigger'' You successfully [[Seek]] a [[Hidden]] or [[Undetected]] creature.
You give a throaty growl to attempt to [[Demoralize]] a creature you just found.
You don’t take the –4 penalty for not sharing a language with the creature.
''Prerequisites'' [[Animal Instinct]].
''Requirements'' You are unarmored or wearing light armor.
You close the distance to your prey in a blur, pouncing on the creature before it can react.
You [[Stride]] up to your Speed and make a [[Strike]] at the end of your movement.
By observing an opponent, you can get a sense of their next move and prepare to counter or resist it.
Choose one target and attempt a [[Perception]] check to [[Sense Motive]] against the foe’s [[Deception]] DC or a hard DC of the foe’s level, whichever is higher.
{{||ActionSuccessTable}}
//Prediction effects give information about what might happen in the future.//
You have just the thing for the situation.
You gain the [[Prescient Planner]] and [[Prescient Consumable]] feats.
When using Prescient Planner, you can pull out the item as a 2-action activity to remove your backpack (or a similar container) and draw the item, rather than taking 1 minute.
''Frequency'' once per day
''Trigger'' You would take bludgeoning, piercing, or slashing damage.
Your body anticipates the blow. The impact area briefly reorganizes into a strengthened tissue lattice that blunts the attack.
You gain resistance equal to your level to the triggering damage type, which applies against the triggering damage.
If you have the [[Crystalline Dust]] feat, you can use Preemptive Reconfiguration without expending a usage of the reaction for the purpose of the feat’s Frequency limit. Instead, the usage counts toward your number of Crystalline Dust uses per day, as if you had used that feat instead.
''Trigger'' You attempt a saving throw against a hazard, but you haven’t rolled yet.
Your deity grants you limited foresight, warning you of dangers an instant before they occur.
You gain a +2 circumstance bonus to the triggering saving throw.
''Frequency'' once per hour
''Trigger'' You fail a saving throw against a <<tag Mental>> effect.
Your deity sends you a vision of faith to steel you against mental attacks.
Reroll the triggering saving throw with a +2 circumstance bonus. You must use the second result, even if it’s worse.
''Prerequisites'' [[Prescient Planner]].
You can predict which consumables you might need in advance.
When using Prescient Planner, you can procure a consumable item from your backpack, instead of a piece of adventuring gear.
The consumable item must still be <<tag Common>>with a level no higher than half your level, and its [[Bulk]] must be low enough that carrying it wouldn’t have made you [[Encumbered]].
''Cost'' The price of the chosen item.
''Requirements'' You haven't used this ability since the last time you were able to purchase goods.
You regularly create convoluted plans and contingencies, using your resources to enact them.
You take 1 minute to remove your backpack, then carefully remove an item you hadn’t previously declared that you purchased—you intuited that you would come to need the item and purchased it at the latest opportunity.
The item must be a piece of adventuring gear and can’t be a weapon, armor, alchemical item, magic item, or other treasure.
It must be <<tag Common>> with a level no higher than half your level, and its [[Bulk]] must be low enough that carrying it wouldn’t have made you [[Encumbered]].
Actions with this trait allow you to follow up earlier attacks.
An action with the press trait can be used only if you are currently affected by a [[Multiple Attack Penalty]].
Some actions with the press trait also grant an effect on a failure. The effects that are added on a failure don’t apply on a critical failure.
If your press action succeeds, you can choose to apply the failure effect instead. (For example, you may wish to do this when an attack deals no damage due to resistance.)
Because a press action requires a multiple attack penalty, you can’t use one when it’s not your turn, even if you use the [[Ready]] activity.
{{||SpellSummaryTable}}
The simplest magic does your bidding.
You can perform simple magical effects for as long as you [[Sustain the Spell|Sustain a Spell]].
Each time you Sustain the Spell, you can choose one of four options.
* ''Cook'' Cool, warm, or flavor 1 pound of nonliving material.
* ''Lift'' Slowly lift an unattended object of light [[Bulk]] or less 1 foot off the ground.
* ''Make'' Create a temporary object of negligible Bulk, made of congealed magical substance. The object looks crude and artificial and is extremely fragile—it can’t be used as a tool, weapon, or spell component.
* ''Tidy'' Color, clean, or soil an object of light Bulk or less.
You can affect an object of 1 Bulk with 10 rounds of concentration, and a larger object with 1 minute per Bulk.
Prestidigitation can’t deal damage or cause adverse conditions.
Any actual change to an object (beyond what is noted above) persists only as long as you Sustain the Spell.
''Prerequisites'' at least one stance feat.
''Trigger'' You are targeted by an attack or attempt a [[Reflex]] saving throw against a damaging effect, and you are in a stance.
Your willingness to flow from one stance to another lets you sacrifice their benefits to better protect yourself.
You leave the stance you were in, gaining a +4 circumstance bonus to the triggering saving throw or to your [[AC]] against the triggering attack.
You avoid the attention of creatures focused on your allies.
You can use lesser cover from your allies to [[Hide]].
''Trigger'' An ally within 30 feet brings a foe to 0 Hit Points.
With a shout of triumph, you grant inspiration to an ally //to// fight on.
The triggering ally gains temporary Hit Points equal to their [[Constitution]] modifier until the end of their next turn.
An instinctual connection to and faith in the world, the cycle of day and night, the turning of the seasons, and the natural selection of predator and prey drive the primal tradition.
[[Druid]]s are the most iconic primal spellcasters, calling upon the magic of nature through deep faith and a connection to the plants and animals around them, and primal [[Sorcerer]]s call upon their fey or beast blood to harness the same natural energies.
<<schoolspelllist Primal>>
You surround yourself with a thick field of protective primal energy.
You and allies within 30 feet of you gain resistance equal to your [[Wisdom]] modifier to acid, cold, electricity, fire, negative, and positive damage.
Increase the spell slots you gain from druid archetype feats by 1 for each spell level other than your two highest spell levels.
{{||RitualSummaryTable}}
''Cost'' Faerie circle ingredients worth a total value of 1 gp times the spell level times the target’s level.
This functions as [[Planar Ally]] except you craft a faerie circle and call an <<tag Animal>>, <<tag Beast>>, <<tag Fey>>, <<tag Fungus>>, or <<tag Plant>> from within 100 miles.
''Prerequisites'' bloodline that grants primal spells
You can call upon the creatures of the wild for aid.
You gain an additional spell slot of your highest level, which you can use only to cast [[Summon Animal]] or //[[Summon Plant or Fungus]]//.
You can cast either of these spells using that spell slot, even if it they aren’t in your spell repertoire.
Your connection to nature is particularly strong, and the spirits of nature flock around you, helping you replenish your focus.
If you have spent at least 2 Focus Points since the last time you Refocused, you recover 2 Focus Points when you [[Refocus]] instead of 1.
{{||SpellSummaryTable}}
Summoning the power of the natural world, you transform the targets into a herd of mammoths, and they each assume a Huge battle form.
Each target must have enough space to expand into or the spell fails for that target.
Each target gains the <<tag Animal>>trait.
Each target can [[Dismiss]] the spell’s effects on themself.
{{BattleFormRestrictions}}
Each target gains the following while transformed:
* AC = 22 + the target’s level. Ignore any armor check penalty and Speed reduction.
* 20 temporary Hit Points.
* Speed 40 feet.
* [[Low-Light Vision]].
* The following unarmed melee attacks, which are the only attacks the target can use. They’re trained with them. When attacking with these attacks, the target uses their attack modifier with the proficiency and item bonuses of their most favorable weapon or unarmed [[Strike]], and the damage is listed for each attack. These attacks are [[Strength]] based (for the purpose of the enfeebled condition, for example). If the target’s unarmed attack modifier is higher, they can use it instead.
''Melee'' {{OneAction}} tusk (reach 15 feet), Damage 4d8+19 piercing;
''Melee'' {{OneAction}} trunk (agile, reach 15 feet), Damage 4d6+16 bludgeoning;
''Melee'' {{OneAction}} foot (agile, reach 15 feet), Damage 4d6+13 bludgeoning.
* [[Athletics]] modifier of +30, unless the target’s own modifier is higher.
* ''Trample'' {{ThreeAction}} You move up to twice your Speed and move through the space of Large or smaller creatures, trampling each creature whose space you enter. A trampled creature takes damage from its foot Strike based on a basic [[Reflex]] save (DC = 19 + the target’s level).
You command the most potent primal magic and can cast a spell of truly incredible power.
You gain a single 10th-level spell slot and can prepare a spell in that slot using primal spellcasting.
Unlike with other spell slots, you don’t gain more 10th-level spells as you level up.
__You can’t use this spell slot for abilities that let you cast spells without expending spell slots or that give you more spell slots.__
{{||SpellSummaryTable}}
You request a direct intercession from the natural world.
Nature always refuses unnatural requests and might grant a different request (potentially more powerful or better fitting its character) than the one you asked for.
A primal phenomenon spell can do any of the following things.
* Duplicate any primal spell of 9th level or lower.
* Duplicate any non-primal spell of 7th level or lower.
* Produce any effect whose power level is in line with the above effects.
* Reverse certain effects that refer to the [[Wish]] spell.
At the GM’s discretion, you can try to use primal phenomenon to produce greater effects than these, but doing so may be dangerous, or the spell may have only a partial effect.
''Primal spells that can be duplicated:''
<$list filter="[tag[Spell]tag[Primal]]" variable="spell">
<$list filter="[<spell>get[m-level]compare:number:lteq[9]]">
<$link to=<<spell>> />,
</$list>
</$list>
''Non-Primal spells that can be duplicated:''
<$list filter="[tag[Spell]!tag[Primal]]" variable="spell">
<$list filter="[<spell>get[m-level]compare:number:lteq[7]]">
<$link to=<<spell>> />,
</$list>
</$list>
{{||SpellSummaryTable}}
You enhance a summoned creature with the power of the elements.
If your next action is to cast either [[Summon Animal]] or [[Summon Plant or Fungus]], choose air, earth, fire, or water, and the creature you summon gains the corresponding abilities.
* ''Air'' The creature gains a fly Speed of 60 feet.
* ''Earth'' The creature gains a burrow Speed of 20 feet, reduces its land Speed by 10 feet (minimum 5 feet), and gains resistance 5 to physical damage.
* ''Fire'' The creature’s attacks deal 1d6 extra fire damage, and it gains resistance 10 to fire and weakness 5 to cold and water.
* ''Water'' The creature gains a swim Speed of 60 feet, can spend 1 action after a melee attack to attempt a [[Shove]] (ignoring multiple attack penalty), and gains resistance 5 to fire.
Your reservoir of Focus Points is a deep wellspring.
If you have spent at least 3 Focus Points since the last time you Refocused, you recover 3 Focus Points when you [[Refocus]] instead of 1.
This sprig of berry-festooned holly and mistletoe doesn’t wilt or rot.
It can be used as a primal focus, and it also grants the creature holding it a +1 item bonus to [[Nature]] checks.
''Activate'' {{TwoAction}} [[Interact]]; ''Frequency'' once per 10 minutes; ''Effect'' You squeeze juice from one of the berries and smear it onto a non-magical club or staff to cast [[Shillelagh]] upon it.
''Activate'' {{TwoAction}} [[Interact]]; ''Frequency'' once per day; Effect You twine the sprig around the wrist of one hand and touch a tree to cast [[Tree Shape]] upon yourself, except instead of a becoming a tree, you become a vine on the touched tree..
Greater Primeval Mistletoe gives a +2 bonus and can be activated in one additional way:
''Activate'' {{TwoAction}} [[Interact]]; ''Frequency'' once per day; ''Effect'' You plant the greater primeval mistletoe into an area of natural earth or stone. Once planted, the plant immediately sprouts into an area of holly bushes that don’t impede movement and that pulse with positive energy, replicating the effects of a [[Field of Life]] spell. This lasts for up to 1 minute, as long as you continue to [[Sustain the Activation|Sustain a Spell]]. When this magic ends, the holly bushes revert back into the original greater primeval mistletoe.
{{||SpellSummaryTable}}
You create a seven-layered sphere to protect an area.
This multicolored sphere functions like a [[Prismatic Wall]] but is shaped in a 10-foot [[Burst]] centered on a corner of your space.
You must form the sphere in an unbroken open space so its edges don’t pass through any creatures or objects, or the spell is lost.
{{||SpellSummaryTable}}
A spray of rainbow light beams cascades from your open hand.
Each creature in the area must roll 1d8 on the table below to see which beam affects it, then attempt a saving throw of the indicated type.
The table notes any additional traits that apply to each type of ray.
If a creature is struck by multiple beams, it uses the same d20 result for all its saving throws.
For all rays, a successful saving throw negates the effect for that creature.
| !1d8 | !Color | !Save | !Effect (Traits) |
| 1 | Red | [[Reflex]] |50 <<tag Fire>>damage |
| 2 | Orange | [[Reflex]] |60 <<tag Acid>>damage |
| 3 | Yellow | [[Reflex]] |70 <<tag Electricity>> damage |
| 4 | Green | [[Fortitude]] |30 <<tag Poison>>damage and [[Enfeebled]] 1 for 1 minute |
| 5 | Blue | [[Fortitude]] |Affected as if by [[Flesh to Stone]] |
| 6 | Indigo | [[Will]] |[[Confused]], as the [[Warp Mind]] spell (<<tag Mental>>) |
| 7 | Violet | [[Will]] |[[Slowed]] 1 for 1 minute; if a critical failure, sent to another plane, as [[Plane Shift]] (<<tag Teleportation>>) |
| 8 | Potent beam | - |Affected by two beams—roll beam twice, rerolling any duplicates or results of 8. |
{{||SpellSummaryTable}}
You create an opaque wall of shimmering, multicolored light.
The wall is straight and vertical, stretching 60 feet long and 30 feet high.
You must form the wall in an unbroken open space so its edges don’t pass through any creatures or objects, or the spell is lost.
You can pass through the wall and ignore its effects. //You can ignore the effects of passing through the wall, but it still blocks your spells, missiles, etc.//
The wall sheds bright light out to 20 feet on each side (and dim light to the next 20 feet).
Creatures other than you that come into the wall’s light must attempt a [[Will]] save; they’re [[Dazzled]] for 1 round on a success, [[Blinded]] for 1 round on a failure, and blinded for 1 minute on a critical failure. They are then temporarily immune to the blinding effect for 1 hour.
A prismatic wall has seven different layers, each a different color. Red, orange, yellow, and green have the effect of a 5th-level [[Chromatic Wall]] spell of that color, and the others have the effect of a 7th-level chromatic wall spell of that color.
A creature that tries to pass through the wall must attempt a saving throw against each component wall. The effects take place simultaneously, so a creature turned to stone by the blue wall is still treated as a creature for the indigo and violet walls.
The wall as a whole is immune to counteracting effects of the wall’s level or lower; each color must be counteracted by its specific spell, as described in chromatic wall. This must be done in order (red, orange, yellow, green, blue, indigo, then violet). A given color can’t be affected until the previous color is counteracted. Counteracting a color wall removes that color’s effect from the wall, and counteracting them all ends prismatic wall.
//The wall as a whole can still be counteracted with a counteracting effect higher than the wall's level.//
You can Dismiss the spell.
//The effects are as follows://
{{ChromaWall14}}
{{ChromaWall57}}
Your verdant weapon can cut through the resistances of magical creatures.
The weapon is treated as cold iron and silver.
If you critically hit a creature that has a weakness to cold iron or silver, the target takes 1d6 persistent bleed damage as the primal energies within your weapon slow its natural healing.
{{||SpellSummaryTable}}
From outside, the area looks like a bank of impenetrable black fog.
Sensory stimuli (such as sounds, smells, and light) don’t pass from inside the area to outside the area.
<<tag Scrying>> spells can’t perceive any stimuli from the area, and mind-reading effects don’t work in the area.
{{||SpellSummaryTable}}
A small ball of flame appears in the palm of your hand, and you lash out with it either in melee or at range.
Make a spell attack roll against your target’s AC.
This is normally a ranged attack, but you can also make a melee attack against a creature in your unarmed reach.
On a success, you deal 1d4 <<tag Fire>>damage plus your spellcasting ability modifier.
On a critical success, the target takes double damage and 1d4 [[persistent|Persistent Damage]] <<tag Fire>>damage.
''Heightened (+1)'' Increase the damage by 1d4 and the persistent damage on a critical hit by 1d4.
{{||SpellSummaryTable}}
You project an illusory image of yourself.
You must stay within range of the image, and if at any point you can’t see the image, the spell ends.
Whenever you [[Cast a Spell]] other than one whose area is an [[Emanation]], you can cause the spell effect to originate from either yourself or the image.
Because the image is an illusion, it can’t benefit from spells, though visual manifestations of the spell appear.
The image has the same AC and saves as you.
If it is hit by an attack or fails a save, the spell ends.
''Heightened (+2)'' The maximum duration you can Sustain the Spell increases to 10 minutes.
Where others etch their armor to serve as a conduit for their imaginations, your vivid mind and bold personality allow you to project a more fitting persona over your lackluster armor.
You change the shape and appearance of your armor to appear as ordinary or fine clothes of your imagining.
The armor’s statistics don’t change.
This effect lasts as long as you remain conscious and are wearing the armor.
A creature can disbelieve the illusion by [[Seek]]ing or touching your armor. The DC equals your [[Will]] DC.
You’re lying on the ground.
You are [[Flat-Footed]] and take a –2 circumstance penalty to attack rolls. //(You aren't Flat-Footed while Prone if you have [[Nimble Crawl]] and are legendary in [[Acrobatics]].)//
The only <<tag Move>>actions you can use while you’re prone are [[Crawl]] and [[Stand]].
Standing up ends the prone condition.
You can [[Take Cover]] while prone to hunker down and gain __Greater Cover__ against ranged attacks, even if you don’t have an object to get behind, gaining a +4 circumstance bonus to AC against ranged attacks (but you remain flat-footed).
If you would be knocked prone while you’re [[Climb]]ing or [[Fly]]ing, you [[Fall]]. You can’t be knocked prone when [[Swim]]ming.
//You can use an action to voluntarily [[Drop Prone]].//
//You usually fall prone if knocked [[Unconscious]].//
//You can [[Kip Up]] to stand as a free action. This isn't a Move action, so it doesn't break the rule above.//
You add half your [[Strength]] modifier (if positive) to damage rolls with a propulsive ranged
weapon.
If you have a negative Strength modifier, you add your full Strength modifier instead //(which will reduce the damage, because you are adding a negative number)//.
{{||SpellSummaryTable}}
You ward a creature against a specified alignment. Choose <<tag Chaotic>>, <<tag Evil>>, <<tag Good>>, or <<tag Lawful>> when you cast this spell.
The target gains a +1 status bonus to Armor Class and saving throws against creatures and effects of the chosen alignment.
This bonus increases to +3 against effects from such creatures that would directly control the target and against attacks made by <<tag Summoned>> creatures of the chosen alignment.
This spell gains the trait that opposes the alignment you chose—if you choose chaos, this spell gains the lawful trait, and vice versa; if you choose evil, this spell gains the good trait, and vice versa.
{{||SpellSummaryTable}}
You ward a creature against a specified alignment.
Choose <<tag Chaotic>>, <<tag Evil>>, <<tag Good>>, or <<tag Lawful>> when you cast this spell.
The target gains a +1 status bonus to Armor Class and saving throws against creatures and effects of the chosen alignment.
This bonus increases to +3 against effects from such creatures that would directly control the target and against attacks made by <<tag Summoned>> creatures of the chosen alignment.
This spell gains the trait that opposes the alignment you chose—if you choose chaos, this spell gains the lawful trait, and vice versa; if you choose evil, this spell gains the good trait, and vice versa.
When you lash out with your clan dagger, you keep its sheath close at hand.
When you use [[Clan's Edge]], if the hand you’re not holding the dagger with is empty, you can use your clan dagger’s sheath to block attacks as well.
The circumstance bonus to your AC from parrying increases to a +2 against any target you hit with a [[Strike]] this turn.
Your nanites can augment your defenses.
You can choose to activate [[Nanite Surge]] when you attempt a saving throw, instead of when you attempt a skill check. If you do, you gain a +2 status bonus to the triggering saving throw.
{{||SpellSummaryTable}}
You emanate a shimmering aura of protective magic.
You and any allies in the area gain a +1 status bonus to [[AC]].
Each time you [[Sustain the Spell|Sustain a Spell]], the emanation’s radius increases by 5 feet, to a maximum of 30 feet.
{{||SpellSummaryTable}}
''Trigger'' An ally within 30 feet takes damage.
You protect your ally by suffering in their stead.
Reduce the damage the triggering ally would take by 3.
You redirect this damage to yourself, but your immunities, weaknesses, resistances and so on do not apply.
You aren’t subject to any conditions or other effects of whatever damaged your ally (such as poison from a venomous bite). Your ally is still subject to those effects even if you redirect all of the triggering damage to yourself.
''Heightened (+1)'' The damage you redirect increases by 3.
//This focus spell can be gained through the [[Protection (Domain)]].//
{{||SpellSummaryTable}}
A protective aura emanates out from you, safeguarding you and your allies.
You gain resistance 3 to all damage.
Your allies also gain this resistance while they are within the area.
''Heightened (+1)'' The resistance increases by 1.
Implied by //Tangling Creepers//.
Once per round, you can make a vine lash out from any square within the expanse of creepers by using a single action, which has the concentrate trait.
You’re unnaturally in tune with your surroundings and react instinctively to danger.
You gain a +2 circumstance bonus to [[Perception]] checks made as initiative rolls.
{{||SpellSummaryTable}}
You create an invisible, floating eye, 1 inch in diameter, at a location you can see within 500 feet.
It sees in all directions with your normal visual senses and continuously transmits what it sees to you.
The first time you [[Sustain the Spell|Sustain a Spell]] each round, you can either move the eye up to 30 feet, seeing only things in front of the eye, or move it up to 10 feet, seeing everything in all directions around it.
There is no limit to how far from you the eye can move, but the spell ends immediately if you and the eye ever cease to be on the same plane of existence.
You can attempt [[Seek]] actions through the eye if you want to attempt [[Perception]] checks with it.
Any damage dealt to the eye destroys it and ends the spell.
//Implied by [[Prying Survey]].//
As a single action, which has the concentrate trait, you can concentrate on a location within the area that an eye can reach. An eye travels to that location, and you Seek visually as if you were there.
//Implied by [[Prying Survey]].//
As an exploration activity, you can travel at half speed while continuing to concentrate on the eyes to gain the benefits of both the Scout and Search activities. With the eyes, you can check everything even if you are traveling faster than 300 feet per minute.
{{||SpellSummaryTable}}
You create eight invisible, floating eyes, each about 3 inches in diameter, that scan the area around you, transmitting rough impressions of the environment.
The eyes constantly examine and send you summaries of their findings. They are solid and can’t move through barriers, and they don’t follow routes that they fail to find while [[Search]]ing.
Any damage to an eye destroys it. When all eyes are destroyed, the spell ends.
As a single action, which has the <<tag Concentrate>> trait, you can concentrate on a location within the area that an eye can reach. An eye travels to that location, and you [[Seek]] visually as if you were there.
As an exploration activity, you can travel at half speed while continuing to concentrate on the eyes to gain the benefits of both the [[Scout]] and [[Search]] activities.
With the eyes, you can check everything even if you are traveling faster than 300 feet per minute. The eyes use your [[Perception]] modifier.
You can have only one prying survey in effect at a time.
''Heightened (10th)'' The area increases to a 500-foot emanation.
{{||SpellSummaryTable}}
You tap into the zeitgeist of the nearest settlement in range (if any).
You learn the name of the settlement, and you can utter a special word to learn a brief summary of one significant event happening in the settlement.
Choose one of the following words, which indicates the type of people involved and type of event you learn about.
* ''Wardens'' city guards, barristers, and judges (criminal reports, busts, changes in routines, legal trials)
* ''Titles'' nobles and politicians (high society weddings, elite soirees, political rallies)
* ''Masses'' common folk and merchants (gathering mobs, major sales)
When uttering your word, you can exclude events you already know about, whether you know about them from this spell or from other experiences.
If you cast pulse of the city again within 24 hours, you can say “echo” instead of another word to get an update on the event you learned about the last time you Cast the Spell.
Pulse of the city reveals only publicly available or observable information. You never learn clandestine movements or other details people are specifically trying to hide.
The spell is also notoriously bad at overcoming magic meant to avoid detection; it automatically fails to reveal information about events involving creatures, places, or objects affected by spells that could prevent or counteract pulse of the city (such as [[Nondetection]]).
''Heightened (5th)'' The range increases to 100 miles.
{{||SpellSummaryTable}}
A spray of heavy rocks flies through the air in front of you.
The rubble deals 2d4 bludgeoning damage to each creature in the area //with a basic Reflex save//.
//Creatures who fail their Reflex save are also pushed 5 foot away from you. Creatures who critically fail are pushed 10 foot.//
{{||SpellSummaryTable}}
Violent winds and a powerful downdraft fill the area, forming a cyclone.
All flying creatures in the area descend 40 feet.
The entire area is [[Greater Difficult Terrain|Difficult Terrain]] for Flying creatures, and difficult terrain for creatures on the ground or [[Climb]]ing.
Any creature that ends its turn Flying within the area descends 20 feet.
Any creature pushed into a surface by this spell’s winds takes bludgeoning damage as though it had [[fall|Falling]]en.
The squares at the outside vertical edges of the cylinder prevent creatures from leaving. These squares are greater difficult terrain, and a creature attempting to push through must succeed at an [[Athletics]] check or [[Acrobatics]] check to [[Maneuver in Flight]] against your spell DC to get through. A creature that fails ends its current action but can try again.
''Frequency'' once per day
You call on your celestial forebears to rid your body of all toxins and impurities.
For each disease or poison currently affecting you, attempt a [[Religion]] check to [[Counteract]] that disease or poison.
As normal, your counteract level is equal to half your level, rounded up.
{{||SpellSummaryTable}}
You remove toxins and contaminations from food and drink, making them safe to consume.
This spell doesn’t prevent future contamination, natural decay, or spoilage.
One cubic foot of liquid is roughly 8 gallons.
{{||SpellSummaryTable}}
You replicate the attack of a deadly purple worm.
You deal 6d6 piercing damage to the touched creature and afflict it with purple worm venom.
The target must attempt a [[Fortitude]] save.
{{||SaveSuccessTable}}
''Purple Worm Venom (poison)''; Level 11; Maximum Duration 6 rounds. Stage 1 3d6 poison damage and [[Enfeebled]] 2 (1 round); Stage 2 4d6 poison damage and [[Enfeebled]] 2 (1 round); Stage 3 6d6 poison damage and [[Enfeebled]] 2 (1 round).
Venom from enormous purple worms leaves a victim weakened.
| !Saving Throw |DC 32 [[Fortitude]] |
| !Onset |Immediate |
| !Maximum Duration |6 rounds |
| !Stage 1 |5d6 poison damage and [[Enfeebled]] 2 (1 round) |
| !Stage 2 |6d6 poison damage and [[Enfeebled]] 2 (1 round) |
| !Stage 3 |8d6 poison damage and [[Enfeebled]] 2 (1 round) |
''Frequency'' Once per 10 minutes.
You spend 1 minute examining the details of one potential clue, designating the subject related to that clue as the target of your active investigation.
This subject is typically a single creature, item, or small location (such as a room or corridor), but the GM might allow a different scope for your investigation. You don’t need to know the identity, purpose, or nature of the subject, but you do need to be aware of its existence. For instance, finding a footprint is enough to investigate the creature that left it, and seeing a hasty sketch of an item or location can be enough to start your investigation of that subject.
Whenever you attempt a [[Perception]] or skill check to investigate a designated subject, you gain a +1 circumstance bonus to the check. The exact checks this applies to depend on the actions you use to investigate and are determined by the GM, but checks to investigate are typically [[Perception]] checks or skill checks that use [[Intelligence]], [[Wisdom]], or [[Charisma]].
You can maintain two active investigations at a time. If you Pursue another Lead after that, the subject must be different from any of your current investigations (or rather, they must be different as far as you know), and you give up on a current subject of your choice.
Once you’ve given up pursuit of a subject, you can’t Pursue that Lead again until after the next time you make your daily preparations.
''Requirements'' The monster’s last action was a success with a [[Strike]] that lists Push in its damage entry.
The monster automatically knocks the target away from the monster.
Unless otherwise noted in the ability description, the creature is pushed 5 feet.
If the attack was a critical hit, this distance is doubled.
{{||SpellSummaryTable}}
Giving the air a push, you buffet the target with a powerful gust of wind; it must attempt a [[Fortitude]] save.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You turn a fire into either a burst of blinding fireworks or a thick cloud of choking smoke, chosen when you Cast the Spell. The spell targets one fire source, which is immediately extinguished if it is a non-magical fire the size of a campfire or smaller.
If the fire source is a creature, the creature takes 1d6 points of cold damage and is not extinguished.
''Fireworks'' The targeted fire explodes into a colorful array of flashy, fiery, glowing aerial fireworks in a 20-foot-radius burst. The first time you Sustain the Spell each round, you can cause the area of fireworks to ascend up to 20 feet, but you cannot move the area laterally. Creatures that start their turn within the area of the fireworks must attempt a [[Fortitude]]
save, and are then temporarily immune for 1 minute.
''Smoke Cloud'' Thick smoke billows out from the fire and coalesces into a cloud that spreads to fill a 20-foot-radius [[Burst]] centered on the targeted fire. Creatures within the smoke cloud take a –4 circumstance penalty to visual [[Perception]] checks, and creatures outside the smoke cloud take a –4 circumstance penalty to visual Perception checks to detect creatures or objects within it. The first time you Sustain the Spell each round, you can cause the smoke cloud to descend up to 20 feet, but you cannot move the area laterally. Creatures that start their turn within the smoke cloud must attempt a [[Fortitude]] save, and are then temporarily immune for 1 minute.
{{||SaveSuccessTable}}
You’ve deeply studied the secrets of your blood and can force reality to act against its own wishes.
You can cast [[Blur]] and [[Silence]] once per day each as 2nd-level divine innate spells.
{{LOCGFeat}}
You grew up among tribes, with the spirits watching over you, and they offer you guidance.
You gain the trained proficiency rank in the //one of the skills listed below// (or another skill of your choice, if you’re already trained in that skill). You gain the [[Assurance]] skill feat in that skill, as the spirits’ help guides your actions.
[[Religion]], [[Athletics]], [[Nature]], [[Diplomacy]], [[Intimidation]], [[Medicine]], [[Acrobatics]].
''Frequency'' once per 10 minutes
You stomp the ground with such force that it creates a minor earthquake, with the effects of the [[Earthquake]] spell.
{{||SpellSummaryTable}}
You cause the air in the area to become supersaturated with water vapor.
Non-magical fires within the area are automatically extinguished.
<<tag Fire>>creatures within the area take 4d8 damage (basic [[Fortitude]] save).
Choose one magical fire, fire spell, or fire item in the area and attempt to [[Counteract]] it.
If you succeed against an item, the item loses its fire properties for 10 minutes (for instance, a +1 [[Flaming]] longsword would become a +1 longsword). If the target is an artifact or similarly powerful item, you automatically fail to counteract it.
When you [[Sustain this Spell|Sustain a Spell]], you can move the area of vapor anywhere within range, but the only effect when you do so is to automatically extinguish non-magical fires.
If you have the [[Counterspell]] reaction, you can use quench to counter any spell with the fire trait instead of needing to have the triggering fire spell prepared or in your repertoire.
''Heightened (+1)'' Increase the damage to fire creatures by 2d8.
''Cost'' 1 batch of Infused Reagents
''Requirements'' Alchemist's Tools, the formula for the item you're creating, and a free hand.
You swiftly mix up a short-lived alchemical item to use at a moment’s notice.
You create a single alchemical item of your advanced alchemy level or lower that’s in your formula book without having to spend the normal monetary cost in alchemical reagents or needing to attempt a [[Crafting]] check.
This item has the <<tag Infused>>trait, but it remains potent only until the start of your next turn.
You can block with your shield instinctively.
At the start of each of your turns, you gain an additional reaction that you can use only to perform a [[Shield Block]].
You keep your bombs in easy-to-reach pouches from which you draw without thinking.
You [[Interact]] to draw a bomb, then [[Strike]] with it.
''Trigger'' You roll initiative.
Your instincts kick in and you take on an aggressive stance.
You use [[Change Shape]] to enter your hybrid form or a new form granted by a beastkin feat.
You can shift between your identities with ease.
Instead of spending 1 minute to change your identity, you can now do so as a 3-action activity.
If you are legendary in [[Deception]], you can perform this change as a 1-action activity.
''Prerequisites'' Master in [[Athletics]].
When [[Climb]]ing, you move 5 more feet on a success and 10 more feet on a critical success, to a maximum of your Speed.
If you’re legendary in Athletics, you gain a climb Speed equal to your Speed.
''Prerequisites'' Trained in [[Intimidation]].
You can bully others with just a few choice implications.
You can [[Coerce]] a creature after 1 round of conversation instead of 1 minute.
You still can’t Coerce a creature in the midst of combat, or without engaging in a conversation.
''Prerequisites'' [[Connections]] or [[Underworld Connections]].
You know where to go, who to talk to, and how to make new connections, fast.
Upon entering a new settlement, spending 1 day of downtime allows you to build enough connections to make use of the [[Connections]] or [[Underworld Connections]] feats.
If you’re legendary in Society, you can form the required connections within 1 hour of entering a new settlement.
''Prerequisites'' Expert in [[Deception]].
You can set up a disguise in half the usual time (generally 5 minutes).
If you’re a master, it takes one-tenth the usual time (usually 1 minute).
If you’re legendary, you can create a full disguise and [[Impersonate]] as a 3-action activity.
You draw your weapon and attack with the same motion.
You [[Interact]] to draw a weapon, then [[Strike]] with that weapon.
You can attach a talisman using only a bit of glue and some string.
You gain the [[Rapid Affixture]] skill feat, even if you don’t meet the prerequisites.
When you use it, you can affix or remove up to four talismans in 1 minute instead of just one.
You gain the ability to Affix a Talisman as a 3-action activity from that feat at 12th level, regardless of your Crafting proficiency.
''Prerequisites'' Trained in [[Arcana]], [[Nature]], [[Occultism]] or [[Religion]].
You can [[Identify Magic]] swiftly.
You take only 1 minute when using Identify Magic to determine the properties of an item, ongoing effect, or location, rather than 10 minutes.
If you’re a master, it takes a 3-action activity, and if you’re legendary, it takes 1 action.
When you start to [[Juggle]] or add another item to those you are Juggling, you add two items instead of one.
Increase the maximum number of items you can Juggle by one.
''Prerequisites'' Trained in [[Athletics]].
You can use [[High Jump]] and [[Long Jump]] as a single action instead of 2 actions.
If you do, you don’t perform the initial [[Stride]], nor do you fail if you don’t Stride 10 feet.
''Requirements'' You are adjacent to a creature that is at least one size larger than you and is willing to be your mount.
You and your mount can spring into action at a moment’s notice.
You [[Mount]] the creature and [[Command an Animal]] to issue it an order of your choice.
You recover from your Rage quickly, and are soon ready to begin anew.
After you spend a full turn without raging, you can [[Rage]] again without needing to wait 1 minute.
''Prerequisites'' Master in [[Arcana]], [[Nature]], [[Occultism]], or [[Religion]]; [[Recognize Spell]].
You [[Recognize Spell]]s swiftly.
Once per round, you can Recognize a Spell using a skill in which you’re a master as a free action.
''Prerequisites'' Trained in [[Crafting]].
You take 1 minute to [[Repair]] an item.
If you’re a master in Crafting, it takes 3 actions.
If you’re legendary, it takes 1 action.
''Requirements'' You are [[flanked|Flanking]] by at least two enemies.
You turn your foes’ flanking against them with a quick reverse.
Make a melee [[Strike]] against one of the flanking enemies and make a second Strike with the same weapon or unarmed attack against a different enemy that is flanking you.
This second Strike has the same multiple attack penalty of the initial attack and doesn’t count toward your multiple attack penalty.
You can bring your shield into place with hardly a thought.
At the start of each of your turns, you gain an additional reaction that you can use only to [[Shield Block]].
You draw your bow and attack with the same action.
You [[Interact]] to draw a weapon from the bow weapon group that is loaded or has reload 0, then [[Strike]] with that weapon.
You can rig a snare in only moments.
You can [[Craft]] snares that normally take 1 minute to Craft with 3 [[Interact]] actions, even if you haven’t prepared them.
''Prerequisites'' Trained in [[Acrobatics]].
You [[Squeeze]] 5 feet per round (10 feet on a critical success).
If you’re legendary in Acrobatics, you Squeeze at full Speed.
''Frequency'' Once per round.
You are adept at quickly moving items into your cheek pouches.
You [[Interact]] to store one held item in your cheek pouches (provided it fits).
During your daily preparations, you can study a particular subject to gain the trained proficiency rank in one [[Lore]] skill of your choice.
You must have interacted with that subject in some way on the previous day, whether by reading about it, talking to someone knowledgeable on the topic, or experiencing it yourself.
Alternatively, you can reference your notes to instead choose a Lore skill you’ve prepared before with Quick Study.
This proficiency lasts until you prepare again.
Since this proficiency is temporary, you can’t use it as a prerequisite for a skill increase or a permanent character option like a feat.
''Prerequisites'' Master in [[Athletics]].
You [[Swim]] 5 feet farther on a success and 10 feet farther on a critical success, to a maximum of your Speed.
If you’re legendary in Athletics, you gain a swim Speed equal to your Speed.
''Cost'' 1 versatile vial.
''Requirements'' You know the formula for the alchemical item you’re creating, you are holding or wearing alchemist’s tools, and you have a free hand.
You quickly brew up a short-lived tincture.
You create a single alchemical elixir or tool of your level or lower without having to spend the normal monetary cost in alchemical reagents or needing to attempt a [[Crafting]] check.
This item has the <<tag Infused>> trait, but it remains potent only until the end of the current turn.
''Prerequisites'' Master in [[Thievery]].
You can [[Pick a Lock]] using 1 action instead of 2.
''Frequency'' once per turn
You’ve replaced your heart with one made of animated quicksilver and living adamantine.
You reduce your [[Slowed]] condition by 1.
Alternatively, if you are not slowed, you are [[Quickened]] 1 during your next turn, and can use your extra action to [[Stride]] or [[Strike]].
You gain 1 additional action at the start of your turn each round. Many effects that make you quickened specify the types of actions you can use with this additional action.
If you become quickened from multiple sources, you can use the extra action you’ve been granted for any single action allowed by any of the effects that made you
quickened. //(But you don't gain more extra actions, just more options with the one you have.)//
Because quickened has its effect at the start of your turn, you don’t immediately gain actions if you become quickened during your turn.
''Frequency'' Once per day.
If your next action is to cast a cantrip or a spell __from the class that gave you this feat__ that is at least 2 levels lower than the highest level spell __of that class__ you can cast, reduce the number of actions to cast it by 1 (minimum 1 action).
Your features become thin and angular. You become swifter and nimbler, but your body also becomes fragile.
''Benefit'' You gain an item bonus to [[Acrobatics]] checks, [[Stealth]] checks, [[Thievery]] checks, [[Reflex]] saves, and [[Dexterity]]-based attack rolls, and you gain the listed status bonus to your Speed.
''Drawback'' You take damage equal to twice your level; you can’t recover Hit Points lost in this way by any means while the mutagen lasts. You take a –2 penalty to [[Fortitude]] saves.
| !Type | !Level | !Price | !Roll Bonus | !Speed Bonus | !Duration |
| Lesser | 1 | 40 | +1 | +5' | 1 minute |
| Moderate | 3 | 120 | +2 | +10' | 10 minutes |
| Greater | 11 | 3000 | +3 | +15' | 1 hour |
| Major | 17 | 30000 | +4 | +20' | 1 hour |
''Prerequisites'' Expert in [[Stealth]].
You’re skilled at moving with a group.
When you are [[Avoiding Notice|Avoid Notice]] and your allies [[Follow the Expert]], you and those allies can roll a single Stealth check, using the lowest modifier, instead of rolling separately.
This doesn’t apply for [[Initiative]] rolls.
{{||SpellSummaryTable}}
Make a melee unarmed Strike. If you hit and the target is alive, anytime during the duration, you can spend a single action, which has the <<tag Auditory>> and <<tag Concentrate>> traits, to speak a word of death that could instantly slay it.
The target must attempt a [[Fortitude]] save.
{{||SaveSuccessTable}}
If you cast quivering palm again, the effects of any quivering palm you had previously cast end.
''Heightened (+1)'' The damage increases by 10 on a failure, or 5 on a success.
Your companion races.
It gains a +10-foot status bonus to its Speed, swim Speed, or fly Speed (your choice).
Its proficiency in [[Fortitude]] saves increases to legendary, and its [[Constitution]] modifier increases by 1.
''Prerequisites'' [[Divine Ally]] (blade).
Your divine ally turns your chosen weapon into a paragon of its type.
When you choose the weapon for your blade divine ally during your preparations, add the following property runes to the list of effects you can choose from: [[Dancing]], [[Greater Disrupting]], and [[Keen]].
''Prerequisites'' [[Divine Ally]] (blade).
Your divine ally radiates power, enhancing your chosen weapon.
When you choose the weapon for your blade ally during your daily preparations, add the following property runes to the list of effects you can choose from: [[Flaming]] and any aligned properties ([[Anarchic]], [[Axiomatic]], [[Holy]], or [[Unholy]]) that match your cause’s alignment.
''Frequency'' once per day
Your skin glows with intensity.
Creatures within 10 feet who can see you must succeed at a [[Fortitude]] save against your class DC or spell DC, whichever is higher.
{{||SaveSuccessTable}}
Your biological circuitry emits light like a torch, casting bright light in a 20-foot radius (and [[Dim Light]] for the next 20 feet).
The light shuts off when you take this action again or are knocked [[Unconscious]].
''Prerequisites'' good alignment, healing font.
You pour invigorating positive energy into a living ally.
If the next action you use is to cast [[Heal]] to restore Hit Points to a single living creature, the target deals an additional 1d6 positive damage with its melee weapons and unarmed attacks until the end of its next turn.
If the heal spell is at least 5th level, this damage increases to 2d6, or 3d6 if the spell is at least 8th level.
Your inherent glory radiates into the world with all the divine power of the celestial planes for 1 minute.
Any creature that can see you while you Radiate Glory must attempt a [[Will]] saving throw against your class DC or spell DC, whichever is higher.
The creature then becomes temporarily immune to this effect for 24 hours.
{{||SaveSuccessTable}}
''Requirements'' You aren’t [[Fatigued]] or raging //and you haven't raged in the past minute.//
You tap into your inner fury and begin raging.
You gain a number of temporary Hit Points equal to your level plus your [[Constitution]] modifier.
This frenzy lasts for 1 minute, until there are no enemies you can perceive, or until you fall [[Unconscious]], whichever comes first.
You can’t voluntarily stop raging.
While you are raging:
* You deal 2 additional damage with melee weapons and unarmed attacks. This additional damage is halved if your weapon or unarmed attack is <<tag Agile>>.
* You take a –1 penalty to [[AC]].
* You can’t use actions with the <<tag Concentrate>>trait unless they also have the <<tag Rage>> trait. You can [[Seek]] while raging.
After you stop raging, you lose any remaining temporary Hit Points from Rage, and you can’t Rage again for 1 minute.
You can't use actions with the <<tag Rage>> trait unless you're raging, and they end automatically when you stop raging.
''Prerequisites'' expert in [[Athletics]].
Physical obstacles can’t hold back your fury.
While you are raging, you gain a climb Speed and swim Speed equal to your land Speed and the DC of [[High Jump]]s and [[Long Jump]]s decreases by 10.
__Your distance for a vertical [[Leap]] increases to 5 feet vertically, and your distance for a horizontal [[Leap]] increases to 15 feet if your Speed is at least 15 feet and to 20 feet if your Speed is at least 30 feet.__
Your fury fills your foes with fear.
While you are raging, your [[Demoralize]] and [[Scare to Death]] actions gain the <<tag Rage>> trait, allowing you to use them while raging.
As soon as you meet the prerequisites for the skill feats [[Intimidating Glare]] and [[Scare to Death]], you gain these feats.
Repeated exposure and toughened skin allow you to fend off harm.
While raging, you gain resistance equal to 3 + your [[Constitution]] modifier to damage types based on your instinct.
Thrown weapons become especially deadly in your fury.
You apply the additional damage from [[Rage]] to your thrown weapon attacks.
If you have the [[Brutal Critical]] feat or the [[Devastator]] class feature, apply their benefits to thrown weapon attacks.
You surround yourself in a mantle of Rain-Scribe magic and [[Stride]] twice; [[Difficult Terrain]] does not reduce your Speed, even if the difficult terrain has been manipulated by magic.
Your magic clears the difficult terrain in each square you entered; until your next turn, those squares aren’t difficult terrain for any creature walking through them (or are normal difficult terrain if they were previously greater difficult terrain).
You use the power of your Rain-Scribe magic to draw on a stream of primal power for sustenance.
You don’t need to eat or drink and need only 6 hours of rest to feel well rested.
You must still rest at least 8 hours and spend 1 hour of preparation to regain resources usable only a limited number of times per day, such as spell slots.
You can draw on primal power to stay awake and alert while otherwise resting your body and mind, gaining the full benefits of an 8-hour rest without falling asleep. When you do, you lose the other benefits of Rain-Scribe Sustenance for 1 week while your primal energies recharge.
You gain a +2 circumstance bonus to [[Athletics]] checks to [[Climb]] or [[Swim]] and a +1 circumstance bonus to saving throws against [[Disease]]s.
''Requirements'' You are wielding a [[Shield]].
You position your shield to protect yourself.
When you have Raised a Shield, you gain its listed circumstance bonus to [[AC]].
Your shield remains raised until the start of your next turn.
{{||SpellSummaryTable}}
''Cost'' Diamonds worth a total value of the target's level (minimum 1) * 200 gp.
You attempt to call forth the dead creature’s soul, requiring the creature’s body to be present and relatively intact.
The creature must have died within the past 3 days.
If the gods have decided that the creature’s time has come (at the GM’s discretion), or if the creature doesn’t wish to return to life, this spell automatically fails, but the diamonds aren’t consumed in the casting.
If the spell is successful, the creature returns to life with 1 Hit Point, no spells prepared or spell slots available, no points in any pools or any other daily resources, and still with any long-term debilitations of the old body.
The time spent in the afterlife leaves the target temporarily debilitated, making it [[Clumsy]] 2, [[Drained]] 2, and [[Enfeebled]] 2 for 1 week; these conditions can’t be removed or reduced by any means until the week has passed.
The creature is also permanently changed by its time in the afterlife, such as a slight personality shift, a streak of white in the hair, or a strange new birthmark.
''Heightened (7th)'' The maximum level of the target increases to 15. The cost increases to the target’s level (minimum 1) × 400 gp.
''Heightened (8th)'' The maximum level of the target increases to 17. The cost increases to the target’s level (minimum 1) × 800 gp.
''Heightened (9th)'' The maximum level of the target increases to 19. The cost increases to the target’s level (minimum 1) × 1,600 gp.
''Heightened (10th)'' The maximum level of the target increases to 21. The cost increases to the target’s level (minimum 1) × 3,200 gp.
| !Level to Raise | !Heighten Level Needed | !Diamond value needed |
| 0 | 6 | 200 |
| 1 | 6 | 200 |
| 2 | 6 | 400 |
| 3 | 6 | 600 |
| 4 | 6 | 800 |
| 5 | 6 | 1000 |
| 6 | 6 | 1200 |
| 7 | 6 | 1400 |
| 8 | 6 | 1600 |
| 9 | 6 | 1800 |
| 10 | 6 | 2000 |
| 11 | 6 | 2200 |
| 12 | 6 | 2400 |
| 13 | 6 | 2600 |
| 14 | 7 | 5600 |
| 15 | 7 | 6000 |
| 16 | 8 | 12800 |
| 17 | 8 | 13600 |
| 18 | 9 | 28800 |
| 19 | 9 | 30400 |
| 20 | 10 | 64000 |
| 21 | 10 | 67200 |
You remember the secrets of your rakshasa forebears and know how to apply those memories to get results.
You can cast [[Humanoid Form]] and [[Illusory Creature]] once per day each as 2nd-level divine innate spells.
Your fearless charge into battle reinvigorates your allies to carry on the fight.
You [[Stride]] up to your Speed and make a melee [[Strike]].
If your Strike hits and damages an enemy, each ally within 60 feet who saw you hit gains temporary Hit Points equal to your Charisma modifier. These temporary Hit Points last until the start of your next turn.
''Frequency'' once per day
You call out to your allies and push them to give their all in combat.
All allies within 30 feet that can hear you gain a number of temporary Hit Points equal to your level.
In addition, these allies become [[Quickened]] for 1 minute but can only use the extra action to [[Step]], [[Stride]], or [[Strike]].
''Trigger'' You use [[Orc Ferocity]].
You lash out viciously even as you fend off death.
Make a single melee [[Strike]].
If this Strike brings a foe to 0 Hit Points, this activation of Orc Ferocity doesn’t count against its frequency.
''Prerequisites'' [[Change Shape|Change Shape (Kitsune)]] with a fox alternate form.
Once per day, when you Change Shape into a fox, you can instead gain the effects of both the canine form of 5th-level [[Animal Form]] and 7th-level [[Fiery Body]] for 1 minute or until you shift back, whichever comes first.
You can cast [[Produce Flame]] from the fiery body effect even though you’re in a battle form.
''Special'' If you are a frozen wind kitsune, your form is ice instead of fire. This changes the immunity and damage from the fiery body effect to cold, changes the weakness to fire, and changes produce flame to [[Ray of Frost]].
You can use [[Retributive Strike]] with a ranged weapon.
In addition, if the foe that triggered your reaction is within 5 feet of your reach but not in your reach, as part of your reaction you can [[Step]] to put the foe in your reach before making a melee Retributive Strike.
The weapon can be used to [[Trip]] with the [[Athletics]] skill at a distance up to the weapon’s first range increment.
The skill check is attempted with a –2 circumstance penalty. You can add the weapon’s item bonus to attack rolls as a bonus to the check.
As with using a melee weapon to Trip, a ranged trip weapon doesn’t deal any damage when used to Trip.
This trait usually appears only on a [[Thrown]] weapon.
!! Splats
<$list filter="[tag<currentTiddler>tag[Splat]]" />
!! Class Features
| !Level | !Features |
| 1 | [[Hunt Prey]] |
| 2 | |
| 3 | [[Iron Will]] |
| 4 | |
| 5 | [[Trackless Step]], [[Weapon Expertise]] |
| 6 | |
| 7 | [[Evasion]], [[Vigilant Senses]], [[Weapon Specialization]] |
| 8 | |
| 9 | [[Nature's Edge]], [[Ranger Expertise]] |
| 10 | |
| 11 | [[Juggernaut]], [[Medium Armor Expertise]], [[Wild Stride]] |
| 12 | |
| 13 | [[Weapon Mastery]] |
| 14 | |
| 15 | [[Greater Weapon Specialization]], [[Improved Evasion]], [[Incredible Senses]] |
| 16 | |
| 17 | [[Masterful Hunter]] |
| 18 | |
| 19 | [[Second Skin]], [[Swift Prey]] |
| 20 | |
!! Class Feats
{{||ClassFeatList}}
You become trained in [[Survival]]; if you were already trained in Survival, you instead become trained in another skill of your choice.
You become trained in ranger class DC.
You can use the [[Hunt Prey]] action.
<<levelfeatlist "4 6 12" "[tag[Archetype]field:feat-arch[Ranger]]">>
You’ve practiced your techniques to make them harder to resist.
Your proficiency rank for your ranger class DC increases to expert.
''Prerequisites'' Class granting no more Hit Points per level than 8 + your Constitution modifier.
You gain 3 additional Hit Points for each ranger archetype class feat you have.
As you continue selecting ranger archetype class feats, you continue to gain additional Hit Points in this way.
{{||SpellSummaryTable}}
You cause plants in the area to entangle your foes, with the effects of [[Entangle]].
A creature that critically fails the save takes 2d4 persistent bleed damage in addition to being [[Immobilized]].
Escaping your bramble doesn’t end the bleed damage.
''Heightened (+1)'' The bleed damage on a critical failure increases by 1d4.
You take only 1 minute to [[Affix a Talisman]].
If you’re legendary in Crafting, you can Affix a Talisman as a 3-action activity.
''Prerequisites'' Expert in [[Athletics]].
You easily pull yourself onto ledges.
When you [[Grab an Edge]], you can pull yourself onto that surface and stand.
You can use Athletics instead of a Reflex save to Grab an Edge.
''Trigger'' An ally is reduced to 0 Hit Points.
You work quickly and efficiently in times of danger to deliver needed assistance.
You [[Stride]] towards the triggering ally. You gain a +10-foot circumstance bonus to your [[Speed]] during this movement.
You have a pet rat that has become magically bonded to you.
You gain a [[Familiar]], and this familiar must be a rat. It still gets the benefits of familiar abilities, but its base form remains a rat.
You can transform into an innocuous-looking rat to scout an area or slip through tight spaces.
You gain the effects of a 1st level [[Pest Form]] spell, except that you must assume the battle form of a Tiny rat.
There always seems to be a little rat around to carry messages for you.
You can cast [[Animal Messenger]] once per day as a primal innate spell. When you do, the
animal that responds is always a rat.
If there are no rats within range, the spell is lost.
You call upon the familial bonds you share with other ysoki to defend them in battle.
You can cast [[Enlarge]] as a 6th-level primal innate spell once per day. You can target only yourself and other ratfolk with this spell.
Years of experience among ratfolk communities have made you nimble, and you’ve learned to run and hide when enemies threaten.
You gain the trained proficiency rank in [[Acrobatics]] and [[Stealth]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Ratfolk [[Lore]].
Your ability to curl up into a tight ball comes in handy.
You roll up into a ball and move up to four times your Speed in a straight line down an incline.
If you reach the bottom of the incline or hit an obstacle during this first turn of movement, you stop rolling safely. Otherwise, you automatically keep rolling at this Speed during subsequent turns until you hit the bottom of the incline or an obstacle ends this movement (which can happen in the middle of your turn).
You’re [[Slowed]] 2 each turn after the first that you keep rolling, and if you hit an obstacle on a turn after the first, you and the obstacle both take 4d6 bludgeoning damage and you stop rolling.
To you, the squeaking of rats and other rodents makes a strange kind of sense.
You can ask questions of, receive answers from, and use the [[Diplomacy]] skill with rodents, including beavers, mice, porcupines, rats, and squirrels, but not with other mammals, such as dogs or bats.
The GM determines which animals count as rodents.
{{||SpellSummaryTable}}
A ray with the power to sap a foe’s strength flashes from your hand.
Attempt a ranged spell attack against the target.
If you succeed, that creature attempts a [[Fortitude]] save in order to determine the spell’s effect.
If you critically succeed on your attack roll, use the outcome for one degree of success worse than the result of its save.
{{||SaveSuccessTable}}
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
You blast an icy ray.
Make a spell attack roll.
//If you hit//, the ray deals cold damage equal to 1d4 + your spellcasting ability modifier.
//On a critical hit// the target takes double damage and takes a –10-foot status penalty to its Speeds for 1 round.
''Heightened (+1)'' The damage increases by 1d4.
Your have honed your claws to be deadly.
Your claw attack deals 1d6 slashing damage instead of 1d4 and gains the [[Versatile]] (piercing) trait.
Your family’s teeth are formidable weapons.
You gain a jaws unarmed attack that deals 1d6 piercing damage. Your jaws are in the [[Brawling]] group and have the [[Finesse]] and [[Unarmed]] traits.
''Frequency'' once per hour
''Trigger'' You blind or dazzle a creature.
You’ve spent considerable time practicing the manipulation of light, weaponizing your blade’s reflection or bolstering the luminosity of magical displays to unconventional heights.
Extend the duration of the [[Blinded]] or [[Dazzled]] condition you give the target by 1 round.
This weapon is long and can be used to attack creatures up to 10 feet away instead of only adjacent creatures.
For creatures that already have reach with the limb or limbs that wield the weapon, the weapon increases their reach by 5 feet.
//There is no clear rules judgment on whether the extended limb or weapon of a creature with reach can be attacked using Reactions at the moment it strikes.//
You can extend the range of your spells.
If the next action you use is to [[Cast a Spell]] that has a range, increase that spell’s range by 30 feet. As is standard for increasing spell ranges, if the spell normally has a range of touch, you extend its range to 30 feet.
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="1em" height="1em" viewBox="0 0 1280.000000 1226.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.15, written by Peter Selinger 2001-2017
</metadata>
<g transform="translate(0.000000,1226.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M5485 11778 c-302 -265 -802 -703 -1110 -973 -308 -270 -1124 -985
-1814 -1589 -1005 -881 -1251 -1101 -1239 -1110 8 -6 900 -825 1983 -1821
1083 -995 2181 -2005 2440 -2242 258 -238 472 -433 475 -433 3 0 4 633 2 1407
-1 774 1 1410 5 1414 11 11 327 -8 458 -27 848 -122 1536 -568 1913 -1239 120
-214 200 -444 248 -710 25 -143 26 -497 1 -650 -71 -430 -267 -850 -561 -1200
-142 -169 -315 -338 -493 -482 -103 -83 -123 -106 -38 -43 63 46 90 54 160 42
46 -8 53 -6 90 21 29 21 23 13 -20 -28 -96 -89 -277 -228 -451 -343 -88 -59
-169 -113 -180 -120 -17 -11 -17 -11 3 -2 12 5 68 10 125 10 l103 0 -25 -21
c-48 -39 14 -2 159 95 145 98 332 242 435 336 l58 54 230 3 c224 2 230 3 261
26 38 28 67 45 52 30 -21 -21 -167 -125 -276 -196 -159 -102 -313 -193 -473
-277 -131 -69 -166 -91 -108 -69 15 6 79 12 143 12 98 2 114 0 100 -11 -26
-22 189 92 300 158 146 88 304 193 444 295 66 48 109 75 95 61 l-25 -27 95 2
95 1 85 72 c120 101 376 353 485 476 572 652 899 1382 1002 2240 21 176 23
624 4 800 -35 321 -94 605 -183 880 -254 784 -726 1480 -1373 2021 -758 635
-1753 1013 -2780 1057 l-160 7 -3 1288 -2 1287 -93 0 -92 0 -550 -482z m2825
-9571 c0 -2 -19 -21 -42 -42 l-43 -40 40 43 c36 39 45 47 45 39z m730 -1 c0
-2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z"/>
<path d="M9068 2084 c-32 -25 -58 -48 -58 -50 0 -3 27 16 60 41 52 40 68 55
58 55 -2 0 -29 -21 -60 -46z"/>
<path d="M7669 2023 c-13 -16 -12 -17 4 -4 16 13 21 21 13 21 -2 0 -10 -8 -17
-17z"/>
</g>
</svg>
''Trigger'' You would be hit by an attack or targeted by an effect, or you are within an effect’s area.
''Requirements'' You have [[Perfect Distraction]] ready to use.
You reactively switch with your decoy to foil your foe.
You use Perfection Distraction, even if you were [[Observed]], as long as you end the movement of your [[Sneak]] while [[Concealed]] or in a location with cover or greater cover.
Your decoy is targeted by the attack or effect instead of you.
In the case of an area effect, if your Sneak doesn’t move you out of the area, both you and the decoy are targeted by the effect.
''Trigger'' An adjacent enemy begins to use a reaction.
Grabbing a sleeve, swiping with your weapon, or creating another obstruction, you reflexively foil an enemy’s response.
If the triggering creature’s level is equal to or lower than yours, you disrupt the triggering reaction.
If the triggering creature’s level is higher than yours, you must make an attack roll against its AC. On a success, you disrupt the reaction.
''Trigger'' An adjacent foe moves away from you, and you can reach at least one space adjacent to the foe with a [[Stride]] action.
You keep pace with a retreating foe.
You [[Stride]], but you must end your movement adjacent to the triggering enemy.
Your move does not trigger reactions from the triggering enemy.
You can use Reactive Pursuit to [[Burrow]], [[Climb]], [[Fly]], or [[Swim]] instead of Stride if you have the corresponding movement type.
''Trigger'' An enemy hits you with a melee Strike.
''Requirements'' You are wielding a shield.
You can snap your shield into place just as you would take a blow, avoiding the hit at the last second.
You immediately use the [[Raise a Shield]] action and gain your shield’s bonus to AC.
The circumstance bonus from the shield applies to your AC when you’re determining the outcome of the triggering attack.
''Prerequisite'' [[Aerial Form]], [[Dragon Form]], [[Elemental Form]] and/or [[Plant Form]].
You transform reflexively when in danger.
You cast [[Wild Shape]] to transform into one form granted by one of the prerequisite feats you have, depending on the trigger.
Your form’s resistances and weaknesses apply against the triggering damage.
* ''Trigger'' You fall 10 feet or more; ''Effect'' Choose a form from [[Aerial Form]].
* ''Trigger'' You take acid, cold, electricity, fire, or poison damage; ''Effect'' Choose a form from [[Dragon Form]] that resists the triggering damage.
* ''Trigger'' You take fire damage; ''Effect'' Choose a fire elemental form from [[Elemental Form]].
* ''Trigger'' You take poison damage; ''Effect'' Choose a form from [[Plant Form]].
{{||SpellSummaryTable}}
You focus on the target object, opening your mind to perceive magical auras.
When the casting is complete, you know whether that item is magical, and if it is, you learn the [[School]] of magic.
If the object is illusory, you detect this only if the effect’s level is lower than the level of your read aura spell.
''Heightened (3rd)'' You can target up to 10 objects.
''Heightened (6th)'' You can target any number of objects.
You spend 10 minutes and open yourself to the divine mysteries of the world, peering into the most sinister portents of the future.
You gain the effects of [[Augury]], except you learn only about the dangers ahead; any results of “weal” are instead “nothing,” and results of “weal and woe” are instead “woe.”
If you are legendary in [[Religion]], you take only 1 minute to Read Disaster.
{{||SpellSummaryTable}}
You attempt to learn more about the target’s fate in the short term, usually within the next day for most prosaic creatures, or the next hour or less for someone likely to have multiple rapid experiences, such as someone actively adventuring.
You learn a single enigmatic word connected to the creature’s fate in that time frame.
Fate is notoriously inscrutable, and the word isn’t necessarily meant to be taken at face value, so the meaning is often clear only in hindsight.
The GM rolls a secret DC 6 flat check. If the creature’s fate is too uncertain, or on a failed flat check, the spell yields the word “inconclusive.”
Either way, the creature is then temporarily immune for 24 hours.
''Prerequisites'' Trained in [[Society]].
You can read lips of others nearby who you can clearly see.
When you’re at your leisure, you can do this automatically.
In encounter mode or when attempting a more difficult feat of lipreading, you’re [[Fascinated]] and [[Flat-Footed]] during each round in which you focus on lip movements, and you must succeed at a [[Society]] check (DC determined by the GM) to successfully read someone’s lips. In either case, the language read must be one that you know.
If you are [[deaf|Deafened]] or hard of hearing and have Read Lips, you recognize the lip movements for the spoken form of your languages. You can also speak the spoken form of your languages clearly enough for others to understand you.
{{||SpellSummaryTable}}
You peek into the future.
Choose a particular goal, event, or activity that will occur within 1 week.
You learn a cryptic clue or piece of advice that could help with the chosen event, often in the form of a rhyme or omen.
All communication is filled with slight tells and signals.
If you interact with someone for at least 10 minutes, their regional words, pronunciation changes, and nonverbal cues provide you with a minor fact about their social environment, such as their hometown or certain groups they might belong to.
If a target of this ability is being deceptive about their social environment, such as a commoner pretending to be a noble, they must attempt a [[Deception]], [[Society]], or appropriate [[Lore]] check against your Society DC, providing you a false minor fact consistent with their assumed identity on a success.
Once you’ve gleaned one or more true minor facts about a person, you can then incorporate these mannerisms into your speech to present yourself in a way that they find familiar. This grants you a +1 circumstance bonus to your [[Diplomacy]] and [[Deception]] checks with them.
You’re incredibly skilled in iruxi astrology, and you can gain useful (if cryptic) hints from the stars’ alignment.
Once per night, if you can clearly see the stars, you can spend 1 hour reading the heavens to see how they relate to a particular goal, event, or activity that will occur within 1 week.
The GM rolls a secret check, either a DC 28 Astrology [[Lore]] check or a DC 32 [[Occultism]] check. On a success, you learn a cryptic clue or piece of advice that could help with the chosen event, and on a critical failure, you learn a misleading cryptic clue or piece of advice.
You prepare to use an action that will occur outside your turn.
Choose a single [[Action]] or [[Free]] action you can use, and designate a trigger. You can’t Ready a free action that already has a trigger.
Your turn then ends.
If the trigger you designated occurs before the start of your next turn, you can use the chosen action as a [[Reaction]] (provided you still meet the requirements to use it).
If you have a multiple attack penalty and your readied action is an [[Attack]] action, your readied attack takes the multiple attack penalty you had at the time you used Ready. This is one of the few times the multiple attack penalty applies when it’s not your turn.
The Ready activity lets the acting person choose the trigger for their readied action. However, you might sometimes need to put limits on what they can choose.
Notably, the trigger must be something that happens in the game world and is observable by the character rather than a rules concept that doesn’t exist in world. For instance, if a player says, “I Ready to shoot an arrow at her if she uses a concentrate action,” or “I Ready to attack him if he has fewer than 47 Hit Points,” find out what their character is trying to specifically observe. If they don’t have a clear answer for that, they need to adjust their action.
''Usage'' etched onto armor.
A ready rune draws component pieces of a suit of armor toward one another, making it easier and faster to get into.
You can don light armor with this rune as a 3-action activity or medium or heavy armor with this rune in 1 minute.
''Greater Ready'': You can don light armor with a greater ready rune as a single action, or medium or heavy armor with a greater ready rune as a 3-action activity.
{{LOCGFeat}}
''Prerequisites'' Master proficiency in a weapon
Your skill and fervor allow you to pierce undead defenses and exploit their weaknesses.
When you make an attack using a weapon with which you have master proficiency and hit an undead creature, you ignore 5 points of the creature’s resistances, and the undead’s weaknesses are 2 higher against your attack.
{{||SpellSummaryTable}}
You call forth a ghostly lantern that guides the living toward death and the undead toward true death.
It sheds bright light in the spell’s area, and dim light to twice that area.
Though the lantern is insubstantial, you must keep a hand free to hold it or the spell ends (though using the hand for <<tag Somatic>> spell components doesn’t end the spell). Living creatures and <<tag Undead>> in the area when you Cast the Spell, or that enter the area later, must attempt [[Fortitude]] saves.
Living creatures that fail their [[Fortitude]] saves gain only half the normal benefit from healing effects while within the area.
Undead targets that fail their [[Fortitude]] saves become [[Enfeebled]] 1 while within the area.
Once a creature attempts a save against reaper’s lantern, it uses the same outcome if it leaves the area and enters it again.
Once per turn, starting on the turn after you cast reaper’s lantern, you can use a single action, which has the concentrate trait, to increase the emanation’s radius by 5 feet. When you do so, you force creatures in the area that haven’t yet attempted a save against reaper’s lantern to attempt one.
Your mind works through clues at an unbelievable speed.
You instantly use up to five [[Recall Knowledge]] actions.
If you have any special abilities or free actions that would normally be triggered when you Recall Knowledge, you can’t use them for these actions.
{{||SpellSummaryTable}}
''Trigger'' You are hit by a physical Strike.
You swiftly raise a reflective barrier, reducing physical damage and rebounding it onto your attacker.
You gain resistance 10 against one physical damage type the triggering attack deals.
Your attacker takes 5 damage of the same type.
''Heightened (+1)'' The resistance increases by 2. Damage dealt to your attacker increases by 1.
''Requirements'' You are wielding a thrown weapon.
You bounce your weapon off one foe to strike another.
Make a ranged [[Strike]] with a thrown weapon.
If this Strike hits, the weapon rebounds toward an enemy within 10 feet of the original target.
Make an additional Strike against this second target.
Both attacks count toward your multiple attack penalty, but the penalty doesn’t increase until after you’ve made both attacks.
{{||SpellSummaryTable}}
You snatch creatures from the jaws of death.
You can spend 1 to 3 actions Casting this Spell, and you can target a number of creatures equal to the actions spent.
Each target regains 3d6 Hit Points.
If the target had the [[Dying]] condition, coming back from dying due to this healing doesn’t increase its [[Wounded]] condition.
''Heightened (+1)'' Increase the healing by 1d6.
You attempt a skill check to try to remember a bit of knowledge regarding a topic related to that skill.
The GM determines the DCs for such checks and which skills apply.
{{||ActionSuccessTable}}
''Trigger'' Your turn begins, and you are at half or fewer Hit Points.
Your blood boils when you take a beating, and you throw caution to the wind to finish the fight.
You gain a +2 circumstance bonus to attack rolls, a –2 penalty to AC, and a –1 penalty to saves.
These bonuses and penalties last until your Rage ends or until you are above half Hit Points, whichever comes first.
''Frequency'' once per day
Despite a lifetime filled with questionable decisions, you’ve managed to survive, as though you have uncanny luck that lets you avoid the consequences of your own actions.
For the remainder of your turn, if you roll a failure or critical failure on a saving throw against a harmful effect, you get a success instead.
Further, enemies and hazards that would damage you this turn roll the minimum possible damage.
These benefits apply only to harmful effects incurred entirely during your turn in which you activate Reckless Abandon, such as running through a prismatic wall. Persistent damage and conditions that were applied prior to your turn proceed normally, and as soon as your turn ends you are subject to the full consequences of any dangers still threatening you.
You reclaim the magic of an ongoing spell, using it reprepare a spell with a duration.
You [[Dismiss]] a Spell of 4th level or lower that you cast today from a spell slot with at least half its duration remaining, even if that spell can’t normally be Dismissed.
You can then spend 10 minutes to reprepare the spell in that spell slot, as [[Reprepare Spell]].
''Trigger'' You roll initiative.
Your combat training has honed you to be ready for an attack at all times.
You [[Interact]] to draw a weapon.
''Prerequisites'' Trained in [[Arcana]], [[Nature]], [[Occultism]], or [[Religion]].
''Trigger'' A creature within line of sight casts a spell that you don’t have prepared or in your spell repertoire, or a trap or similar object casts such a spell. You must be aware of the casting.
If you are trained in the appropriate skill for the spell’s tradition and it’s a common spell of 2nd level or lower, you automatically identify it (you still roll to attempt to get a critical success, but
can’t get a worse result than success).
The highest level of spell you automatically identify increases to 4 if you’re an expert, 6 if you’re a master, and 10 if you’re legendary.
The GM rolls a secret [[Arcana]], [[Nature]], [[Occultism]], or [[Religion]] check, whichever corresponds to the tradition of the spell being cast. If you’re not trained in the skill, you can’t get a result better than failure.
{{||ActionSuccessTable}}
''Prerequisites'' master in a Recall Knowledge skill
''Trigger'' Your first turn of an encounter begins, and you can see a creature.
''Requirements'' You have master proficiency in a skill to identify the triggering creature.
You quickly assess the threat so you can relay the information to your team.
Attempt a [[Recall Knowledge]] check against the triggering creature.
You spend 1 minute surveying a small location (such as a single room) to get an impression of events that occurred there in the last day. This involves moving about the area and studying footprints, the placement of objects, spilled drinks or blood, and so forth.
You get an indistinct mental impression of significant events that happened there. This gives you clues and details of the past, including the overall events and their time frame, but it’s not a perfect record. This also isn’t enough to identify who was involved in these events if you weren’t already aware the person was there.
As determined by the GM, you also pick out various seemingly small details that could serve as important clues, like a memorable weapon someone used for a murder or the type of cloak someone wore when passing through.
//Implied by [[Parch]].//
Affected creatures that have the water trait or are made primarily of liquid, as well as affected creatures that can’t drink, can end the effect as a two-action activity, which has the Concentrate trait.
When you’re dying, at the start of each of your turns, you must attempt a flat check with a DC equal to 10 + your current [[Dying]] value to see if you get better or worse. This is called a recovery check.
The effects of this check are as follows.
{{||ActionSuccessTable}}
You have a keen sense for avoiding spurious lines of inquiry.
When you [[Pursue a Lead]], the GM tells you if the lead you chose is inconsequential. For example, if you found a splatter of gray mud on the wall, thought it was suspicious, and Pursued it as a Lead, the GM would tell you if there was no greater mystery related to it.
When the GM tells you a lead is inconsequential, you can decline to Pursue the Lead, keeping any leads you were already pursuing. You still can’t use Pursue a Lead again for 10 minutes, as normal.
{{LOWGFeat}}
''Prerequisites'' trained in sawtooth sabers, lawful evil alignment.
You have learned how to stalk your foes and slay them with a [[Sawtooth Sabre]].
You become trained in Stealth and Assassin [[Lore]]; if you were already trained, you become an expert instead.
Whenever your proficiency in any weapon increases to expert or beyond, you also gain that new proficiency with sawtooth sabers.
<<archetypefeatlist "4 6 8" "[[Red Mantis Assassin]]">>
{{||SpellSummaryTable}}
You strike mention of a specific name from one or more documents.
When you cast the spell, give one proper name, be it a creature, location, or object. Any mention of that name within the document becomes blurred, smudged, or otherwise completely illegible.
Epithets and unambiguous references to the name are redacted as well; for instance, redacting the name of //a goddess// from a book would also remove references to her title.
''Heightened (3rd)'' Instead of striking out a given name, you can replace it with a different name you choose. Epithets and references are substituted with similar ones relating to the replacement name. Anyone reading the text can attempt a [[Perception]] or [[Society]] check against your spell DC to notice the altered text, though that doesn’t tell them what the original said.
''Heightened (4th)'' At your choice, the duration is unlimited.
You’re honorable, forthright, and committed to pushing back the forces of cruelty.
Your code is:
* You must never perform acts anathema to your deity or willingly commit an evil act, such as murder, torture, or the casting of an evil spell.
* You must never knowingly harm an innocent, or allow immediate harm to one through inaction when you know you could reasonably prevent it. (This tenet doesn’t force you to take action against possible harm to innocents at an indefinite time in the future, or to sacrifice your life to protect them.)
* You must first try to redeem those who commit evil acts, rather than killing them or meting out punishment. If they then continue on a wicked path, you might need to take more extreme measures.
* You must show compassion for others, regardless of their authority or station.
You gain the [[Lay on Hands]] devotion spell. Your champion's reaction is [[Glimpse of Redemption]].
When you successfully use [[Counterspell]] to counteract a spell that affects targeted creatures or an area, you can turn that spell’s effect back on its caster.
When reflected, the spell affects only the original caster, even if it’s an area spell or it would normally affect more than one creature.
The original caster can attempt a save and use other defenses against the reflected spell as normal.
''Trigger'' An opponent casts a spell and you critically succeed at a saving throw against it.
''Requirements'' You have a shield raised or are benefiting from [[Dueling Parry]] or [[Twin Parry]].
You attempt to counteract the triggering spell. Use your attack roll modifier with your shield or parrying weapon for your [[Counteract]] check.
If you counteract the spell, it is reflected upon the caster. If the spell targeted individual creatures, it targets the caster only. If the spell targeted an area centered on a point, the new area is centered on the caster. If the spell was a cone or line, the cone or line emanates from you toward the caster.
If the spell has a save DC, it uses your class DC, and if it requires a spell attack roll, use the same attack roll modifier as the counteract check.
{{||SpellSummaryTable}}
You grow a set of colored glowing scales or scaled armor that stores energy before releasing it in a final burst.
When you cast this spell, choose <<tag Acid>>, <<tag Cold>>, <<tag Fire>>, <<tag Electricity>>, or <<tag Poison>> damage. You gain resistance 5 against that type of damage.
The scales’ color depends on the damage type you chose and is usually the color of a type of dragon or other creature associated with that damage type, such as red or gold for fire damage.
The scales store up energy as they protect you. Keep track of how much damage the scales have prevented.
As a 2-action activity that has the <<tag Concentrate>> and <<tag Manipulate>> traits, you can explode your scales outward in a 20-foot radius around you, dealing 1d6 damage of the chosen type to all creatures in the area for every 10 damage the scales have prevented, to a maximum of 10d6 damage (after preventing 100 damage).
Once you do so, the spell ends.
''Heightened (+2)'' The resistance increases by 5 and the maximum damage from the scale explosion increases by 5d6.
//A Reflex save is used to avoid negative effects by dodging them.//
//Reflex is governed by [[Dexterity]].//
//Being [[Clumsy]], [[Fatigued]], [[Sickened]], [[Frightened]] or [[Unconscious]] reduces your Reflex rolls.//
//Being in [[Cover]] increases your Reflex rolls.//
//[[Armor]] can limit your Dexterity modifier which in turn can reduce your Reflex.//
{{||DefenseList}}
{{||SpellSaveList}}
''Trigger'' An item falls within your reach, or an attacker fails an attack roll to hit you or a creature within your reach with a thrown weapon.
''Requirements'' The item or thrown weapon is of a Bulk you can Juggle. If the trigger was a thrown weapon attack targeting you, you can’t be [[Flat-Footed]] to the attack. If you were already Juggling, you can’t be Juggling your maximum number of items.
You grab the triggering item. If you are [[Juggling|Juggle]], you can immediately add the item to the objects you’re Juggling as a free action, which has the concentrate and manipulate traits.
You can use your shield to fend off the worst of area effects and other damage.
When you [[Raise your Shield|Raise a Shield]], you gain your shield’s circumstance bonus to [[Reflex]] saves.
If you have the [[Shield Block]] reaction, damage you take as a result of a [[Reflex]] save can trigger that reaction, even if the damage isn’t physical damage.
''Requirements'' You have a focus pool, and you have spent at least 1 Focus Point since you last regained any Focus Points.
You spend 10 minutes performing deeds to restore your magical connection.
This restores 1 Focus Point to your focus pool.
The deeds you need to perform are specified in the class or ability that gives you your focus spells. These deeds can usually overlap with other tasks that relate to the source of your focus spells.
For instance, a cleric with focus spells from a good deity can usually Refocus while tending the wounds of their allies, and a wizard of the illusionist school might be able to Refocus while attempting to [[Identify Magic]] of the <<tag Illusion>>school.
{{||SpellSummaryTable}}
An infusion of positive energy grants a creature continuous healing.
The target temporarily gains [[Regeneration]] 15, which restores 15 Hit Points to it at the start of each of its turns.
While it has regeneration, the target can’t die from damage and its [[Dying]] value can’t exceed 3, though if its [[Wounded]] value becomes 4 or higher, it stays [[Unconscious]] until its wounds are treated.
If the target takes <<tag Acid>>or <<tag Fire>> damage, its regeneration deactivates until after the end of its next turn.
Each time the creature regains Hit Points from regeneration, it also regrows one damaged or ruined organ (if any).
During the spell’s duration, the creature can also reattach severed body parts by spending an [[Interact]] action to hold the body part to the area it was severed from.
''Heightened (9th)'' The regeneration increases to 20.
This monster regains the listed number of Hit Points each round at the beginning of its turn.
Its [[Dying]] condition never increases beyond dying 3 as long as its regeneration is active.
If it takes damage of a type listed in the regeneration entry, its regeneration deactivates until the end of its next turn.
//The regeneration is deactivated// before applying any damage of a listed type, //so// that damage //can// kill the monster by bringing it to dying 4.
Your command over your vital essence allows you or an ally to recover from grievous wounds.
You can cast [[Regenerate]] as a 7th-level primal innate spell once per day.
You surround your body with a thin layer of water drawn from the moisture in the air.
You can spend one hour resting to rehydrate your gills and skin, which counts as [[submerging your body in water|Hydration]].
At the GM’s discretion, incredibly dry areas, such as deserts, might not have enough moisture in the air for your Rehydration to work.
{{||RitualSummaryTable}}
You call forth the target’s soul and attempt to incarnate it into a brand-new body.
As the soul won’t be returning to the original body, only a small portion of the creature’s remains are required. These remains must have been part of the original body at the time of death, and the target must have died within the past week.
If //the gods have// decided that the target’s time has come or the target’s soul is trapped or doesn’t wish to return, this ritual automatically fails, but you discover this after you succeed at the [[Religion]] check and can end the ritual without paying the cost.
If the ritual is successful, the target’s new body has a random [[Ancestry]]. First roll 1d20. On a result of 1 through 14, the new body is one of a common ancestry, while on a 15 through 20 they become a member of an uncommon or rare ancestry. The GM chooses possible ancestries based on those found in the region and then rolls randomly between them. For instance, the GM could roll 1d6 to choose a common ancestry from the Core Rulebook.
The target replaces their ancestry Hit Points, size, Speeds, ability boosts, ability flaws, traits, and special abilities with those of their new ancestry. The target loses their heritage and ancestry feats, selecting replacements from their new ancestry.
The target’s background, class features, and known languages remain unaltered.
''Heightened (4th)'' The maximum level of the target increases to 10. The cost is the target’s level (minimum 1) × 40 gp.
''Heightened (5th)'' The maximum level of the target increases to 12. The cost is the target’s level (minimum 1) × 75 gp.
''Heightened (6th)'' The maximum level of the target increases to 14. The cost is the target’s level (minimum 1) × 125 gp. The target must have died within the past month.
''Heightened (7th)'' The maximum level of the target increases to 16. The cost is the target’s level (minimum 1) × 200 gp. The target must have died within the past month.
''Heightened (8th)'' The maximum level of the target increases to 18. The cost is the target’s level (minimum 1) × 300 gp. The target must have died within the past year.
''Heightened (9th)'' The maximum level of the target increases to 20. The cost is the target’s level (minimum 1) × 600 gp. The target must have died within the past decade.
{{||ActionSuccessTable}}
Your healing energies linger after you cast, providing continual benefits.
An ally that recovers Hit Points from your [[Lay on Hands]] gains 10 temporary Hit Points at the start of their turn during each of the next 10 rounds.
This effect ends if the ally is knocked [[Unconscious]].
You release something you’re holding in your hand or hands.
This might mean dropping an item, removing one hand from your weapon while continuing to hold it in another hand, releasing a rope suspending a chandelier, or performing a similar action.
Unlike most manipulate actions, Release does not trigger reactions that can be triggered by actions with the manipulate trait (such as [[Attack of Opportunity]]). If you want to prepare to Release something outside of your turn, use the [[Ready]] activity.
''Trigger'' An adjacent creature you are hunting attempts to move away from you using an action that has the move trait.
Your hunted prey cannot escape your relentless pursuit.
Stride up to your Speed in tandem with the triggering creature, remaining adjacent to the foe throughout its movement until it stops moving or you run out of movement.
You can ignore [[Difficult Terrain]] during this movement unless the difficult terrain is caused by a magical effect.
Your wings are now a permanent part of your physiology.
You gain the effects of [[Fiendish Wings]] at all times, rather than just once per day for 10 minutes.
You have gone well past nine lives to survive danger with surprising regularity.
You can use [[Cat's Luck]] once per hour, rather than once per day.
''Key Ability'' [[Wisdom]].
The secrets of deities, dogma, faith, and the realms of divine creatures both sublime and sinister are open to you.
You also understand how magic works, though your training imparts a religious slant to that knowledge.
{{||SkillActionList}}
{{||SkillFeatList}}
{{||SkillRitualList}}
It’s recommended you disallow humanoid creatures and most other bipeds as mounts, especially if they are PCs. If you choose to allow this anyway, either the rider or mount should use at least one hand to hold onto the other, and both should spend an action on each of their turns to remain mounted.
{{||SpellSummaryTable}}
You fully re-create an object from nothing, even if the object was destroyed.
To do so, you must be able to picture the object in your mind.
Additionally, the material component must be a remnant of the item, no matter how small or insignificant (even a speck of dust that remains from [[Disintegrate]] is enough).
The spell fails if your imagination relied on too much guesswork; if the object would be too large to fit in a 5-foot cube; if the object still exists and you were simply not aware of it; or if the object is an artifact, has a level over 20, or has similar vast magical power.
The item reassembles in perfect condition. Even if your mental image was of a damaged or weathered object, the new one is in this perfected form.
If the object was magical, this spell typically restores its constant magical properties, but not any temporary ones, such as charges or one-time uses.
An item with charges or uses per day has all of its uses expended when remade, but it replenishes them normally thereafter.
''Prerequisites'' harmful font or healing font
''Frequency'' once per hour
If your next action is to use your divine font to cast a 3-action [[Heal]] or [[Harm]] spell to damage creatures, you can harness the residual energy to counterbalance opposing forces.
You use your heal or harm spell to attempt to [[Counteract]] one effect in the spell’s area with the <<tag Chaotic>>, <<tag Evil>>, <<tag Good>>, or <<tag Lawful>> trait. The chosen trait must oppose one component of your deity’s alignment; if your deity is neutral, you can choose any one trait.
{{||SpellSummaryTable}}
You call upon the lost and forgotten, assailing your foes’ minds with the memories of those who died with a grievance toward them.
Enemies in the area take 6d6 mental damage (basic [[Will]] save) and are [[Frightened]] 1 on a critical failure.
If you know the names of anyone murdered or grievously wronged by an enemy in the area, you can chant those victims’ names when you cast the spell to improve the clarity of the visions, increasing the damage to the corresponding enemy from 6d6 to 6d10; you can do so for multiple enemies if you know victims of each enemy.
The visions are personal to each foe in the area, and you can’t use this spell to discern a murderer by guessing a name.
A creature that truly knows no one who died with any sort of grievance to that creature is immune to this effect.
''Heightened (+1)'' The damage increases by 2d6 (or 2d10 to an enemy when you name a specific victim).
You’re skilled at beating a foe when their morale is already breaking.
When you succeed at a melee weapon [[Strike]] against a [[Frightened]] foe, that foe can’t reduce their frightened condition below 1 until the beginning of your next turn.
You’ve learned how to trigger snares from afar, creating ranged hazards to assail your opponents and allowing you to disarm enemies’ snares harmlessly.
You can [[Strike]] a snare to trigger it prematurely.
If you crafted the snare, you automatically hit.
If someone else crafted it, attempt a ranged Strike against the Crafting DC, triggering the snare only if you hit.
{{||SpellSummaryTable}}
Your touch grants a reprieve to a cursed creature.
You attempt to [[Counteract]] one <<tag Curse>>afflicting the target.
If the curse comes from a cursed item or other external source, a success indicates that the target creature can rid itself of the cursed item, but it doesn’t remove the curse from the item.
{{||SpellSummaryTable}}
Healing magic purges disease from a creature’s body.
You attempt to [[Counteract]] one <<tag Disease>>afflicting the target.
{{||SpellSummaryTable}}
With a touch, you ease a creature’s fears.
You can attempt to [[Counteract]] a single <<tag Fear>>effect that the target suffers from.
This frees only the target, not any other creatures under the fear effect.
''Heightened (6th)'' The spell’s range increases to 30 feet, and you can target up to 10 creatures.
//Merely giving the [[Frightened]] condition does not make something a fear effect.//
{{||SpellSummaryTable}}
A surge of energy frees a paralyzed creature.
You can attempt to [[Counteract]] a single effect imposing the [[Paralyzed]] condition on the target.
This does not cure someone who is paralyzed from some natural state or effect, such as paralysis caused by non-magical wounds or toxins.
''Heightened (6th)'' The spell’s range increases to 30 feet, and you can target up to 10 creatures.
A Rend entry lists a [[Strike]] the monster has.
''Requirements'' The monster hit the same enemy with two consecutive [[Strike]]s of the listed type in the same round.
The monster automatically deals that Strike’s damage again to the enemy.
You pause to recover your raging vigor.
You gain temporary [[Hit Points]] equal to half your level plus your [[Constitution]] modifier.
''Requirements'' You have a [[Repair Kit]].
You spend 10 minutes attempting to fix a damaged item, placing the item on a stable surface and using the repair kit with both hands. //If you have [[Quick Repair]], it takes less time depending on your proficiency in Crafting.//
//Make a [[Crafting]] check.// The GM sets the DC, but it’s usually about the same DC to Repair a given item as it is to [[Craft]] it in the first place.
You can’t Repair a destroyed item.
{{||ActionSuccessTable}}
''Frequency'' once per day
You trigger your body’s repair programming, causing your body’s nanites to heal your wounds.
You gain [[Fast Healing]] equal to half your level for 1 minute.
While Repair Module is active, you can’t use other abilities that require the use of your nanites.
You repeatedly cast the same spell while moving at half speed.
Typically, this spell is a cantrip that you want to have in effect in the event a combat breaks out, and it must be one you can cast in 2 actions or fewer.
In order to prevent fatigue due to repeated casting, you’ll likely use this activity only when something out of the ordinary occurs. //(There is no rules reference for "fatigue due to repeated casting", so this may be an error.)//
You can instead use this activity to continue [[Sustaining a Spell|Sustain a Spell]] or Activation with a sustained duration.
Most such spells or item effects can be sustained for 10 minutes, though some specify they can be sustained for a different duration.
You draw life from the water around you.
If you submerge in water and rest for 10 minutes, you regain Hit Points equal to your [[Constitution]] modifier times half your level.
''Prerequisites'' expert in your deity’s favored weapon
Striking out against your enemies draws praise and protection from your deity.
When you damage a creature with a [[Strike]] using your deity’s favored weapon, you gain a number of temporary Hit Points equal to half your level, or equal to your level if the Strike was a critical hit.
These temporary Hit Points last until the start of your next turn.
You’ve discovered how to reuse some of your spell slots over and over.
You can spend 10 minutes to prepare a spell that you already cast today, regaining access to that spell slot.
The spell must be of 4th level or lower and one that does not have a duration.
You can reprepare a spell in this way even if you’ve already reprepared that spell previously in the same day.
If you have the [[Spell Substitution]] arcane thesis, you can instead prepare a different spell in an expended slot, as long as the new spell doesn’t have a duration. Once you’ve reprepared a spell in that slot even once, you can use your arcane thesis to substitute only spells without durations into that spell slot.
To you, crocodilians, giant lizards, and dinosaurs are loyal steeds, not monsters.
You gain the [[Ride]] feat, even if you don’t meet the prerequisites.
You gain a +1 circumstance bonus to [[Nature]] checks to [[Handle an Animal]] as long as the animal is a reptile, dinosaur, or even a non-sapient dragon.
You hear the sounds of reptiles as language.
You can ask questions of, receive answers from, and use the [[Diplomacy]] skill with animals that are reptiles (the GM determines which animals count as reptiles).
{{||SpellSummaryTable}}
You manifest an aura that prevents creatures from approaching you.
When casting the spell, you can make the area any radius you choose, up to 40 feet.
A creature must attempt a Will save if it’s within the area when you cast the spell or as soon as it enters the area while the spell is in effect.
{{||SaveSuccessTable}}
Once a creature has attempted the save, it uses the same result for that casting of repulsion.
Any restrictions on a creature’s movement apply only if it voluntarily moves toward you. For example, if you move closer to a creature, it doesn’t then need to move away.
You can make a request of a creature that’s [[Friendly]] or [[Helpful]] to you.
You must couch the request in terms that the target would accept given their current attitude toward you.
The GM sets the [[Diplomacy]] DC based on the difficulty of the request. Some requests are unsavory or impossible, and even a helpful NPC would never agree to them.
{{||ActionSuccessTable}}
''Usage'' etched onto armor.
Resilient runes imbue armor with additional protective magic.
You can upgrade the resilient rune already etched on a suit of armor to a stronger version, increasing the values of the existing rune to those of the new rune. You must have the formula of the stronger rune to do so, and the Price of the upgrade is the difference between the two runes’ Prices.
| !Type | !Level | !Price | !Item Bonus to Saving Throws |
| (standard) | 8 | 3400 | +1 |
| Greater | 14 | 34400 | +2 |
| Major | 20 | 494400 | +3 |
{{||SpellSummaryTable}}
You create an immobile sphere of force to either trap or protect the target, blocking anything that would pass through the sphere.
The sphere has AC 5, Hardness 10, and 40 Hit Points. It’s immune to critical hits and precision damage.
[[Disintegrate]] destroys the sphere instantly.
If the target is unwilling, the effects of the sphere depend on the target’s [[Reflex]] save.
{{||SaveSuccessTable}}
Your healing energies create an aura of protection that defends your allies against more than just blades and arrows.
An ally that recovers Hit Points from your [[Lay on Hands]] gains a +1 status bonus to their saving throws until the end of their next turn.
//Implied by [[Elfbane Hobgoblin]].//
''Trigger'' You attempt a saving throw against a magical effect but haven’t rolled yet.
Your ancestral resistance to magic protects you.
You gain a +1 circumstance bonus to the triggering saving throw.
If the triggering effect is <<tag Arcane>>, you gain a +2 circumstance bonus instead.
//The action's name is flavor text. The ancestry of the magic user has no effect.//
{{||SpellSummaryTable}}
A shield of elemental energy protects a creature against one type of energy damage.
Choose <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, <<tag Fire>>, or <<tag Sonic>> damage.
The target and its gear gain [[Resistance]] 5 against the damage type you chose.
''Heightened (4th)'' The resistance increases to 10, and you can target up to two creatures.
''Heightened (7th)'' The resistance increases to 15, and you can target up to five creatures.
//Implied by the spell [[Moon Frenzy]].//
A creature can attempt to end the spell’s effect on itself by using a single action, which has the <<tag Rage>>trait, to attempt a [[Will]] save against your spell DC; on a success, it ends the spell’s effect on itself.
Your duskwalker heritage allows you to extend protection against negative energy to yourself or an ally in need.
You gain resistance 5 to <<tag Negative>> energy, and once per day, you can cast [[Death Ward]] as a divine innate spell.
When you roll a success on a saving throw against an <<tag Emotion>> effect, you get a critical success instead.
You’ve steeled your mind with resolve.
Your proficiency rank for [[Will]] saves increases to master.
When you roll a success on a Will save, you get a critical success instead.
This weapon can channel energy damage.
You gain the [[Conduct Energy]] free action while wielding a resonant weapon.
''Requirements'' You are wielding a melee weapon that deals bludgeoning damage.
You strike your enemy in the head with such force that their ears ring.
Make a melee [[Strike]].
If the Strike hits and deals damage, the target is [[Deafened]] until the start of your next turn (or for 1 minute on a critical hit).
Even your fears serve as fuel for your fighting spirit.
When you critically succeed at a [[Will]] save against a foe’s ability, you gain a +1 status bonus to saves and a number of temporary Hit Points equal to half your level for 1 minute.
These benefits are doubled if you critically succeed against a <<tag Fear>> effect.
''Trigger'' You or an ally benefiting from your composition spell would take <<tag Sonic>> damage.
You bring your performance to a sudden, dramatic finish, drowning out other sounds.
Your composition spell ends immediately, and all allies that had been benefiting from the spell’s effects gain sonic resistance against the triggering damage equal to twice the composition spell’s level.
You can cast difficult rituals that might otherwise be just beyond your skill.
You can attempt checks to cast a ritual that requires expert proficiency if you are trained, master proficiency if you are an expert, or legendary proficiency if you are a master.
{{||SpellSummaryTable}}
You conjure a towering mansion up to four stories tall and up to 300 feet on a side.
While Casting the Spell, you hold an image of the mansion and its desired appearance in your mind. The mansion can contain as many or as few rooms as you desire, and it is decorated as you imagine it. You can imagine a purpose for each room of the mansion, and the proper accouterments appear within.
Any furniture or other mundane fixtures function normally for anyone inside the mansion, but they cease to exist if taken beyond its walls.
No fixture created with this spell can create magical effects, but magical devices brought into the mansion function normally.
Your mansion contains the same types and quantities of foodstuffs and servants as created by the [[Magnificent Mansion]] spell.
Each of the mansion’s exterior doorways and windows are protected by [[Alarm]] spells. You choose whether each alarm is <<tag Auditory>> or <<tag Mental>> as you Cast the Spell, and each has a different sound (for an audible alarm) or sensation (for a mental one), allowing you to instantly determine which portal has been used.
//Implied by [[Call and Response]].//
While the spell is active, one ally affected by the spell can respond to your call as a single action that has the Auditory and Concentrate traits to extend the spell’s duration by 1 round. Only one ally can respond to a given call, and responding to the ally’s response has no additional effect.
//This action is implied by the [[Message]] spell.//
The target can give a brief response as a reaction, or as a free action on their next turn if they wish, but they must be able to see you and be within range //(120 feet)// to do so.
You perform at your best when you take enough time to rest and prepare.
Once every 24 hours, you can take a period of rest (typically 8 hours), after which you regain Hit Points equal to your [[Constitution]] modifier (minimum 1) times your level, and you might recover from or improve certain conditions (including [[Fatigued]], [[Doomed]] and [[Drained]]).
Each full 24-hour period a character spends resting during [[Downtime]] allows them to recover double what they would for an 8-hour rest. They must spend this time resting in a comfortable and secure location, typically in bed.
If they spend significantly longer in bed rest—usually from a few days to a week of downtime—they recover from all damage and most nonpermanent conditions. Characters affected by [[Disease]]s, long-lasting [[Poisons]], or similar [[Affliction]]s might need to continue attempting saves during downtime. Some curses, permanent injuries, and other situations that require magic or special care to remove don’t end automatically during long-term rest.
If you rest without any shelter or comfort, the GM may reduce the healing by half, to a minimum of 1 HP.
Sleeping in armor results in poor rest that leaves you [[Fatigued]], or prevents you recovering from being fatigued if you already were.
The 8 hours of rest do not need to be consecutive. //Characters interrupted, or taking a watch shift, during their rest may go back to sleep without resetting the clock.//
If characters are attacked while sleeping, all characters roll initiative with those who are sleeping taking a -4 for being [[Unconscious]]. They do not automaticaly wake up, but may make a [[Perception]] check to be woken by noise.
If you go more than 16 hours without resting, you become [[Fatigued]] (you cannot recover from this until you rest at least 6 continuous hours).
After you rest, you make your daily preparations, which takes around 1 hour. You can prepare only if you’ve rested, and only once per day. Preparing includes the following:
* Spellcasters regain spell slots, and prepared spellcasters choose spells to have available that day.
* //Alchemists produce new [[Infused Reagents]] and perform [[Advanced Alchemy]]. They lose their previous infused reagents and lose and end non-permanent effects of <<tag Infused>> items. [[Persistent Mutagen]]s wear off.//
* Focus Points, other abilities that refresh during your preparations, and abilities that can be used only a certain number of times per day, including magic item uses, are reset.
* You don armor and equip weapons and other gear.
* You invest up to 10 worn magic items to gain their benefits for the day.
If a spell’s duration says it lasts until your next daily preparations, on the next day you can refrain from preparing a new spell in that spell’s slot. (If you are a spontaneous caster, you can instead expend a spell slot during your preparations.) Doing so extends the spell’s duration until your next daily preparations. This effectively Sustains the Spell over a long period of time. If you prepare a new spell in the slot (or don’t expend a spell slot), the spell ends. You can’t do this if the spell didn’t come from one of your spell slots.
//There is no specific rules statement that daily preparations must be made immediately after completing a rest, although it is generally assumed so.//
{{||RitualSummaryTable}}
''Cost'' rare oils to anoint the body worth a total value of the target’s level (minimum 1) × 25 gp.
You call upon gods, spirits, and stranger beings to bar a creature’s spirit from ever returning.
A spirit that doesn’t wish to be so constrained can attempt a [[Will]] save to resist this ritual; on a critical success, it fools you into believing the ritual succeeded.
This ritual has no effect on a target who is undead or whose soul is otherwise not in the afterlife.
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
Restorative magic counters the effects of toxins or conditions that prevent a creature from functioning at its best.
When you cast restoration, choose to either reduce a condition or lessen the effect of a toxin.
A creature can benefit from only one restoration spell each day, and it can’t benefit from restoration more than once to reduce the stage of the same exposure to a given toxin.
* ''Reduce a Condition'' Reduce the value of the target’s [[Clumsy]], [[Enfeebled]], or [[Stupefied]] condition by 2. You can instead reduce two of the listed conditions by 1 each.
* ''Lessen a Toxin'' Reduce the stage of one toxin the target suffers from by one stage. This can’t reduce the stage below stage 1 or cure the affliction.
''Heightened (4th)'' Add [[Drained]] to the list of conditions you can reduce. When you lessen a toxin, reduce the stage by two. You also gain a third option that allows you to reduce the target’s [[Doomed]] value by 1. You can’t use this to reduce a permanent doomed condition.
''Heightened (6th)'' As the 4th-level restoration, but you can reduce a permanent doomed condition if you add a spellcasting action and a material component while Casting the Spell, during which you provide 100 gp worth of diamond dust as a cost.
{{||SpellSummaryTable}}
You manipulate the threads of time around the target, giving them some of the benefits of a day’s passage.
The target decreases the values of any [[Doomed]] and [[Drained]] conditions it has by 1 and can immediately attempt one saving throw against each [[Affliction]] it has with a stage length of 1 day or less.
The target is then temporarily immune for 1 day.
{{||SpellSummaryTable}}
You attempt to [[Counteract]] a single effect imposing the [[Blinded]] or [[Deafened]] conditions on the target, restoring its vision or hearing.
This can counteract both temporary magic and permanent consequences of magic, but it doesn’t cure someone who does not have the sense due to some natural state or effect, such as from birth or from a non-magical wound or toxin.
''Heightened (6th)'' The spell’s range increases to 30 feet, and you can target up to 10 creatures. You can choose the effect to counteract separately for each selected creature.
You’re tied up and can barely move, or a creature has you pinned.
You have the [[Flat-Footed]] and [[Immobilized]] conditions.
You can’t use any actions with the [[Attack]] or [[Manipulate]] traits except to attempt to [[Escape]] or [[Force Open]] your bonds.
[[Restrained]] overrides [[Grabbed]].
{{||RitualSummaryTable}}
''Cost'' Diamonds worth a total value of 75 gp times the target’s level.
You attempt to call forth the target’s soul and return it to its body. This requires the target’s body to be present and relatively intact. The target must have died within the past year.
If //the gods have// decided that the target’s time has come or the target doesn’t wish to return, this ritual automatically fails, but you discover this after the successful [[Religion]] check and can end the ritual without paying the cost.
''Heightened (6th)'' You can resurrect a target of up to 12th level, and the base cost is 125 gp.
''Heightened (7th)'' You can use resurrect even with only a small portion of the body; the ritual creates a new body on a success or critical success. The target must have died within the past decade. The ritual requires four secondary casters, each of whom must be at least half the target’s level. The target can be up to 14th level, and the base cost is 200 gp.
''Heightened (8th)'' As 7th level, but the target can be up to 16th level and the base cost is 300 gp.
''Heightened (9th)'' You can use resurrect even without the body as long as you know the target’s name and have touched a portion of its body at any time. The target must have died within the past century, and it doesn’t gain the negative conditions on a success. The ritual requires eight secondary casters, each of whom must be at least half the target’s level. The target can be up to 18th level, and the base cost is 600 gp.
''Heightened (10th)'' As 9th level, except it doesn’t matter how long ago the target died. The ritual requires 16 secondary casters, each of whom must be at least half the target’s level. The target can be up to 20th level, and the ritual’s base cost is 1,000 gp.
{{||ActionSuccessTable}}
You can cause a creature you bring back from the brink of death to thrive and continue healing.
When you restore Hit Points to a [[Dying]] creature or bring a dead creature back to life and restore Hit Points to it, you grant that creature [[Fast Healing]] 5 for 1 minute.
This fast healing ends if the creature is knocked [[Unconscious]].
''Requirements'' You are holding healer’s tools or are wearing them and have a hand free. Also, the target’s body is mostly intact.
You can use [[Medicine]] to resuscitate the dead.
Attempt a DC 40 Medicine check to revive a dead creature that has been dead for no more than 3 rounds.
If you succeed, the target returns to life with the effects of [[Raise Dead]], except it still has the [[Wounded]] condition it had before dying, increased by 1 (or wounded 1 if it wasn’t wounded before dying).
Whether you succeed or fail, the target is temporarily immune to Resuscitate for 1 day.
//Implied by [[Bon Mot]].//
The target can end the effect early with a retort to your Bon Mot. This can either be a single action that has the concentrate trait or an appropriate skill action to frame their retort. The GM determines which skill actions qualify, though they must take at least 1 action. Typically, the retort needs to use a linguistic Charisma-based skill action.
You gain a claw unarmed attack that deals 1d4 slashing damage.
Your claws are in the [[Brawling]] group and have the [[Agile]], [[Finesse]], and [[Unarmed]] traits.
Retraining offers a way to alter some of your character choices, which is helpful when you want to take your character in a new direction or change decisions that didn’t meet your expectations.
You can retrain feats, skills, and some selectable class features. You can’t retrain your ancestry, heritage, background, class, or ability scores.
You can’t perform other downtime activities while retraining.
Retraining usually requires you to spend time learning from a teacher, whether that entails physical training, studying at a library, or falling into shared magical trances. Your GM determines whether you can get proper training or whether something can be retrained at all. In some cases, you’ll have to pay your instructor.
Some abilities can be difficult or impossible to retrain (for instance, a sorcerer can retrain their bloodline only in extraordinary circumstances).
When retraining, you generally can’t make choices you couldn’t make when you selected the original option. For instance, you can’t exchange a 2nd-level skill feat for a 4th-level one, or for one that requires prerequisites you didn’t meet at the time you took the original feat. If you don’t remember whether you met the prerequisites at the time, ask your GM to make the call.
//You also can't make choices that would leave another previous choice invalid, such as retraining a choice of skill which allowed you to choose an different skill when taking a Dedication feat.//
If you cease to meet the prerequisites for an ability due to retraining, you can’t use that ability. You might need to retrain several abilities in sequence in order to get all the abilities you want.
You can spend a week of downtime retraining to swap out one of your <<tag Feat>>s. Remove the old feat and replace it with another of the same type. For example, you could swap a skill feat for another skill feat, but not for a wizard feat.
You can spend a week of downtime retraining to swap out one of your skill increases. Reduce your proficiency rank in the skill losing its increase by one step and increase your proficiency rank in another skill by one step. The new proficiency rank has to be equal to or lower than the proficiency rank you traded away. For instance, if your bard is a master in Performance and Stealth, and an expert in Occultism, you could reduce the character’s proficiency in Stealth to expert and become a master in Occultism, but you couldn’t reassign that skill increase to become legendary in Performance. Keep track of your level when you reassign skill increases; the level at which your skill proficiencies changed can influence your ability to retrain feats with skill prerequisites. You can also spend a week to retrain an initial trained skill you gained during character creation.
You can change a class feature that required a choice, making a different choice instead. This lets you change a druid order or a wizard school, for example. The GM will tell you how long this takes—always at least a month.
Retraining your choice of deity requires substantial downtime—in most cases, at least a month. A character who wishes to retrain into a different faith with similar concerns and domains requires less time to convert than a character moving into a radically divergent faith.
At the GM’s discretion, characters for whom divine patronage is essential but who lose faith completely can retrain into a new class. A champion might retrain as a fighter or a ranger, swapping out faith-based feats and class features for appropriate analogues. The length of downtime required in any of these cases is at the GM’s discretion, though the player and GM are advised to work together to determine a suitable time frame that does not fully interrupt play and can help tell a satisfying story.
{{||SpellSummaryTable}}
''Trigger'' A creature in range damages you.
You vengefully reflect your pain upon your tormentor.
The target takes <<tag Mental>>damage equal to half the amount it dealt to you when it triggered the spell.
''Trigger'' An enemy damages the user’s ally, and both are within 15 feet of the user.
The ally gains [[Resistance]] to all damage against the triggering damage equal to 2 + the user’s level.
If the foe is within reach, the user makes a melee [[Strike]] against it.
When you gain the Divine Smite ability, if you hit, the target takes persistent good damage equal to your [[Charisma]] modifier.
When you gain the Exalt ability, when you use Retributive Strike, each ally within 15 feet of you with the target in their melee reach can spend a reaction to [[Strike]] the target with a –5 penalty.
{{||SpellSummaryTable}}
Opening your mind to occult echoes, you gain impressions from past events that occurred in your current location.
Retrocognition reveals psychic impressions from events that occurred over the course of the last day throughout the first minute of the duration, followed by impressions from the next day back the next minute, and so on.
These echoes don’t play out like a vision but instead reveal impressions of emotions and metaphors that provide cryptic clues and details of the past.
If you witness a traumatic or turbulent event through an impression, the spell ends unless you succeed at a [[Will]] save with a DC of at least 30 and possibly as much as 50, depending on the severity of the event. The GM determines whether an event is traumatic and chooses the DC.
''Heightened (8th)'' You gain impressions of events that occurred over the previous year for each minute you concentrate, instead of the previous day, though the details diminish, making it harder to distinguish impressions from all but the most major events.
''Heightened (9th)'' You gain impressions of events that occurred over the previous century for each minute you concentrate, instead of the previous day, though the details diminish, making it almost impossible to distinguish impressions from all but the most major events.
//Because of the default limit on sustaining a spell, you cannot see more than 10 days/years/centuries back.//
Requirements You are in [[Monastic Archer Stance]], are wielding a bow, and have a free hand.
Snatching an arrow out of the air, you instantly put it to your bow and return fire.
When you successfully [[Deflect an Arrow|Deflect Arrow]], as part of that reaction you can immediately make a ranged bow Strike by firing the arrow you deflected from your own bow.
''Implied by [[Solid Lead]]''.
Even though you stopped following the solid lead, you can change back to your solid lead any number of times by using a single action, which has the Concentrate trait.
''Usage'' etched onto a thrown weapon.
When you make a thrown [[Strike]] with this weapon, it flies back to your hand after the [[Strike]] is complete.
If your hands are full when the weapon returns, it falls to the ground in your space.
You have mastered the technique of arcing a projectile so that it returns to your hand after being thrown, though this requires a moment to precisely calculate the trajectory and possible ricochets.
Make a ranged [[Strike]] with a thrown weapon. Once the Strike is complete, the weapon arcs or ricochets back to your hand.
If your hands are full when the weapon returns, it falls to the ground in your space.
You are adept at revealing—or creating—weaknesses among those who are a threat to civilization.
If you roll a success on a check to [[Recall Knowledge]] to identify an animal or a beast, you get a critical success instead.
The next time you damage that creature, it gains weakness 5 during that attack to one damage type of your choice that you dealt it.
{{AoA3Feat}}
You reveal that you played a minor but recurring role in another humanoid’s life — or at least convince them that’s the case.
Attempt a [[Deception]] check against the target’s [[Will]] DC.
On a success, the revelation makes them [[Frightened]] 2, and on a critical success they are [[Frightened]] 3.
In addition, you gain information about the subject as though you had attempted to [[Recall Knowledge]] about them using an appropriate skill and received the same result on your roll.
You can’t use this ability against the same humanoid again until 1 day has passed and you’ve also successfully disguised yourself as a different person.
''Special'' At the GM’s discretion, this feat can be used against non-humanoids if they have regular contact with humanoids or you are able to disguise yourself as a member of the target’s ancestry or type of creature.
You drive your piercing weapon into an imperceptible foe, revealing its location to your allies.
Make a [[Strike]] with the required melee weapon.
You don’t have to attempt a flat check to hit a [[Concealed]] creature, and you have to succeed at only a DC 5 flat check to target a [[Hidden]] creature.
If you hit and deal damage, you can drive the required weapon into a corporeal target, revealing its current position. You [[Release]] the weapon, and it becomes lodged in the target.
If the target is [[Concealed]], other creatures don’t need to succeed at a flat check to hit it. If the target is [[Hidden]], other creatures have to succeed at only a DC 5 flat check to target it.
The creatures need to be able to see your weapon to gain any of these benefits, and the target can’t become [[Undetected]] to anyone who sees your weapon.
If the target is [[Invisible]], the weapon remains visible while lodged in it.
This benefit lasts until the weapon is removed from the creature. An adjacent creature or the target can remove the weapon with 2 [[Interact]] actions.
//Revelation effects reveal the truth.//
''Trigger'' You would take <<tag Sonic>> damage from a spell.
You can manipulate the acoustics around you to deflect sonic damage back at its source.
Attempt a [[Performance]] check against the spell DC of the creature that cast the triggering spell.
{{||ActionSuccessTable}}
You are able to reverse engineer items into formulas more effectively than most.
You gain a +2 circumstance bonus to [[Crafting]] checks to reverse engineer a formula from an item.
Additionally, if you get a critical success on your Crafting check, you can opt to not only create the formula but also reassemble the original item at the same time, leaving you with the formula and the item instead of the formula and raw materials equal to half the item’s value.
{{||SpellSummaryTable}}
You reverse gravity in the area.
Creatures and objects that aren’t secured to the ground immediately fall upward to the top of the area.
A creature might be able to [[Grab an Edge]] to arrest its fall if it falls past an appropriate surface.
If a creature falls against a solid object (such as a ceiling), it takes the appropriate amount of [[Falling]] damage and lands on the surface.
Once an object or creature reaches the top of the area, it floats, caught between the normal and reversed gravity.
The creature can move along the plane where the two forms of gravity meet.
Creatures that can levitate or fly can use those abilities to mitigate the effects of reverse gravity.
When reverse gravity ends, all creatures and objects caught in the area fall back down.
Likewise, anything that moves beyond the spell’s area is subjected to normal gravity again.
{{||SpellSummaryTable}}
A burst of healing energy soothes living creatures and temporarily rouses those recently slain.
All living targets regain 10d8+40 Hit Points.
In addition, you return any number of dead targets to life temporarily, with the same effects and limitations as [[Raise Dead]].
The raised creatures have a number of temporary Hit Points equal to the Hit Points you gave living creatures, but no normal Hit Points.
The raised creatures can’t regain Hit Points or gain temporary Hit Points in other ways, and once revival’s duration ends, they lose all temporary Hit Points and die.
Revival can’t resurrect creatures killed by [[Disintegrate]] or a <<tag Death>>effect. It has no effect on <<tag Undead>>.
''Frequency'' once per day
''Trigger'' You have the [[Dying]] condition and are about to attempt a [[Recovery Check]].
Your nanites are programmed to automatically revive you.
You’re restored to 1 Hit Point, lose the [[Dying]] and [[Unconscious]] conditions, and can act normally on this turn.
You gain or increase the [[Wounded]] condition as normal when losing the dying condition in this way.
While under the effect of a mutagen, you can metabolize that mutagen’s power to heal yourself.
This uses a single action, which has the [[Concentrate]] and [[Manipulate]] traits.
Once the action is complete, you regain 1d6 Hit Points for every 2 item levels of the mutagen (minimum 1d6), but the mutagen’s duration immediately ends, even if you are under the effect of [[Persistent Mutagen]].
''Craft Requirements'' The initial raw materials must include 320 gp of rhinoceros hide (a common material).
This [[+1|Armor Potency]] [[Resilient]] hide armor is made from rhinoceros hide.
It has an armor check penalty of –1 instead of –2.
When you use the [[Sudden Charge]] class feat while wearing this armor, your Strike deals an additional 1d8 damage.
You adopt a stance designed to rebound your thrown weapons back toward you.
While you are in this stance, any thrown weapons you use as part of a ranged [[Strike]] to deal bludgeoning or slashing damage immediately return to your hand, enabling you to use them for additional Strikes.
You must be within the weapon’s listed range increment and have a hand free to catch the weapon.
If you make a ranged Strike with a thrown weapon outside of its listed range increment, it instead flies back toward you a number of feet equal to its listed range increment and then falls to the ground.
When you [[Command an Animal]] you’re mounted on to take a move action (such as [[Stride]]), you automatically succeed instead of needing to attempt a check.
Any animal you’re mounted on acts on your turn, like a [[Minion]]. If you [[Mount]] an animal in the middle of an encounter, it skips its next turn and then acts on your next turn.
Long ago, qlippoth marked someone in your lineage, most likely through their ancient runestones that dot Golarion’s surface. Yours is an old lineage, primordial and twisted, and you have a sense for similarly twisted things.
You’re trained in [[Occultism]]. If you’re already trained in Occultism (from your background or class, for example), you instead become trained in a skill of your choice.
You also gain the [[Oddity Identification]] skill feat.
{{||SpellSummaryTable}}
You must have a deity to cast this spell.
You focus all your divine energy and transform yourself into a Medium battle form, similar to your normal form but armed with powerful divine armaments granted by your deity.
While in this form, you gain the statistics and abilities listed below. You have hands in this battle form and can use <<tag Manipulate>> actions.
You can [[Dismiss]] the spell.
{{BattleFormWithHands}}
You gain the following statistics and abilities:
* AC = 20 + your level. Ignore your armor’s check penalty and Speed reduction.
* 10 temporary Hit Points.
* Speed 40 feet.
* [[Resistance]] 3 against physical damage.
* [[Darkvision]].
* A special attack with a righteous armament version of your favored weapon, which is the only attack you can use.
* [[Athletics]] modifier of +23, unless your own modifier is higher.
Your attack modifier with the special weapon is +21, and your damage bonus is +8 (or +6 for a ranged attack). If your attack modifier with your deity’s favored weapon is higher, you can use it instead.
You deal three of your weapon’s normal damage dice, or three damage dice of one size larger if your weapon is a simple weapon with a d4 or d6 damage die.
The weapon has one of the following properties that matches your deity’s alignment: [[Anarchic]], [[Axiomatic]], [[Holy]], [[Unholy]]. If your deity is true neutral, you instead deal an extra 1d6 precision damage.
''Heightened (8th)'' Your battle form is Large, and your attacks have 10-foot reach, or 15-foot reach if your deity’s favored weapon has reach. You must have enough space to expand into or thespell is lost. You instead gain AC = 21 + your level, 15 temporary HP, resistance 4 against physical damage, attack modifier +28, damage bonus +15 (+12 for a ranged attack), and Athletics +29.
You can cast [[Resist Energy]] twice per day as a divine innate spell, except you can target only yourself.
If you grant yourself resistance to fire damage, the resistance is equal to either the spell’s normal value or to your level, whichever is higher.
{{||SpellSummaryTable}}
You call down a chill wind.
When you Cast this Spell, you deal 2d4 cold damage to each creature in the area (basic [[Reflex]] save).
If a creature in the area critically fails its Reflex save and was standing, it also falls [[Prone]].
You also create a layer of ice on all surfaces in the area, which become [[Difficult Terrain]].
Unattended objects in the area become slick with ice, and picking them up requires a successful [[Reflex]] save or [[Acrobatics]] check against your spell DC.
The ice melts on any object that takes fire damage as well as in any square included in the area of a higher-level spell or effect with the <<tag Fire>> trait.
''Heightened (5th)'' The damage increases to 8d4 cold damage and the area is a 30-foot burst.
''Heightened (8th)'' The damage increases to 14d4 cold damage and the area is a 60-foot burst.
The water inside you is cold and frozen, like sheets of ice and frigid glaciers.
You gain resistance to cold equal to half your level (minimum 1), and you treat [[environmental cold effects|Temperature Effects]] as if they were one step less severe (incredible cold becomes extreme, extreme cold becomes severe, and so on).
This rose-gold ring is adorned in the center by a somewhat ominous-looking horned skull.
This ring gives you the power to cast the following innate arcane cantrips any number of times each day: [[Detect Magic]], [[Mage Hand]], and [[Prestidigitation]].
Each is cast as a 1st-level spell. If you are an arcane spellcaster, these can instead be heightened to the level of your cantrips.
This fanciful golden ring has an ornate band cast with delicate, swirling decorations and is inlaid with three bright-green emeralds.
While wearing this ring, you gain a +10-foot item bonus to your Speed, but only when determining your overland movement per hour.
''Activate'' {{ThreeAction}} (envision, interact); ''Effect'' You refresh yourself from fatigue. For 10 minutes, you can ignore the penalties from the [[Fatigued]] condition. This does not remove the condition, it merely suppresses the penalties and drawbacks of having the condition.
If something would cause you to become fatigued again while the ring’s power is in effect, the suppression ends, and you immediately take the penalties again.
''Trigger'' An ally’s turn begins.
''Requirements'' The ally hasn’t acted in the current combat.
You announce the triggering ally with a litany of their legendary achievements, spurring them to action.
The target is [[Quickened]] this turn and can spend the extra action to [[Stride]], [[Strike]], [[Demoralize]], [[Feint]], or [[Perform]].
''Requirements'' You are within 10 feet of water at least 10 feet deep, and your Speed is sufficient to reach the water in one [[Stride]].
''Trigger'' You successfully [[Grapple]] a creature of the same size as you or smaller.
You [[Stride]] up to 10 feet to enter the water, bringing the grabbed creature with you into the water.
Your surgery can bring a patient back from the brink of death, but might push them over the edge.
When you [[Treat Wounds]], you can deal 1d8 slashing damage to your patient just before applying the effects of Treat Wounds.
If you do, you gain a +2 circumstance bonus to your Medicine check to Treat Wounds, and if you roll a success, you get a critical success instead.
Your patron grants you the power to summon other creatures to aid you.
Choose one summon spell (such as [[Summon Animal]], [[Summon Construct]], and so forth) that appears on the spell list of your spellcasting tradition.
You can spend 10 minutes in communion with your familiar to replace one spell you’ve prepared in one of your witch spell slots with the spell you chose, heightened to the same level. The spell you replaced must be of at least the summon spell’s minimum spell level.
You can adapt your patron’s power to transform other creatures into forms more befitting their behavior or your whims.
Your familiar learns [[Baleful Polymorph]], even if baleful polymorph isn’t on your tradition’s spell list.
By spending 10 minutes in communion with your familiar, you can replace one spell of 6th level or higher you’ve prepared in one of your witch spell slots with a [[Baleful Polymorph]] spell of the same level.
Careful research into the art of rituals has made you better at performing them.
You gain a +2 circumstance bonus to all primary and secondary checks you attempt as part of casting a ritual.
You can temporarily revert to a less conspicuous form without diminishing your senses. You take the form of an ordinary specimen of the type of plant or fungus that most closely resembles you, reverting to your body’s appearance just before your spirit joined with it.
This otherwise has the effects of [[Tree Shape]], except that your size remains Small.
1:20
2:23
3:25
4:28
5:31
6:33
7:36
8:39
9:41
10:44
{{||RitualSummaryTable}}
{{||ActionSuccessTable}}
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="1em" height="1em" viewBox="0 0 44.268 44.268" style="enable-background:new 0 0 44.268 44.268;" xml:space="preserve">
<g>
<g>
<path style="fill:#030104;" d="M7.175,24.655c-0.098,0.112-0.151,0.229-0.151,0.346v0.138v12.132c0,0.754,2.071,1.395,4.966,1.639
V26.392c-2.041-0.224-3.455-0.699-3.455-1.253c0-0.555,1.414-1.03,3.455-1.253v-0.368c-0.067-0.197-0.126-0.406-0.168-0.641
C9.467,23.172,7.689,23.839,7.175,24.655z"/>
<path style="fill:#030104;" d="M37.093,24.656c-0.51-0.818-2.287-1.481-4.647-1.778c-0.042,0.235-0.101,0.444-0.168,0.641v0.368
c2.041,0.223,3.455,0.697,3.455,1.253c0,0.554-1.414,1.03-3.455,1.253v12.518c2.896-0.246,4.966-0.885,4.966-1.64V25.139v-0.137
C37.244,24.883,37.191,24.767,37.093,24.656z"/>
<path style="fill:#030104;" d="M20.952,9.369c0.047,0.172,0.096,0.237,0.137,0.237c0.056,0,0.096-0.122,0.091-0.249
c-0.005-0.13-0.008-0.263-0.008-0.397c0-1.649,0.43-2.985,0.962-2.985s0.962,1.337,0.962,2.985c0,0.275-0.011,0.541-0.033,0.794
c-0.009,0.107,0.001,0.159,0.023,0.159c0.068,0,0.255-0.478,0.39-1.298c0.141-0.854,0.222-1.856,0.222-2.925
c0-3.143-0.7-5.69-1.564-5.69C21.27,0,20.57,2.546,20.57,5.69c0,1.07,0.081,2.07,0.222,2.925
C20.841,8.914,20.898,9.168,20.952,9.369z"/>
<path style="fill:#030104;" d="M29.501,9.594c-0.574-0.25-1.27-0.47-2.06-0.65c-0.344-0.079-0.674-0.114-0.967-0.114
c-0.623,0-1.078,0.157-1.146,0.384c-0.099,0.333,0.674,0.659,1.756,0.887c1.455,0.307,2.367,0.747,2.367,1.238
c0,0.929-3.275,1.68-7.317,1.68c-4.04,0-7.316-0.751-7.316-1.68c0-0.491,0.911-0.931,2.367-1.238
c1.081-0.228,1.855-0.553,1.755-0.887c-0.068-0.227-0.522-0.384-1.145-0.384c-0.293,0-0.623,0.035-0.967,0.114
c-0.789,0.181-1.484,0.401-2.059,0.652c-1.012,0.442-1.672,1.235-1.727,1.352c-0.035,0.074-0.053,0.15-0.053,0.226v0.166v15.138
v12.501v3.176c0,1.168,4.094,2.113,9.145,2.113s9.145-0.945,9.145-2.113v-3.176V26.477V11.339v-0.166
c0-0.076-0.018-0.152-0.053-0.226C31.172,10.83,30.514,10.035,29.501,9.594z"/>
</g>
</g>
</svg>
You have begun to master the difficult art of casting rituals.
You gain a +2 circumstance bonus to all primary checks to perform a ritual.
You learn two uncommon rituals with a level no higher than half your level; you must meet all prerequisites for casting the ritual to choose it.
At 8th level and every 4 levels thereafter, you learn another uncommon ritual with a level no higher than half your level and for which you meet the prerequisites.
You can cast these as the primary caster, but you can’t teach them to anyone else or allow someone else to serve as primary caster unless they know the ritual as well.
<<archetypefeatlist "6 8 10 14" "Ritualist">>
<table>
<tr><th>Level</th><td>{{!!m-level}}</td></tr>
<tr><th>Cast Time</th><td>{{!!m-time}}</td></tr>
<tr><th>Range</th><td>{{!!m-range}}</td></tr>
<tr><th>Area</th><td>{{!!m-area}}</td></tr>
<tr><th>Target</th><td>{{!!m-targets}}</td></tr>
<tr><th>Duration</th><td>{{!!m-duration}}</td></tr>
<tr><th>Secondary Casters</th><td>{{!!rit-secondaries}}</td></tr>
<tr><th>Primary Checks</th><td><<spacedlist "[list[!!rit-pskill]]">></td></tr>
<tr><th>Secondary Checks</th><td><<spacedlist "[list[!!rit-sskill]]">></td></tr>
<tr><th>Primary Skill Proficiency</th><td>{{!!rit-pspre}}</td></tr>
</table>
When you succeed at an [[Athletics]] check to [[Swim]], you get a critical success instead.
{{||SpellSummaryTable}}
You channel the might of dragons into your voice, letting out a roar that engenders respect in dragonkind but that instills fear in most other creatures.
The impressive roar grants you a +2 circumstance bonus to [[Diplomacy]] checks for 10 minutes against dragons that were in the area at the time of casting.
All enemies within the area other than dragons must attempt a [[Will]] save; to these enemies, roar of the wyrm is a fear effect.
{{||SaveSuccessTable}}
Roar of the wyrm affects non-dragon creatures with deep ties to dragonkind (such as a barbarian with the draconic instinct, a sorcerer with the draconic bloodline, or a member of a culture that reveres dragons) as if they had the dragon trait. The GM decides if a creature is aligned enough with dragonkind to be affected in this way.
''Prerequisites'' Expert in [[Medicine]].
You learned folk medicine to help recover from diseases and poison, and using it diligently has made you especially resilient.
When you [[Treat Disease]] or a [[Treat Poison]], or someone else uses one of these actions on you, increase the circumstance bonus granted on a success to +4.
If the result of the patient’s saving throw is a success, the patient gets a critical success.
You gain a +2 circumstance bonus to your Fortitude or Reflex DC against attempts to [[Shove]] or [[Trip]] you.
This bonus also applies to saving throws against spells or effects that attempt to knock you [[Prone]].
In addition, if any effect would force you to move 10 feet or more, you are moved only half the distance.
Your innate connection to stone makes you adept at moving across uneven surfaces.
You can ignore [[Difficult Terrain]] caused by rubble and uneven ground made of stone and earth.
In addition, when you use the [[Acrobatics]] skill to [[Balance]] on narrow surfaces or uneven ground made of stone or earth, you aren’t [[Flat-Footed]], and when you roll a success at one of these Acrobatics checks, you get a critical success instead.
''Usage'' etched onto medium or heavy armor.
{{AoA4Rune}}
Rock-braced armor makes you as hard to move as a boulder.
Whenever another creature attempts to forcibly move you from your space, you gain a +4 item bonus to your Fortitude DC against the check to move you.
If the creature would not normally need to attempt a check to move you, then the creature must succeed at an [[Athletics]] check against your [[Fortitude]] DC (including the +4 item bonus) or you are unmoved.
This long, plain, leaden rod can disrupt magic.
''Activate'' {{TwoAction}} [[Interact]]; ''Effect'' This rod emits a thin, gray beam that negates a spell or magic item, casting a 6th-level [[Dispel Magic]] spell with a counteract modifier of +23. Once activated, the rod can’t be activated again for 2d6 hours.
This peculiar rod is strange and unpredictable.
Each time it is activated, it produces one of a variety of effects at random.
''Activate'' {{TwoAction}} Command, [[Interact]]; ''Effect'' Choose a creature within 60 feet and roll d% on the table below to determine the rod’s effect.
If an entry lists only a spell name, the rod casts that spell at its lowest level. You make any decisions for a spell cast by the rod unless otherwise indicated, except that it must target the creature you chose, or the creature you chose must be the center of the spell’s area, if it has an area but no targets.
If the spell’s range is less than 60 feet, increase the range to 60 feet.
Any spell DC required is DC 27, and any spell attack roll required is +17.
If the rod casts a spell on you, you don’t get a saving throw or other defense against it.
The rod can’t be activated again for 1d4 hours.
| !d% | !Wondrous Effect |
|1-3 |Leaves grow from the target; they last 24 hours |
|4-8 |[[Darkness]] |
|9 |Summon a giant stag beetle (5th-level [[Summon Animal]]) |
|10-13 |A stream of 600 large and colorful butterflies pours forth, fluttering in a 20-foot burst for 2 rounds; creatures are [[Blinded]] while in the cloud of butterflies |
|14-15 |All the target's weapons animate with the effect of the [[Dancing]] rune |
|16-25 |[[Lightning Bolt]] |
|26–29 |Grass grows in a 60-foot [[Cone]] in front of the rod, or existing grass grows at 10 × normal rate |
|30 |Target turns blue, green, or purple with an unlimited duration |
|31 |Summon an elephant (6th-level [[Summon Animal]]) |
|32–34 |Heavy rain falls in a 60-foot radius around you for 1 round |
|35–38 |[[Stinking Cloud]] |
|39 |Summon an ineffective mouse (1st-level [[Summon Animal]]) |
|40–42 |[[Vibrant Pattern]], with a 1-round duration |
|43–44 |The rod casts [[Mirror Image]] on you |
|45–46 |[[Gust of Wind]] |
|47–48 |The non-living, unattended object closest to the target (up to 30 cubic feet in size) turns ethereal for an unlimited duration |
|49–53 |[[Slow]] |
|54 |You turn blue, green, or purple with an unlimited duration |
|55–59 |The rod casts [[Pest Form]] on you, lasting 1d4 rounds |
|60–61 |1d4 × 10 gems, each worth 1 sp, shoot from the rod, dealing 1 piercing damage to each creature in a 15-foot [[Cone]] |
|62 |[[Sleep]], with a 100-foot [[Burst]] |
|63–72 |[[Fireball]] |
|73–77 |[[Mind Reading]] |
|78-80 |Roll again; the target believes you created the effect of the second roll |
|81–84 |[[Enlarge]] |
|85–87 |Target is coated in nectar, making it [[Clumsy]] 1 for 1 round |
|88–92 |[[Faerie Fire]] |
|93–97 |The rod casts [[Invisibility]] on you |
|98–100 |The rod casts [[Shrink]] on you, lasting 1 day |
!! Splats
<$list filter="[tag<currentTiddler>tag[Splat]sort[]]" />
!! Class Features
| !Level | !Features |
| 1 | [[Sneak Attack]] 1d6, [[Surprise Attack]], Extra Skill Feat |
| 2 | |
| 3 | [[Deny Advantage]], Extra Skill Feat |
| 4 | |
| 5 | [[Sneak Attack]] 2d6, [[Weapon Tricks]], Extra Skill Feat |
| 6 | |
| 7 | [[Evasion]], [[Vigilant Senses]], [[Weapon Specialization]], Extra Skill Feat |
| 8 | |
| 9 | [[Debilitating Strike]], [[Great Fortitude]], Extra Skill Feat |
| 10 | |
| 11 | [[Rogue Expertise]], [[Sneak Attack]] 3d6, Extra Skill Feat |
| 12 | |
| 13 | [[Improved Evasion]], [[Incredible Senses]], [[Light Armor Expertise]], [[Master Tricks]], Extra Skill Feat |
| 14 | |
| 15 | [[Greater Weapon Specialization]], [[Double Debilitation]], Extra Skill Feat |
| 16 | |
| 17 | [[Sneak Attack]] 4d6, [[Slippery Mind]], Extra Skill Feat |
| 18 | |
| 19 | [[Master Strike]], [[Light Armor Mastery]], Extra Skill Feat |
| 20 | |
!! Class Feats
{{||ClassFeatList}}
You gain a skill feat and the rogue’s [[Surprise Attack]] class feature.
You become trained in light armor.
In addition, you become trained in [[Stealth]] or [[Thievery]] plus one skill of your choice; if you are already trained in both [[Stealth]] and [[Thievery]], you become trained in an additional skill of your choice.
You become trained in rogue class DC.
<<levelfeatlist "4 6 8 10 12" "[tag[Archetype]field:feat-arch[Rogue]]">>
Your techniques are now harder to resist.
Your proficiency rank for your rogue class DC increases to expert.
Ancestral spirits have begun to bond themselves to you, granting you powers characteristic of a rokoa.
You can cast [[Speak With Animals]] and [[Status]] as primal innate spells once per day each.
''Trigger'' A foe hits you with a melee weapon or unarmed attack.
When you take a big hit, your foe bounces you around like a rubber ball, but you escape the worst of the blow.
Your foe can move you any distance of its choice up to 30 feet in a direction of its choice (this is not forced movement, and it triggers reactions as normal).
You fall [[Prone]] and are [[Stunned]] 1.
Attempt a DC 6 flat check. On a success, you take minimum damage from the attack, and on a
critical success, if the attack was a critical hit, you don’t take double damage from the critical hit.
You gain 10 Hit Points from your ancestry instead of 8. You can go without sunlight for 2 weeks before you begin to starve. You gain a +2 circumstance bonus to your [[Fortitude]] or [[Reflex]] DC against attempts to [[Shove]] or [[Trip]] you. This bonus also applies to saving throws against spells or effects that attempt to move you or knock you prone.
Your talismans ward against foul magic.
During your [[daily preparations|Rest]], you can assemble a small pouch with bits of herbs, hair, sacred oils, and other ritual ingredients, which you give to one ally.
The first time that day the ally attempts a saving throw against a spell or haunt, they gain a +1 circumstance bonus to the roll. This bonus increases to +2 if you’re an expert in Occultism or +3 if you’re legendary.
You run and climb across ropes and rigging almost as easily as on the ground.
You gain a climb Speed of 15 feet, but only on ship’s rigging or similar ropes.
Whenever you succeed at an [[Athletics]] check to [[Climb]] a rope or an [[Acrobatics]] check to [[Balance]] on a rope, you get a critical success instead.
You aren’t [[Flat-Footed]] while Climbing or Balancing on a rope.
{{||SpellSummaryTable}}
You cause the target rope to rise vertically into the air. Where it ends, an extradimensional space opens, connected to the top of the rope. This space can be reached only by climbing the rope.
The entrance to the space can’t be seen, and it can be pinpointed only by the presence of the rope.
The rope can’t be removed or hidden, though it can be detached from the extradimensional space by pulling it with 16,000 pounds of weight, critically succeeding at an [[Athletics]] check against the spell’s DC, or destroying the rope.
The space holds up to eight Medium creatures and their gear. A Large creature counts as two Medium creatures, a Huge creature counts as four Medium creatures, and a Gargantuan creature fills the space on its own.
If the rope is detached or destroyed, or if a creature attempts to enter the space that would put it over its capacity, the space begins to unravel. It disappears in 1d4 rounds, depositing the creatures within safely on the ground below.
You are especially good at riding traditional goblin mounts. You gain the [[Ride]] feat, even if you don’t meet the prerequisites. You gain a +1 circumstance bonus to [[Nature]] checks to use [[Command an Animal]] on a goblin dog or wolf mount.
You can always select a wolf as your animal companion, even if you would usually select an animal companion with the mount special ability, such as for a champion’s steed ally.
Your elven lineage is subtle enough that you look barely different from other humans, and you’ve learned to use that to your advantage.
You gain the trained proficiency rank in [[Deception]] (or another skill of your choice, if you were already trained in Deception).
You gain a +4 circumstance bonus to [[Impersonate]] checks to pretend you aren’t a half-elf.
Observers are never granted circumstance bonuses to Perception checks due to you Impersonating a full-blooded human, and you never take circumstance penalties due to you Impersonating a full-blooded human.
''Special'' You can take this feat only at 1st level, and you can’t retrain out of this feat or into this feat..
You were born to a jiang-shi, one of the so-called hopping vampires found most often in Tian-Xia. Your parent had a supernatural obsession with counting small objects, which manifests in you as a preternatural gift for linguistics and mathematics.
You are trained in [[Society]] and gain the [[Eye for Numbers]] skill feat. If you would automatically become trained in [[Society]] (from your background or class, for example), you instead become trained in a skill of your choice.
You prefer to strong-arm or intimidate others rather than rely on finesse or fancy tricks. You might be an enforcer for organized crime, a highway bandit, or a noble who bullies others with threats of your family’s power. Or, you might use your skills on the up and up, in a private security detail or as a guard in a city with the right temperament. You use whatever tools you have at hand to get the job done.
You can deal [[Sneak Attack]] damage with any simple weapon, in addition to the weapons listed in the sneak attack class feature.
When you critically succeed at an attack roll using a simple weapon and the target has the [[Flat-Footed]] condition (unable to focus on defending itself), you also apply the [[Critical Specialization Effect]] for the weapon you’re wielding. You don’t gain these benefits if the weapon has a damage die larger than d8 (after applying any abilities that alter its damage die size).
You’re trained in [[Intimidation]] and medium armor.
You can choose [[Strength]] as your key ability score.
When you gain light armor expertise, you also gain expert proficiency in medium armor, and when you gain light armor mastery, you also gain master proficiency in medium armor.
Most magic weapons and armor gain their enhancements from potent eldritch runes etched into them.
Low-grade items can be used in the creation of magic items of up to 8th level, and they can hold runes of up to 8th level.
Standard-grade items can be used to create magic items of up to 15th level and can hold runes of up to 15th level.
High-grade items use the purest form of the precious material, and can be used to Craft magic items of any level holding any runes. Using purer forms of common materials is so relatively inexpensive that the Price is included in any magic item.
[[Orichalcum Weapon]]s can have four magic property runes instead of three.
<table>
<tr><th>Level</th><th>Runes</th><th>Price</th></tr>
<$list filter="[range[1,20]]" variable="level">
<tr><th><<level>></th>
<td>
<$list filter="[tag[Rune]contains:item-level<level>sort[]]">
<$list filter="[range[1,10]]" variable="index">
<$list filter="[list[!!item-level]nth<index>match<level>]" variable="matchedlevel">
<$list filter="[list[!!item-variants]nth<index>!match[Standard]]"><<currentTiddler>></$list>
<$link />
<br>
</$list>
</$list>
</$list>
</td>
<td>
<$list filter="[tag[Rune]contains:item-level<level>sort[]]">
<$list filter="[range[1,10]]" variable="index">
<$list filter="[list[!!item-level]nth<index>match<level>]" variable="matchedlevel">
<$list filter="[list[!!item-price]nth<index>]"><<currentTiddler>></$list>
<br>
</$list>
</$list>
</$list>
</td>
</tr>
</$list>
</table>
{{LOWGFeat}}
Whether through blood or by exposure to rune magic, you have become runescarred, with visible, glowing runes on your body in the form of tattoos or scars. You might have possessed these marks before gaining the archetype, but you only truly became runescarred when you chose to study and tap into the runes’ power.
You become an expert in [[Arcana]] and you also become trained in Thassilon [[Lore]], or an expert in Thassilon Lore if you were already trained in it.
Choose one cantrip from the arcane list. One of the runes on your body corresponds to the chosen cantrip, and you can cast the chosen cantrip as an innate arcane spell.
<<archetypefeatlist "4 6 10" "Runescarred">>
This flat piece of hard stone is specially prepared for etching a magical fundamental rune or property rune.
You can etch only one rune upon a stone.
Once the stone is etched, it gains the magic school trait of the rune etched upon it.
When a rune is transferred from the runestone to another object, the runestone cracks and is destroyed.
The Price listed is for an empty stone; a stone holding a rune adds the Price of the rune.
You can reload your weapon on the move.
You [[Stride]], [[Step]], or [[Sneak]], then [[Interact]] to reload.
You gain the [[Group Coercion]] skill feat. If you roll a success on an [[Intimidation]] check to [[Coerce]] a goblin (but not other creatures with the goblin trait), you get a critical success instead; if you roll a critical failure, you get a failure instead.
Unlike most of your kind, who dismiss goblins as embarrassments or expendable annoyances, you have studied the methodology behind their irresponsible and incomprehensible actions.
You gain the [[Adopted Ancestry]] general feat and must select [[Goblin]] as the feat’s chosen ancestry. You also gain one 1st-level goblin ancestry feat.
{{||SpellSummaryTable}}
You cause the target to rapidly rust.
This magical rust can affect nonferrous materials, but the target must be all or mostly metal. Skymetals such as [[Adamantine]] and [[Orichalcum]] are immune to this rust, and the GM might determine other precious materials are similarly resilient. Ultimately, the GM decides if an object or creature can be targeted with this spell.
All damage from this spell ignores Hardness.
If the spell causes [[Persistent Damage]] from rust, a creature can attempt to scrape off the rust to assist the target in recovering from the persistent damage (reducing the DC of the flat check to end persistent damage to 10 and granting an immediate flat check).
The effect of the spell depends on its target.
''Creature or Hazard'' A creature or hazard must be made of all or mostly metal to be affected (this includes many mechanical traps). It takes 8d6 damage (basic [[Fortitude]] save), plus 2d6 persistent damage on a failed save. Touching a hazard to affect it with this spell might trigger the hazard, as determined by the GM.
''Item'' The rust deals 2d6 damage, subject to a basic [[Reflex]] save by the creature wearing or holding the item; if the item is unattended, it automatically gets a critical failure. On a failed save, the item also takes 1d6 persistent damage.
For an attended item, this persistent damage occurs at the end of the attending creature’s turns; if the item was unattended when you Cast the Spell, the damage happens at the end of your turns.
When targeting armor someone is wearing, its Bulk is 1 higher than the listed value, since carrying armor is more cumbersome than wearing it.
Thin iron or steel items, such as weapons, have 20 HP and a Broken Threshold of 10, and thicker iron or steel items, such as most suits of armor, have 36 HP and a Broken Threshold of 18.
''Heightened (+1)'' Increase the initial damage to creatures or hazards by 2d6, and increase the maximum Bulk of an item you can target by 1.
You have long fangs, natural or augmented.
You gain a jaws unarmed attack that deals 1d6 piercing damage.
Your jaws are in the brawling group and have the unarmed trait.
You subtly damage others’ equipment.
Choose one item that a creature within your reach wields or carries. The item must have moving parts that you could possibly sabotage (a shortbow could be sabotaged, but a longsword could not).
Attempt a [[Thievery]] check against the [[Reflex]] DC of the creature.
Damage dealt by Sabotage can’t take the item below its Break Threshold.
{{||ActionSuccessTable}}
You are a great warrior that can stand strong against the fiercest opponents to your cause.
You gain resistance 10 to bludgeoning, piercing, and slashing damage caused by creatures and effects opposed to your tenets (evil creatures for tenets of good, good creatures for tenets of evil, and so on).
In addition, creatures and effects that roll a natural 20 on an attack roll against you don’t improve their result by one degree of success.
You call upon your deity to grant you their protective blessing.
Attempt a DC 30 [[Religion]] check.
If you have legendary proficiency in Religion, you can instead attempt a DC 40 Religion check to increase the temporary Hit Points you gain on a successful check to 15 (25 on a critical success).
{{||ActionSuccessTable}}
The power of your faith suffuses your ki.
When you select this feat, choose <<tag Chaos>>, <<tag Evil>>, <<tag Good>>, or <<tag Law>>. Your choice must match one of your deity’s alignment components.
When you cast the [[Ki Strike]] focus spell and damage a creature whose alignment is opposite your chosen alignment, you can choose for the ki strike damage to be of the chosen type.
Additionally, you can substitute the damage from [[Ki Blast]] (or other ki spells that deal force damage, at the GM’s discretion) with damage of your chosen alignment.
''Trigger'' You are hit by a Strike that deals physical damage.
With divine awareness, you twist your body to lessen the impact of an attack.
Reduce the damage you take by an amount equal to twice your armor’s level.
Your armor becomes broken, reducing its Hit Points to its Broken Threshold.
If your armor was already damaged, it is destroyed instead.
You establish a safe house—a secure space in which to hide your secrets from the outside world.
This safe house is roughly the size of a 10-foot cube. It’s in a location you have access to, and it can be part of a larger building or structure, like a hidden room or an underground cave.
The safe house protects objects and people inside it from magical detection. This has the effects of [[Nondetection]], using your [[Deception]] modifier for the counteract DC and half your level rounded up for the counteract level.
Setting up or moving your safe house takes a week of downtime.
The size of the safe house expands to four 10-foot cubes if you’re an expert in [[Deception]], eight cubes if you’re a master, and 16 cubes if you’re legendary.
{{||SpellSummaryTable}}
You repel dangers from all around you, making passage through the chosen area safe for a brief amount of time.
Anyone passing through the area gains the following benefits against harmful effects of the terrain and environment, including environmental damage, hazardous terrain, and hazards in the area.
The spell grants a +2 status bonus to AC and saves against such effects, and [[Resistance]] 5 to all damage from such effects.
Furthermore, the spell prevents anything in the area that’s prone to collapse, such as a rickety bridge or an unstable ceiling, from collapsing, except under extreme strain that would collapse a normal structure of its type.
Safe passage protects only against harm, not inconvenience, and it doesn’t reduce [[Difficult Terrain]], remove the [[Concealed]] condition caused by precipitation, or the like, nor does it protect against creatures within the spell’s area.
''Heightened (5th)'' The granted resistance increases to 10, and the area can be 120 feet long.
''Heightened (8th)'' The granted resistance increases to 15, and the area can be 500 feet long.
{{||SpellSummaryTable}}
You ensure a secret remains safe from prying spies.
Choose one piece of information that at least some of the targets know; you can target a creature only if it remains within range for the full minute during which you Cast the Spell.
The spell grants those who know the piece of knowledge you have chosen a +4 status bonus to skill checks (typically [[Deception]] checks) to conceal this knowledge and to saving throws against spells that specifically attempt to obtain this knowledge from them and effects that would force them to reveal it.
If you Cast this Spell again, any previous safeguard secret you had cast ends.
You bring the magical wavelengths of your spell into sync with the ones produced by your own body.
If the next action you take is to [[Cast a Spell]] with an area, you aren’t affected by the spell even if you are within the area.
This elixir is made from salamander scales to withstand fire.
For 24 hours, you are protected from the effects of some levels of [[heat|Temperature Effects]].
| !Type | !Level | !Price | !Protects against |
| Lesser | 4 | 150 | Severe |
| Moderate | 12 | 3200 | Severe, Extreme |
| Greater | 16 | 14000 | Severe, Extreme, Incredible |
''Frequency'' once per day;
''Trigger'' A creature that has blood and is not at its maximum Hit Points hits you with a melee [[Strike]];
You channel salt and brine from your blood into the creature’s wounds.
The creature must attempt a [[Fortitude]] save using your class DC or spell DC, whichever is higher.
On a failure, the creature takes 1d6 persistent acid damage and is [[Sickened]] 1 by the pain. On a critical failure, it instead takes 2d6 persistent acid damage and is [[Sickened]] 2.
Applying this filmy salve to a creature helps it overcome magical paralysis.
The creature recovers as if it were the target of a 3rd-level [[Remove Paralysis]] spell.
| !Type | !Level | !Price | !Spells |
| Standard | 6 | 400 | 3rd-level [[Remove Paralysis]] |
| Greater | 12 | 3250 | 6th-level [[Remove Paralysis]] and [[Stone to Flesh]] |
This greenish, persistent grease can be applied to armor to make it extremely slippery for 8 hours, granting the wearer a +2 item bonus to [[Acrobatics]] checks to [[Escape]] or to [[Squeeze]].
{{||SpellSummaryTable}}
''Cost'' 1 vial of [[Holy Water]].
You sanctify the area, sprinkling it with holy water and warding it against your foes.
Choose <<tag Aberration>>s, <<tag Celestial>>s, <<tag Dragon>>s, <<tag Fiend>>s, <<tag Monitor>>s, or <<tag Undead>>.
All creatures in the area gain a +1 status bonus to AC, attack rolls, damage rolls, and saving throws against the chosen creatures.
{{||SpellSummaryTable}}
You ward a creature with protective energy that deters enemy attacks.
Creatures attempting to attack the target must attempt a [[Will]] save each time.
If the target uses a [[Hostile Action]], the spell ends.
{{||SaveSuccessTable}}
''Requirements'' You must spend 10 minutes just after your daily preparations examining the sky or consulting a star chart or you can’t use this action that day.
If your next action requires you to attempt one or more skill checks, roll 1d8 //on the table below and take the given value as a circumstance modifier// to the first skill check you attempt.
| !1d8 | !Circumstance modifier |
| 8 | +2 |
| 7 | +2 |
| 6 | +2 |
| 5 | +1 |
| 4 | +1 |
| 3 | +1 |
| 2 | 0 |
| 1 | -1 |
You draw the life force out of your enemies to heal your own wounds.
When you cast a [[Harm]] spell and damage at least one living creature, you regain Hit Points equal to the spell level of your harm spell.
If you aren’t a living creature, you gain no benefit from this feat.
The wounds you inflict are grievous.
When you [[Strike]] with a weapon or unarmed attack for which you have legendary proficiency, you critically succeed if you roll a 19 on the die as long as that result is a success.
This has no effect on a 19 if the result would be a failure.
<$list filter="[all[current]tag[Incapacitation]tag[Spell]]">
<p style="border: 1px solid black; padding:2px; background-color: tomato">''Incapacitation effect: All targets of more than twice the spell level use the result one better than the save they rolled.''</p>
</$list>
<$list filter="[all[current]tag[Incapacitation]!tag[Spell]]">
<p style="border: 1px solid black; padding:2px; background-color: tomato">''Incapacitation effect: All targets of higher level than the effect use the result one better than the save they rolled.''</p>
</$list>
|!Critical Success|{{!!s-crit}}|
|!Success|{{!!s-hit}}|
|!Failure|{{!!s-fail}}|
|!Critical Failure|{{!!s-fumble}}|
''Trigger'' An opponent critically hits you with a melee attack.
You quickly whirl your blade, trying to deflect enough momentum to avoid the worst of the attack.
Attempt a DC 16 flat check.
If you succeed, the attack becomes a normal hit, instead of a critical hit.
Affix to armor.
''Requirements'' You're an expert in [[Reflex]] //saves//.
''Trigger'' You attempt to [[Grab an Edge]] but haven't rolled.
This pyramid-shaped spike is attached to an armor’s chest piece.
When you activate {{FreeAction}} the spike, it shoots a strand of force to help you gain purchase.
If you roll a success on the triggering attempt, you get a critical success instead (if you roll a critical failure, you get a failure instead).
{{||SpellSummaryTable}}
You inflict pain upon the target and revel in their anguish.
This deals 1d4 mental damage and 1d4 persistent mental damage; the target must attempt a Will save.
{{||SaveSuccessTable}}
As long as the target is taking persistent damage from this spell, you gain a +1 status bonus to attack rolls and skill checks against the target.
''Heightened (+1)'' The initial damage increases by 1d4 and the persistent damage increases by 1d4.
Your bodily fluids burn with surprising volatility, as if you ran on oil instead of blood.
As long as you are taking persistent fire damage, you gain a boiling spit ranged unarmed attack with a range of 30 feet that deals 1d6 fire damage.
Scales grow across your body, protecting you against physical and magical threats.
When you’re unarmored, the scales give you a +2 status bonus to AC with a Dexterity cap of +2.
Your resistance from Dragon Disciple Dedication increases to 3 + half your level.
Your stratagems benefit from your precise knowledge of anatomy.
When you critically hit with an attack on which you substituted your attack roll due to [[Devising a Stratagem|Devise a Stratagem]], if your attack dealt piercing or slashing damage, you also deal 1d6 persistent bleed damage to your target.
''Requirements'' You are adjacent to at least one enemy.
You instinctively know how to flee danger.
You [[Stride]] up to your Speed, with a +5-foot status bonus to your Speed, and you gain a +2 circumstance bonus to AC against reactions triggered by this movement.
You must end this movement in a space that’s not adjacent to any enemy.
You are used to ducking under foes and can scurry around the battlefield with ease.
You gain a +1 circumstance bonus to [[Acrobatics]] checks to [[Tumble Through]] the spaces of Medium or larger enemies, and the presence of an enemy doesn’t make the squares difficult terrain.
Glorious, storied scars cover and protect much of your body.
Your DC on flat checks to end persistent bleed damage is reduced from 15 to 10, or from 10 to 5 after receiving especially appropriate assistance.
''Prerequisites'' Legendary in [[Intimidation]].
You can frighten foes so much, they might die.
Attempt an Intimidation check against the [[Will]] DC of a living creature within 30 feet of you that you sense or observe and who can sense or observe you.
If the target can’t hear you or doesn’t understand the language you are speaking, you take a –4 circumstance penalty.
The creature is temporarily immune for 1 minute.
{{||ActionSuccessTable}}
You fight fiercely to protect your crop.
When you hit a creature that is adjacent to two or more members of your crop with a weapon or unarmed attack, you gain a circumstance bonus to your damage roll equal to the number of weapon damage dice.
When you hit a creature who has a member of your crop [[Grabbed]], that member can attempt to [[Escape]] using a reaction.
You are trained in [[Survival]]. You gain the [[Forager]] skill feat as a bonus feat. Your thoroughness when gathering food provides you a +1 circumstance bonus to [[Survival]] checks to [[Subsist]].
You’re always on the lookout for supplies and valuables.
Each time you use the [[Seek]] action to search for objects (including secret doors and hazards), you can search for objects in your choice of a 10-foot [[Emanation]] around you or an adjacent 15-foot-by-15-foot area, rather than a single adjacent 10-foot-by-10-foot area.
Scent involves sensing creatures or objects by smell, and is usually a [[Vague]] sense.
The range is listed in the ability, and it functions only if the creature or object being detected emits an aroma (for instance, incorporeal creatures usually do not exude an aroma).
If a creature emits a heavy aroma or is upwind, the GM can double or even triple the range of scent abilities used to detect that creature, and the GM can reduce the range if a creature is downwind.
Your parents devoted themselves to alchemical experiments involving elemental energy.
You gain the trained proficiency rank in [[Crafting]]. If you would automatically become trained in Crafting (from your background or class, for example), you instead become trained in a skill of your choice.
You also gain the [[Alchemical Crafting]] skill feat.
{{||SpellSummaryTable}}
''Trigger'' You attempt a [[Perception]] check to [[Seek]], or you attempt a skill check to [[Recall Knowledge]] with a skill you’re trained in.
Speaking a short prayer as you gather your thoughts, you’re blessed to find that your deity gave you just the right bit of information for your situation.
Roll the triggering check twice and use the better result.
You have the knowledge needed to understand ancient texts and cultural artifacts.
You can use [[Society]] when [[Deciphering Writing|Decipher Writing]], no matter the type of writing you are examining.
You can also use [[Society]] to [[Identify Magic]] when examining a magic item or location with cultural significance.
You notice the signs and symbols that members of mystery cults and other secret societies use to declare their affiliation to fellow members.
You can use [[Occultism]] in place of [[Diplomacy]] to [[Gather Information]] about such groups.
If you belong to a secret cult, lodge, sect, or similar organization, you automatically recognize members of your group unless they are specifically attempting to conceal their presence from you.
\define schoolspelllist(school:"")
<$set name="sch" value=<<__school__>> >
<h3>Cantrips</h3>
<ul>
<$list filter="[tag[Spell]tag[Cantrip]tag<sch>sort[]]">
<li><$link/></li>
</$list>
</ul>
<$list filter="1 2 3 4 5 6 7 8 9 10" variable="level">
<h3>Level <<level>> <<__school__>> Spells</h3>
<ul>
<$list filter="[tag[Spell]!tag[Cantrip]tag<sch>field:m-level<level>sort[]]">
<li><$link/></li>
</$list>
</ul>
</$list>
</$set>
\end
{{||SpellSummaryTable}}
A field of cascading, ever-changing colors manifests in the air.
Creatures are [[Dazzled]] while inside the pattern, as are those within 20 feet of the pattern’s area.
A creature must attempt a [[Will]] save if it is inside the pattern when you cast it, enters the pattern, ends its turn within the pattern, or uses a [[Seek]] or [[Interact]] action on the pattern.
A creature currently affected by the pattern doesn’t need to attempt new saves.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
A sparkling magical barrier envelops each target, shielding them against the triggering effect.
Choose one type of physical or energy damage the triggering effect deals.
Each target gains [[Resistance]] 10 against that damage type for the triggering effect.
The resistance applies only against the initial damage, not against any persistent damage or other lingering effects of the effect.
''Heightened (+1)'' The resistance increases by 1.
Your spells become a radiant display of light and color.
If your next action is to [[Cast a Spell]] that doesn’t have the <<tag Darkness>> trait, has no duration, and requires creatures to attempt a [[Reflex]] save, the spell explodes in a spray of scintillating lights, in addition to its other effects.
Each creature that failed its Reflex save against the spell is [[Dazzled]] for 1 round, and those who critically failed are instead [[Blinded]] for 1 round.
You go into hibernation for 24 hours and perform a ritual dedicated to your ancestors, undergoing a one-time metamorphosis.
You permanently gain the effects of [[Enlarge]], and your maximum Hit Points increase by your level. The ritual transforms most of your gear to the appropriate size for your new body (though powerful items like artifacts or items strongly tied to their original size may not transform, at the GM’s discretion).
''Frequency'' once per day
You make a weapon unbearable to hold.
Attempt an [[Athletics]] check to [[Disarm]] a target creature. You don’t need to have a hand free to make this Disarm attempt.
If the Disarm attempt succeeds, the target takes 4d6 fire damage unless it drops the weapon, and on a critical success, it takes 4d6 fire damage and drops the weapon.
If you’re legendary in [[Athletics]], this increases to 8d6 fire damage.
You use fast-talking, flattery, and a silver tongue to avoid danger and escape tricky situations. You might be a grifter or con artist, traveling from place to place with a new story or scheme. Your racket is also ideal for certain reputable professions, like barrister, diplomat, or politician.
When you successfully [[Feint]], the target is [[Flat-Footed]] against melee attacks you attempt against it until the end of your next turn.
On a critical success, the target is flat-footed against all melee attacks until the end of your next turn, not just yours.
You’re trained in [[Deception]] and [[Diplomacy]].
You can choose [[Charisma]] as your key ability score.
You can Craft items even without appropriate tools or a workshop, though you take a –2 item penalty to your [[Crafting]] check.
Additionally, you don’t need a physical formula book to remember all of your formulas; you pay the same cost as normal to learn them, but you memorize them all.
You can Craft temporary items out of anything, anywhere, with whatever materials happen to be on hand, spending only 10 minutes to perform the initial Crafting check.
The temporary item must be common, non-magical, 1st level or lower, and must be a weapon, armor, or a nonconsumable piece of adventuring gear.
Instead of a single item, you can create 10 pieces of a single type of ammunition.
This is a [[Shoddy]] item, but you don’t take the normal penalty when using shoddy items you made using this feat.
Your temporary item lasts for 1d4 hours before falling apart into its raw components; the GM rolls the number of hours secretly.
You can create only the physical item, not any information or magic, so for example, while you could create a blank journal or one of random pages, you couldn’t use it as a scholarly journal or a religious text.
You can incorporate any materials or items that you have on hand, even if they’re not the type of materials that would ordinarily be used to Craft a given item, though you must have enough volume of material to make the item you want.
Unless all the materials you used were an appropriate type to make the item, you take a –5 penalty to the Crafting check (or a –10 penalty if the materials you used were particularly unsuitable, as determined by the GM).
<<archetypefeatlist "4 6 7" "Scrounger">>
''Prerequisites'' an instinct that allows you to change your additional damage from Rage to a different damage type.
''Trigger'' You [[Rage]].
You emit a powerful surge of instinctual energy when you unleash your potential.
Each adjacent creature takes damage equal to your level (basic [[Fortitude]] save against your class DC) of the same type as your additional damage during that Rage.
{{||SpellSummaryTable}}
You blast the area with grit that scours away soil and gets into creatures’ eyes.
For the duration of the spell, any plant-based [[Difficult Terrain]] smaller than a tree becomes loose, allowing each 5-foot square of it to be cleared with a single [[Interact]] action.
In addition, scouring sand attempts to [[Counteract]] [[Entangle]] and other effects that create or manipulate plant-based terrain in its area. Successfully counteracting an effect removes only the portion of its area that overlaps with scouring sand’s area. After one such attempt, the effect is temporarily immune to scouring sand’s counteract for 24 hours.
Each creature in the area when you Cast this Spell or that ends its turn in the area must attempt a [[Reflex]] save.
''Heightened (3rd)'' Once per round when you Sustain the Spell, you can move the center of the burst to a spot within range.
''Heightened (6th)'' As the 3rd-level version, except the range is 120 feet and the area is a 20-foot burst.
{{||SaveSuccessTable}}
You scout ahead and behind the group to watch danger, moving at half speed.
At the start of the next encounter, every creature in your party gains a +1 circumstance bonus to their [[Initiative]] rolls.
You are a highly skilled scout, capable of providing your allies a timely warning of any danger.
You gain the [[Scout's Warning]] ranger feat.
When you’re using the [[Scout]] exploration activity, you grant your allies a +2 circumstance bonus to their initiative rolls instead of a +1 circumstance bonus.
<<archetypefeatlist "4 6 10 12" "Scout">>
You meander around unpredictably, and then ambush your opponents without warning.
Choose one enemy. [[Stride]], [[Feint]] against that opponent, and then make a [[Strike]] against that foe.
For your Feint, you can attempt a [[Stealth]] check instead of the [[Deception]] check that’s usually required, because you use the terrain around you to catch your foe off-guard.
''Requirements'' You are [[Hidden]] from or [[Undetected]] by all of your opponents, and you aren’t within 10 feet of any enemy.
You leap from the shadows to strike your foes.
[[Stride]] up to your Speed, then [[Strike]] twice.
If you were hidden or unnoticed by the target of these Strikes, your foe is [[Flat-Footed]] against both attacks.
Your [[Multiple Attack Penalty]] applies normally for both attacks.
You move faster, especially when traveling, allowing you to scout ahead and report back without slowing your allies.
You gain a +10-foot status bonus to your Speed.
When calculating your travel speed, this increases to a +20-foot status bonus.
''Trigger'' You are about to roll a [[Perception]] or [[Survival]] check for initiative.
You visually or audibly warn your allies of danger, granting them each a +1 circumstance bonus to their initiative rolls.
Depending on whether you use gestures or call out, this action gains either the <<tag Visual>> or the <<tag Auditory>> trait, respectively.
A scroll contains a single spell that you can cast without having to expend a spell slot.
A scroll can be [[Craft]]ed to contain nearly any spell, so the types of scrolls available are limited only by the number of spells in the game. The exceptions are cantrips, focus spells, and rituals, none of which can be put on scrolls.
The spell on a scroll can be cast only once, and the scroll is destroyed as part of the casting.
The spell on the scroll is cast at a particular spell level, as determined by the scroll. For instance, a scroll of [[Magic Missile]] (1st level) can be used to cast the 1st-level version of magic missile, but not a magic missile heightened to 2nd level.
If no level is listed, the scroll can be used to cast the spell at its lowest level.
If you find a scroll, you can try to figure out what spell it contains. If the spell is a common spell from your spell list or a spell you know, you can spend a single [[Recall Knowledge]] action and automatically succeed at identifying the scroll’s spell. If it’s not, you must use [[Identify Magic]] to learn what spell the scroll holds.
Casting a Spell from a scroll requires holding the scroll in one hand and activating it with a [[Cast a Spell]] activity using the normal number of actions for that spell.
To Cast a Spell from a scroll, the spell must appear on your spell list.
Because you’re the one Casting the Spell, use your spell attack roll and spell DC.
The spell also gains the appropriate trait for your tradition (arcane, divine, occult, or primal).
Any physical material components and costs are provided when a scroll is created, so you don’t need to provide them when Casting a Spell from a scroll.
You must replace any required material component for that spell with a somatic component.
If the spell requires a focus, you must have that focus to Cast the Spell from a scroll.
All scrolls have the same base statistics unless noted otherwise. A scroll has light Bulk, and it must be held in one hand to be activated.
The table below indicates the item level and Price of a scroll, both of which are based on the level of the spell contained on the scroll. Any costs to Cast the Spell are added to the scroll’s Price when the scroll is crafted, so a scroll containing a spell with a Cost entry will have a higher Price than what appears on the table.
The scroll’s rarity matches the spell’s rarity.
The traits for a scroll vary based on the spell it contains. A scroll always has the <<tag Consumable>>, <<tag Magical>>, and <<tag Scroll>> traits, plus the traits of the spell stored on it.
The process to Craft a scroll is much like that to Craft any other magic item. When you begin the crafting process, choose a spell to put into the scroll. You have to either Cast that Spell during the crafting process, or someone else must do so in your presence. Casting that Spell doesn’t produce its normal effects; instead, the magic is trapped inside the scroll.
The casting must come from a spellcaster expending a spell slot. You can’t Craft a scroll from a spell produced from another magic item, for example. The caster has to provide any cost of the spell.
Like other consumables, scrolls can be crafted in batches of four. All scrolls of one batch must contain the same spell at the same level, and you must provide one casting for each scroll crafted.
| !Spell Level | !Item Level | !Base Price |
| 1 | 1 | 40 |
| 2 | 3 | 120 |
| 3 | 5 | 300 |
| 4 | 7 | 700 |
| 5 | 9 | 1500 |
| 6 | 11 | 3000 |
| 7 | 13 | 6000 |
| 8 | 15 | 13000 |
| 9 | 17 | 30000 |
| 10 | 19 | 80000 |
During your daily preparations, you can create two temporary scrolls containing arcane spells from your spellbook.
These scrolls follow the normal rules for [[Scroll]]s, with some additional restrictions.
Each scroll must be of a different spell level, and both spell levels must be 2 or more levels lower than your highest-level spell.
Any scrolls you create this way become non‑magical the next time you make your daily preparations.
A temporary scroll has no value.
If you have master proficiency in arcane spell DCs, you can create three temporary scrolls during your daily preparations, and if you have legendary proficiency, you can create four temporary scrolls.
You’ve studied scrolls in depth. This might have been a comprehensive education in formal setting, or the sort of education where you somehow obtain a number of scrolls and try not to explode anything you didn’t mean to explode.
You gain the [[Trick Magic Item]] feat, and you gain a +2 circumstance bonus to skill checks to Trick scrolls.
If you roll a critical failure to Trick a Magic Item that’s a scroll, you get a failure instead.
<<archetypefeatlist "6 8 12 18" "[[Scroll Trickster]]">>
{{LOCGFeat}}
Your experience chronicling adventures and discoveries grants you heightened discernment and memory.
For 24 hours after learning a prominent fact—such as the name of an NPC you have met, the details of your mission briefing, and similar information—you can recall it without attempting a check, though this doesn’t allow you to automatically memorize long strings of numbers or text.
You also gain a +2 circumstance bonus to checks to remember a detail that has come up before in the current adventure, even if it was more than 24 hours ago.
If you have the [[Thorough Reports]] feat and have expert proficiency in the skill you’re using to [[Recall Knowledge]], your circumstance bonus to Recall Knowledge about creatures from that feat increases to +4.
<<archetypefeatlist "8 10" "[[Scrollmaster]]">>
//Scrying is also a spell tag. Scrying effects allow the user to percieve another location.//
{{||SpellSummaryTable}}
You magically spy on a creature of your choice.
Scrying works like [[Clairvoyance]], except that the image you receive is less precise, insufficient for [[Teleport]] and similar spells.
Instead of creating an eye in a set location within 500 feet, you instead create an eye that manifests just above the target.
You can choose a target either by name or by touching one of its possessions or a piece of its body.
The effect of scrying depends on the target’s [[Will]] save.
If you haven’t met the target in person, scrying’s DC is 2 lower, and if you are unaware of the target’s identity (perhaps because you found an unknown creature’s fang at a crime scene), the DC is instead 10 lower.
{{||SaveSuccessTable}}
You coax nearby shadows into the shape of a simple weapon or a simple tool or item, using a tiny piece of your shadow to make it solid; in doing so, you lose 1 Hit Point.
You can create only level-0 common, non-consumable weapons, or adventuring gear with no intricate parts, written text, or other complicated components.
The item lasts until used for a single activity, until you Sculpt Shadows again, or for 1 minute, whichever comes first. Once the duration expires, the object dissipates, and you regain the lost Hit Point unless the item was Broken or Destroyed.
As the object holds a tiny sliver of your shadow, you can’t recover the lost Hit Point until after the object dissipates.
{{||SpellSummaryTable}}
You change the sounds made by a creature or object.
Choose how you’re altering the sounds when you Cast the Spell; you can’t alter it later.
You can cause something that didn’t create a sound to make sound, alter the voice of a creature, amplify or deaden a sound, or transform one sound into another.
A creature who succeeds at a [[Perception]] check against your spell DC can determine that the sound was altered by an illusion, including hearing faint sounds if you deadened the sound, but they can’t determine the true sound unless they critically succeed at the Perception check.
You can [[Dismiss]] the spell.
Because this spell obscures sound instead of preventing it, using the spell to quiet a creature doesn’t prevent that creature from using verbal spell components, though it does prevent most <<tag Auditory>> effects that rely on another creature hearing them accurately. An unwilling target can attempt a Will save.
''Heightened (5th)'' You can target up to 6 creatures or 6 objects, altering the sounds of all affected creatures or objects in the same way.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You slap or stomp on a nearby solid or liquid surface, sending a surge of water rushing away from you.
The water forms a flat, 5-foot-thick, 10-foot-high wall of water between 5 and 15 feet wide (you decide). It moves 60 feet in a direction of your choice along the struck surface, extinguishing all non-magical fires, carrying along unattended objects of 1 Bulk or less, and pushing larger objects.
The wave moves another 60 feet in the same direction at the start of your next turn, then vanishes.
Large or smaller creatures in the area or that enter the area the wave moves through must attempt a [[Fortitude]] save.
{{||SaveSuccessTable}}
This briny concoction alters the skin on your hands and feet.
The spaces between your fingers and toes become webbed, granting you a swim Speed of 20 feet for the listed duration. //You may also gain the ability to breathe underwater.//
| !Type | !Level | !Price | !Duration | !Breathe Underwater? |
| Lesser | 5 | 220 | 10 minutes | No |
| Moderate | 12 | 3000 | 1 hour | Yes |
| Greater | 15 | 9200 | 24 hours | Yes |
{{||SpellSummaryTable}}
You utter a curse that a creature will meet a certain end—a death by freezing, stabbing, or another means you devise.
Choose one type of damage from the following list: <<tag Acid>>, <<tag Bludgeoning>>, <<tag Cold>>, <<tag Electricity>>, <<tag Fire>>, <<tag Negative>>, <<tag Piercing>>, <<tag Slashing>>, or <<tag Sonic>>.
The effect is based on the target’s [[Fortitude]] save.
''Heightened (+2)'' The weakness increases by 1, and the maximum level of creature that can be automatically killed increases by 4.
{{||SaveSuccessTable}}
You [[Seek]] meticulously for hidden doors, concealed hazards, and so on.
You can usually make an educated guess as to which locations are best to check and move at half speed, but if you want to be thorough and guarantee you checked everything, you need to travel at a Speed of no more than 300 feet per minute, or 150 feet per minute to ensure you check everything before you walk into it.
With a successful Perception check while Searching, a character notices the presence or absence of something unusual in the area, but it doesn’t provide a comprehensive catalog of everything there. Instead, it gives a jumping-off point for closer inspection or an encounter. For instance, if an area has both a DC 30 secret door and a DC 25 trap, and a Searching character got a 28 on their Perception check, you would tell the player that their character noticed a trap in the area, and you’d give a rough idea of the trap’s location and nature. The party needs to examine the area more to learn specifics about the trap, and someone would need to Search again to get another chance to find the secret door.
In locations with many objects to search, you have to stop and spend significantly longer to search thoroughly. If an area contains many objects or something that will take a while to search (such as a cabinet full of papers), Searching would reveal the cabinet, but the PCs would have to examine it more thoroughly to check the papers. This usually requires the party to stop for a complete search.
You can always move more slowly while Searching to cover the area more thoroughly, and the [[Expeditious Search]] feat increases these maximum Speeds.
If you come across a secret door, item, or hazard while Searching, the GM will attempt a free secret check to Seek to see if you notice the hidden object or hazard. You roll a secret Perception check for a Searching character to detect any secrets they pass that’s in a place that stands out (such as near a door or a turn in a corridor), but not one that’s in a more inconspicuous place (like a random point in a long hallway) unless they are searching particularly slowly and meticulously.
{{||SpellSummaryTable}}
You shoot a blazing ray of light tinged with holy energy.
Make a ranged spell attack.
The ray deals 5d6 <<tag Fire>>damage. If the target is a <<tag Fiend>>or <<tag Undead>>, you deal an extra 5d6 <<tag Good>>damage.
On a critical hit, the target takes double fire damage, as well as double good damage if a fiend or undead.
If the light passes through an area of magical darkness or targets a creature affected by magical darkness, searing light attempts to [[Counteract]] the darkness.
If you need to determine whether the light passes through an area of darkness, draw a line between yourself and the spell’s target.
''Heightened (+1)'' The fire damage increases by 2d6, and the good damage against fiends and undead increases by 2d6.
You’ve mastered the preparation of many types of food and drink.
You gain a +1 circumstance bonus to checks to [[Craft]] food and drink, including potions.
If you are a master in one of the prerequisite skills, this bonus increases to +2.
You gain a swim Speed of 20 feet, and you can always breathe underwater. However, your land Speed is reduced by 5 feet (to 20 feet for most seaweed leshys).
''Prerequisites'' [[Divine Ally]].
Your inner grace attracts the attention of a second protective spirit.
Choose a second type of [[Divine Ally]] and gain its benefits.
When your target proves resilient to your magical deceptions, you can try them again on someone else.
When you cast an <<tag Enchantment>> spell that targets one creature and that creature critically succeeds at its [[Will]] save, you can [[Cast the Spell|Cast a Spell]] again before the end of your next turn on a different creature without expending an additional spell slot.
The second casting doesn’t grant you any benefits that you would normally gain for Casting a Spell from a spell slot.
You’ve learned to find perfection in every success.
Choose a different saving throw than the one you chose for your [[Path to Perfection]].
Your proficiency rank for the chosen saving throw increases to master.
If you roll a success with the chosen saving throw, you instead critically succeed.
''Trigger'' Your [[Shield Block]] causes your shield to break or be destroyed.
You’re used to your shield breaking in the middle of battle, and you’re prepared to use a backup or any convenient nearby object to defend yourself.
You can [[Interact]] to draw a shield on your person or an unattended shield within your reach.
If there is an object within your reach that could serve as an improvised shield—for example, a table or chair— you can Interact to draw it with this feat. The GM determines if something can be used as an improvised shield.
Your new shield isn’t raised until you use the [[Raise a Shield]] action, as normal.
Your armor has become akin to a second skin for you.
Your proficiency ranks for light armor, medium armor, and unarmored defense increase to master.
When wearing light or medium armor, you can [[Rest]] normally, rather than receiving poor rest that leaves you fatigued.
''Requirements'' You are wielding two melee weapons, each in a different hand.
You read your prey’s movements and transform them into openings, so failures with one weapon set up glancing blows with the other.
Make a melee [[Strike]] with one of the required weapons against your hunted prey.
The Strike gains the following failure effect: You deal the damage the other required weapon would have dealt on a hit, excluding all damage dice. (This removes dice from weapon runes, spells, and special abilities, not just weapon damage dice.)
You can enter a second rage, but afterward you need to catch your breath.
You can [[Rage]] without waiting for 1 minute after the previous Rage (or 1 round, with [[Quick Rage]]), but when you end this second Rage, you’re [[Fatigued]] until you rest for 10 minutes.
{{||SpellSummaryTable}}
You banish a container and its contents to the Ethereal Plane, where you can retrieve it from later.
The container’s physical properties—the material from which it is made, any locks, or other features—are irrelevant to the casting of this spell, but the container can’t contain any creatures.
When you Cast this Spell, the container and all its contents are transported to a random location deep in the Ethereal Plane.
Time passes normally for the container and its contents, and the environmental effects of the Ethereal Plane apply to it.
Though very unlikely, it’s possible for a creature on the Ethereal Plane to stumble upon the chest.
You can [[Dismiss]] the spell to return the chest to your current location.
If the spell ends by any other means, the container is lost on the Ethereal Plane and you can no longer recall it with this spell, though you could search for it in other ways.
{{||SpellSummaryTable}}
You change the target’s text to different text entirely.
If the text is a spellbook or a scroll, you can change it to show a spell you know of secret page’s level or lower. The replacement spell cannot be cast or used to prepare a spell.
You can also transform the text into some other text you have written or have access to.
You can specify a password that allows a creature touching the page to change the text back and forth.
You must choose the replacement text and the password, if any, when you Cast the Spell.
Choose a secret society. You’ve learned that society’s secret cant or jargon, enabling you to share hidden messages when signing or speaking with others who’ve also learned it.
If an observer succeeds at a [[Perception]] check against your [[Deception]] DC when you do this, they realize you are passing a message but fail to discern its content, unless they subsequently succeed at a [[Society]] check against your Deception DC.
On a critical success, they learn not only the message, but also who you’re passing the message to.
''Special'' You can take this feat multiple times. You learn the secret speech of a different society each time.
{{||SpellSummaryTable}}
You can see [[Invisible]] creatures and objects.
They appear to you as translucent shapes, and they are [[Concealed]] to you.
''Heightened (5th)'' The spell has a duration of 8 hours.
Your body produces a nearly endless supply of hard seedpods.
You gain a seedpod ranged unarmed attack that deals 1d4 bludgeoning damage; these [[Strike]]s have the <<tag Manipulate>> trait.
On a critical hit, a seedpod bursts, issuing forth a tangle of vegetation that imposes a –10-foot circumstance penalty on the target’s Speed for 1 round.
Seedpods do not add critical specialization effects.
You scan an area for signs of creatures or objects.
If you’re looking for creatures, choose an area you’re scanning. If precision is necessary, the GM can have you select a 30-foot cone or a 15-foot burst within line of sight. You might take a penalty if you choose an area that’s far away.
If you’re using Seek to search for objects (including secret doors and hazards), you search up to a 10-foot square adjacent to you. The GM might determine you need to Seek as an activity, taking more actions or even minutes or hours if you’re searching a particularly cluttered area.
The GM attempts a single secret [[Perception]] check for you and compares the result to the [[Stealth]] DCs of any undetected or hidden creatures in the area, or the DC to detect each object in the area (as determined by the GM or by someone Concealing the Object).
A creature you detect might remain [[Hidden]], rather than becoming [[Observed]], if you’re using an imprecise sense or if an effect (such as [[Invisibility|Invisible]]) prevents the subject from being observed.
//You can Seek while Raging, even though it has the Concentrate trait.//
{{||ActionSuccessTable}}
''Frequency'' once per day.
With a moment spent focusing, you can locate the telltale signs of corruption no matter what means it may use to hide from your sight.
For 1 minute, you can see through up to 5 feet of stone, wood, or similar barriers as if they didn’t exist (though any amount of metal or denser barriers block this effect).
Your shots zip around corners and fly at impossible angles to reach your target.
Make a bow [[Strike]] against a foe you can see; the ammunition travels to your target, even around corners. //(Although you can't actually shoot a foe who's all the way around a corner because you can't see them.)//
You ignore the target’s [[Concealed]] condition and all cover.
You have an inborn ability to detect and understand magical phenomena. You can cast the [[Detect Magic]] cantrip as an arcane innate spell at will. A cantrip is heightened to a spell level equal to half your level rounded up. In addition, you gain a +1 circumstance bonus to checks to [[Identify Magic]] and to [[Decipher Writing]] of a magical nature. These skill actions typically use the [[Arcana]], [[Nature]], [[Occultism]], or [[Religion]] skill.
As you call down divine power, you can prevent some enemies from benefiting or some allies from being hurt.
When you cast a version of [[Harm]] or [[Heal]] that has an area, you can designate a number of creatures equal to your [[Charisma]] modifier (minimum 1) that are not targeted by the spell.
''Trigger'' An enemy within 15 feet damages you.
Your self-interest keeps you safe.
You gain resistance against the triggering damage equal to 2 + half your level, regardless of damage type.
In addition, your [[Strike]]s against the triggering creature deal 1 extra damage until the end of your next turn. You choose whether this extra damage is evil or negative each time you use this reaction. This extra damage increases to 2 at 9th level and 3 at 16th level.
If you have the Divine Smite ability, if your [[Charisma]] modifier is +2 or greater, your resistance against the triggering damage equals your [[Charisma]] modifier + half your level.
If you have the Exalt ability, each enemy within 15 feet of you takes a –1 status penalty to attack rolls against you until the start of your next turn.
You protect those near you with a flash of steel.
When you’re benefiting from [[Dueling Parry]], allies adjacent to you gain a +1 circumstance bonus to AC.
If you have [[Dueling Riposte]], you can use it when an enemy within your reach critically fails a Strike against an ally adjacent to you, not just against yourself.
{{||SpellSummaryTable}}
You send the creature a mental message of 25 words or fewer, and it can respond immediately with its own message of 25 words or fewer.
You see all colors as brighter, hear all sounds as richer, and especially smell all scents with incredible detail. You gain a special sense: imprecise [[Scent]] with a range of 30 feet. This means you can use your sense of smell to determine the exact location of a creature. The GM will usually double the range if you’re downwind from the creature or halve the range
if you’re upwind. In addition, you gain a +2 circumstance bonus to Perception checks whenever you’re trying to locate an undetected creature that is within the range of your scent.
Like many humans raised in a close-knit community, you have always been strongly attuned to the presence of others.
[[Willing]] allies that you are aware of within 60 feet that would otherwise be [[Undetected]] by you are instead [[Hidden]] from you.
The flat check for you to target willing allies within 60 feet that are hidden from you is 5 instead of 11.
{{LOCGFeat}}
You sense chaos as an unsettling feeling of nervous energy.
When in the presence of an aura of chaos that is powerful or overwhelming (see [[Detect Alignment]]), you eventually detect the aura, though you might not do so instantly and you can’t pinpoint the location.
This is a [[Vague]] sense, similar to humans’ sense of smell.
A chaotic creature using a disguise or otherwise trying to hide its presence attempts a [[Deception]] check against your [[Perception]] DC to hide its aura from you.
If the creature succeeds at its Deception check, it is temporarily immune to your Sense Chaos for 1 day.
Using the stars, the position of the sun, traits of the geography or flora, or the behavior of fauna, you can stay oriented in the wild.
Typically, you attempt a [[Survival]] check only once per day, but some environments or changes might necessitate rolling more often. The GM determines the DC and how long this activity takes (usually just a minute or so).
More unusual locales or those you’re unfamiliar with might require you to have a minimum proficiency rank to Sense Direction.
Without a compass, you take a –2 item penalty to checks to Sense Direction.
{{||ActionSuccessTable}}
''Prerequisites'' tenets of good.
You sense evil as a queasy or foreboding feeling.
When in the presence of an aura of evil that is powerful or overwhelming //(from a creature of level 16 or higher, or a spell of level 8 or higher; or a divine spellcaster of level 11 or higher)// you eventually detect the aura, though you might not do so instantly, and you can’t pinpoint the location.
This acts as a [[Vague]] sense, similar to humans’ sense of smell.
An evil creature using a disguise or otherwise trying to hide its presence attempts a [[Deception]] check against your [[Perception]] DC to hide its aura from you. If the creature succeeds at its Deception check, it is then temporarily immune to your Sense Evil for 1 day.
You can tell when something’s off.
You can trigger [[Cat's Luck]] after you roll [[Initiative]], in addition to its normal trigger, to reroll your Initiative and take the higher of the two results.
This still counts against Cat’s Luck’s frequency, as normal.
''Prerequisites'' tenets of evil.
The presence of goodness sickens you with its saccharine self-righteousness.
When in the presence of an aura of good that is powerful or overwhelming (//from a creature of level 16 or higher, or a spell of level 8 or higher; or a divine spellcaster of level 11 or higher//), you detect the aura, though you might not do so instantly, and you can’t pinpoint the location.
This acts as a [[Vague]] sense, similar to humans’ sense of smell.
A good creature using a disguise or otherwise trying to hide its presence attempts a [[Deception]] check against your [[Perception]] DC to hide its aura from you.
If the creature succeeds at its Deception check, it is then temporarily immune to your Sense Good for 1 day.
//Implied by [[Heartbond]].//
Once per day, each bonded creature can use a 2-action activity, which has the Concentrate trait, to learn the present state of the other bonded creature. The creature knows the other creature’s direction and distance and any conditions affecting them.
You try to tell whether a creature’s behavior is abnormal.
Choose one creature, and assess it for odd body language, signs of nervousness, and other indicators that it might be trying to deceive someone.
The GM attempts a single secret [[Perception]] check for you and compares the result to the
[[Deception]] DC of the creature, the DC of a spell affecting the creature’s mental state, or another appropriate DC determined by the GM.
You typically can’t try to Sense the Motive of the same creature again until the situation changes significantly.
{{||ActionSuccessTable}}
''Trigger'' You fail a check to [[Seek]].
When you look for foes, you notice the slightest of cues.
Even though you failed at the triggering check, you automatically sense any [[Undetected]] creatures in the area where you’re [[Seek]]ing, making them merely [[Hidden]] to you.
You have an even stranger knack for knowing what other people are thinking.
You can cast [[Mind Reading]] as an innate occult spell once per day.
//Implied by [[Zenith Star]].//
While the spell persists, as long as you can see the night sky and the target is visible from the same night sky, you can sense the approximate direction and distance to the creature by using a single action, which has the Concentrate trait.
You have trained carefully to maximize the protective qualities of your armor.
You become trained in light armor and medium armor. If you already were trained in light armor and medium armor, you gain training in heavy armor as well.
Whenever you gain a class feature that grants you expert or greater proficiency in any type of armor (but not unarmored defense), you also gain that proficiency in the armor types granted to you by this feat.
If you are at least 13th level and you have a class feature that grants you expert proficiency in unarmored defense, you also become an expert in the armor types granted to you by this feat.
<<archetypefeatlist "4 6 8 10 16" "Sentinel">>
{{||SpellSummaryTable}}
You manifest a supernatural funerary mask, granting you a +1 status bonus to [[Will]] saving throws against <<tag Emotion>> effects for 1 minute.
Its somber countenance forces your foes to confront their regrets and sins. Each enemy in the area when you Cast the Spell or that starts its turn in the area takes 1d4 <<tag Mental>> damage //with a basic// [[Will]] save. //In addition, if it fails this save it suffers a -1 status penalty to Will saves against <<tag Emotion>> effects for 1 round. If it critically fails, the duration is 1 minute.//
''Heightened (+2)'' Increase the mental damage by 2d4 and the emanation’s radius by 5 feet.
You gain inner serenity, focused on fine details and steeled against mental assaults, but you find violence off-putting.
''Benefit'' You gain an item bonus to [[Will]] saves and [[Perception]], [[Medicine]], [[Nature]], [[Religion]], and [[Survival]] checks. This bonus improves when you attempt Will saves against <<tag Mental>> effects.
''Drawback'' You take a –1 penalty to attack rolls and save DCs of offensive spells, and a –1 penalty per damage die to all weapon, unarmed attack, and spell damage.
| !Type | !Level | !Price | !Duration | !Bonus | !Bonus vs Mental | !Promote Will saves vs Mental |
| Lesser | 1 | 40 | 1 minute | +1 | +2 | |
| Moderate | 3 | 120 | 10 minutes | +2 | +3 | |
| Greater | 11 | 3000 | 1 hour | +3 | +4 | Success |
| Major | 17 | 30000 | 1 hour | +4 | +4 | Success, Fumble |
Upon drinking this potion, your biology instantly transforms to take on a set of sexual characteristics of your choice, changing your appearance and physiology accordingly.
You have mild control over the details of this change, but you retain a strong “family resemblance” to your former appearance.
The magic functions instantaneously and can’t be counteracted.
Your new anatomy is as healthy and functional as your previous body’s, potentially allowing you to procreate (depending on your ancestry’s biology).
Drinking a subsequent serum of sex shift allows you to either revert back to your original form or adopt other sexual characteristics, as you choose.
The elixir has no effect if you are pregnant or from an ancestry with no sexual differentiation. Most ancestries have a wide spectrum of sexual differentiation, some common, others more rare.
Your studies open up new horizons.
You become an expert in a [[Lore]] skill about a specific settlement; if you were already trained in that Lore skill, you also become trained in the Lore skill for a different settlement of your choice.
Choose a single common or uncommon language prevalent in that settlement. You learn that language.
''Special'' You can take this feat multiple times. When you take this feat again, choose a different settlement.
You are immune to the disease [[Filth Fever]].
Each of your successful saving throws against a disease or poison reduces its stage by 2, or by 1 for a virulent disease or poison.
Each critical success against an ongoing disease or poison reduces its stage by 3, or by 2 for a virulent disease or poison.
Your lineage shows the signs of velstrac tampering, including some curious quirk bequeathed by those shadowy surgeons of flesh and souls. Your flesh heals cleanly and quickly—all the better for you to serve as a subject for their ghastly art.
You gain the [[Fast Recovery]] feat, even if you don’t meet the prerequisites.
You attempt to subdue a target with an attack and a follow-up grab.
Make a melee [[Strike]].
If it hits and deals damage, you can attempt an [[Athletics]] check to [[Grapple]] the creature you hit.
If you’re wielding a flail, you can ignore Grapple’s requirement that you have a hand free.
Both attacks count toward your [[Multiple Attack Penalty]], but the penalty doesn’t increase until after you’ve made both of them.
''Usage'' etched onto light or medium nonmetallic armor.
Armor with this rune becomes hazy black. You gain a +1 item bonus to [[Stealth]] checks while wearing the armor.
| !Type | !Level | !Price | !Item Bonus |
| (standard) | 3 | 550 | +1 |
| Greater | 9 | 6500 | +2 |
| Major | 17 | 140000 | +3 |
{{||SpellSummaryTable}}
You shape the quasi-real substance of the Shadow Plane into a blast.
Choose <<tag Acid>>, <<tag Bludgeoning>>, <<tag Cold>>, <<tag Electricity>>, <<tag Fire>>, <<tag Force>>, <<tag Piercing>>, <<tag Slashing>>, or <<tag Sonic>> damage, and choose a 30-foot [[Cone]], a 15-foot [[Burst]] within 120 feet, or a 50-foot [[Line]].
The blast deals 5d8 damage of the type you chose to each creature in the area. //They attempt their choice of a [[Reflex]] or [[Will]] save.//
''Heightened (+1)'' The damage increases by 1d8.
''Trigger'' A creature attempts a flat check to target you while you’re [[Concealed]] or [[Hidden]] due to [[Dim Light]] or [[Darkness]].
You draw shadows close to create a shroud. Increase the DC of the flat check by 2.
Distilled from the Plane of Shadow, this oily substance imposes tenebrous effects.
The [[Enfeebled]] condition from shadow essence lasts for 24 hours.
| !Saving Throw |DC 29 [[Fortitude]] |
| !Onset |Immediate |
| !Maximum Duration |6 rounds |
| !Stage 1 |3d6 negative damage and 2d6 poison damage (1 round) |
| !Stage 2 |3d6 negative damage, 2d6 poison damage and [[Enfeebled]] 1 (1 round) |
| !Stage 3 |3d6 negative damage, 2d6 poison damage and [[Enfeebled]] 2 (1 round) |
You blend in to your surroundings so well that others have trouble telling you apart from the terrain.
While in natural terrain, you’re always [[Concealed]] from all foes if you choose to be, except for your hunted prey.
{{||SpellSummaryTable}}
//Taking this feat also makes you an expert in occult spell attack rolls and DCs.//
You create a shadowy illusion of a creature or a stationary object, but the illusion can exist only in an area of dim light or darkness.
The spell ends if the illusion is ever out of an area of dim light or darkness.
If the illusion is an object, it must fit within a 20-foot burst, and the creature can be of any size up to Gargantuan, filling a 20-foot-by-20-foot space.
The object or creature appears to animate naturally; it even generates the appropriate sounds and smells, and feels believable to the touch, though its coloring is always muted.
If the illusion is a creature, shadow illusion has the effects of an [[Illusory Creature]] spell of the same level, except it deals 2d8 damage plus your spellcasting ability modifier, instead of the amount listed in illusory creature.
''Heighten (+2)'' The area that an illusory object can fit in increases by 10 feet. The damage of the illusory creature’s Strike increases by 1d8.
{{||SpellSummaryTable}}
''Requirements'' You are in dim light or darkness.
You instantly transport yourself from one shadow to another.
Teleport yourself and any items you’re wearing and holding from your current space to a clear space you can see that’s in dim light or darkness and within range.
You can transport your familiar with this spell, but if shadow jump would bring any other creature with you—even if you’re carrying the creature in an extradimensional container—the spell is disrupted.
''Heightened (8th)'' When you arrive at your destination, you can become [[Invisible]] until the end of your next turn or until you are no longer in an area of dim light or darkness, whichever comes first. The invisibility is an <<tag Illusion>> effect.
You gain the ability to fuse and play with shadows by using focus spells specific to shadowdancers.
You learn a shadowdancer focus spell of your choice: [[Dance of Darkness]] or [[Shadow Jump]].
If you don’t already have one, you gain a focus pool of 1 Focus Point, which you can [[Refocus]] by meditating within an area of dim light or darkness.
Shadowdancer focus spells are occult spells. You become trained in occult spell attack rolls and spell DCs, and your spellcasting ability for these spells is [[Charisma]].
You have learned special tricks that help you follow individuals without them noticing you.
When you attempt a [[Stealth]] check to [[Avoid Notice]] while following a specific target, the target takes a –2 circumstance penalty to their [[Perception]] DC.
If you have master proficiency in Stealth, the penalty is –3 or –4 if you’re legendary.
If you start an encounter with the target while shadowing them, the target takes this penalty to their [[Initiative]] roll and to their Perception DC to determine if they notice you, as normal for [[Sneak]].
The shadows protect you better than any armor can, and they give you power to plunge others into darkness.
Whenever you are in an area of dim light or darkness, you gain resistance 5 to all damage except force and damage from Strikes with the [[Ghost Touch]] property rune.
When you attempt a [[Reflex]] saving throw in an area of dim light or darkness, you can roll twice and take the higher result; this is a fortune effect.
It’s difficult to notice your passage through wild areas.
As long as you’re not in an urban environment, you’re always considered to be [[Covering Tracks|Cover Tracks]], even if you chose a different activity in exploration mode.
{{LOCGFeat}}
You can take 1 damage to mix blood and shadows to cast 5th-level [[Creation]] as an innate divine spell.
You can use this ability as often as you wish, but you can have only one such object in existence at a time.
If the object encounters [[Bright Light]], the spell ends and the object dissolves into shadows.
You can focus the shadows into a powerful blast.
You can cast [[Shadow Blast]] as an innate occult spell once per day.
Its level is always 1 level lower than the level of your shadowdancer focus spells.
You become an expert in occult spell attack rolls and DCs.
You gain the trained proficiency rank in [[Intimidation]] and can use Intimidation to [[Coerce]] animals.
When you [[Demoralize]] an animal, you don’t take a penalty for not sharing a language with it.
If you would automatically become trained in Intimidation (from your background or class, for example), you become trained in another skill of your choice.
Animals’ attitudes toward you begin one degree worse than normal, usually starting at unfriendly instead of indifferent for domesticated animals, and hostile instead of unfriendly for wild animals.
''Prerequisites'' legendary Stealth.
''Frequency'' once per hour.
''Trigger'' You successfully use [[Stealth]] to [[Hide]] and become [[Hidden]] from all your current foes, or use [[Stealth]] to [[Sneak]] and become [[Undetected]] to all your current foes.
With a powerful talent for misdirection, you slip from your adversaries’ notice so thoroughly you appear to be somewhere else.
You become [[Invisible]] for 1 minute or until you take a [[Hostile Action]], whichever comes first.
Choose a location within 10 feet of you. Until your invisibility ends, you appear to be [[Hidden]] in that location to anyone trying to find you. If the searcher gets clear evidence that you’re not there, they no longer think you’re hidden there, but they don’t discover your actual location.
''Frequency'' once per hour
You draw on your connection with the Shadow Plane to see through all but the deepest darkness.
You gain [[Greater Darkvision]] for 1 minute.
{{||SpellSummaryTable}}
''Trigger'' A spell or magical effect deals damage.
Exchanging material energy with that of the Shadow Plane, you transform the triggering spell into a partially illusory version of itself.
Attempt to [[Counteract]] the target spell. Treat shadow siphon’s counteract level as 2 higher for this attempt.
If the attempt is successful, any creatures that would be damaged by the spell instead take only half as much damage. but the spell otherwise works as normal.
You gain the [[Sneak Attack]] class feature, except you deal 1d6 precision damage regardless of your level.
Sneak attack from multiple sources isn’t cumulative.
If you have sneak attack from more than one source, use only the highest number of dice when you sneak attack rather than adding the amounts together.
{{||SpellSummaryTable}}
You access the Shadow Plane, using its warped nature to spread your travels.
The targets enter the edge of the Shadow Plane where it borders the Material Plane.
Targets can’t see the Material Plane while on the Shadow Plane (although elements of that plane can sometimes be a hazy reflection of the Material Plane).
While on the Shadow Plane, the targets are exposed to potential encounters with that plane’s
denizens.
The shadows on the border between the planes bend space, speeding up your movement with respect to the Material Plane.
Every 3 minutes the targets travel along this border, they move as far as they would through the Material Plane in 1 hour.
At any point, a target can [[Dismiss]] the spell’s effects, although this affects only that target.
The shadow bending is inexact, so when the spell ends, the targets appear roughly 1 mile from their intended location on the Material Plane (though those who are traveling together and Dismiss the spell at the same point on the Plane of Shadow appear together).
Your shadow assaults your foes.
You can cast [[Shadow Blast]] as a 5th-level occult innate spell once per day. At 17th level, your shadow blast is heightened to 6th level.
{{||SpellSummaryTable}}
Grasping darkness surges from you, dealing 14d4 negative damage.
Each creature in the area must attempt a [[Fortitude]] save.
''Heightened (+1)'' The negative damage increases by 2d4.
{{||SaveSuccessTable}}
You dedicate yourself to the shadows.
Your coloring becomes gray and gloomy, your senses adjust to the darkness, and you can sneak through darkness with ease.
You gain greater [[Darkvision]].
You also gain a +2 circumstance bonus to [[Stealth]] checks when you are within dim light or darkness.
<<archetypefeatlist "10 12 14 16 18" "Shadowdancer">>
You wrap yourself in shadow to change your appearance.
You can cast [[Illusory Disguise]] as a 1st-level occult innate spell once per day. This spell gains the <<tag Shadow>> trait.
The magic of shaitans runs through your blood.
You can cast [[Glitterdust]] and [[Resist Energy]] once per day each as 2nd-level arcane innate spells.
When in danger, you can harden the stone in your skin into armor, much like a shaitan.
You can cast [[Stoneskin]] on yourself only, 3 times per day as a 4th-level arcane innate spell.
You concentrate on your rage, overcoming fear and fighting back sickness.
Reduce your [[Frightened]] condition value by 1, and attempt a [[Fortitude]] save to recover from the [[Sickened]] condition as if you had spent an action retching; you reduce your sickened condition value by 1 on a failure (but not on a critical failure), by 2 on a success, or by 3 on a critical success.
''Requirements'' Master in [[Diplomacy]].
You can downplay the consequences or outrageousness of your requests using sheer brazenness and charm.
When you [[Request]] something, you reduce any DC increases for making an outrageous request by 2, and if you roll a critical failure for your Request, you get a failure instead.
While this means you can never cause your target to reduce their attitude toward you by making a Request, they eventually tire of requests, even though they still have a positive attitude toward you.
You’ve discovered how to transform yourself into a dragon.
Once per day, you can cast 7th-level [[Dragon Form]] as an innate arcane spell, transforming into your chosen type of dragon.
The spell automatically heightens to 8th level if you’re 16th level and 9th level if you’re 18th level.
Any time you score a critical hit with an unarmed Strike gained from dragon form, you recharge the spell’s breath weapon immediately.
{{||SpellSummaryTable}}
You shape the stone into a rough shape of your choice. The shaping process is too crude to produce intricate parts, fine details, moving pieces, or the like.
Any creatures standing atop the stone when you reshape it must each attempt a [[Reflex]] save or [[Acrobatics]] check.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You shape the wood into a rough shape of your choice. The shaping power is too crude to produce with intricate parts, fine details, moving pieces, or the like.
You cannot use this spell to enhance the value of the wooden object you are shaping.
{{||SpellSummaryTable}}
Harnessing your mastery of transformative magic, you take on a mutable form.
You transform yourself into any form you could choose with a <<tag Polymorph>> spell in your spell repertoire or that you could prepare of 8th level or lower (including any 8th-level or lower heightened versions of spells you know).
You choose the type of creature as you Cast the Spell rather than when you prepare it. //(This seems to be redundant as you do this for every polymorph spell.)//
You can change your form to any other form you could choose with this spell by using a single action, which has the <<tag Concentrate>> trait.
You can [[Dismiss]] this spell.
A lifetime of experience helps you see through disguises.
When you come within 10 feet of a creature that is transformed into another form or is [[Impersonating|Impersonate]] a specific creature, the GM rolls a secret [[Perception]] check for you to realize that the creature is transformed, even if you didn’t spend an action to [[Seek]] against that creature.
{{AoA5Feat}}
Through a combination of careful manipulation and precise breath control, you can deploy inhaled toxins precisely.
When you activate an inhaled poison, you can cause it to fill a 20-foot [[Line]] that’s 5 feet tall rather than a 10-foot [[Cube]].
You gain a +3 status bonus to saving throws against inhaled poisons that you activate.
You gain resistance to <<tag Mental>> damage equal to half your level (minimum 1).
{{||SpellSummaryTable}}
''Trigger'' An ally within 30 feet is about to attempt a saving throw against a harmful <<tag Emotion>> effect, and you would not otherwise have to save against the effect.
You shoulder some of your ally’s pain.
Both you and your ally use the outcome one degree of success better than the result of your ally’s saving throw, even if the triggering effect usually affects only one target.
{{||SpellSummaryTable}}
You share your knowledge with the touched creatures.
Choose one [[Lore]] skill in which you are trained. The targets become trained in that [[Lore]] skill for the duration of the spell.
''Heightened (3rd)'' The duration of the spell is 1 hour and you can target up to five creatures.
''Heightened (5th)'' The duration of the spell is 8 hours, you can target up to five creatures, and you can share up to two [[Lore]] skills in which you are trained.
//The book lists no components other than the 10 minute duration for this spell, although it is unlikely to be used in encounter mode.//
''Requirements'' You haven’t used this ability since you last Raged.
You stoke an ally’s fury.
While you are raging, one willing creature within 30 feet gains the effects of the [[Rage]] action, except it can still use <<tag Concentrate>>actions.
{{LOCGFeat}}
You have an uncanny knack of communicating with other elves without speaking, though this habit that is often uncomfortable to observers.
You can cast [[Mindlink]] as an innate occult spell once per day, but you can target only other [[elves|Elf]] or [[half-elves|Half-Elf]].
//[[Mindlink]] has a verbal component, so "without speaking" is not quite true.//
In the triumph of battle, you can share the glory with another ally.
When the ally you chose for [[Courageous Assault]] critically succeeds at the [[Strike]] granted by that action, another ally affected by your [[Inspire Courage]] composition spell can immediately use a reaction to make a melee [[Strike]].
Since the second ally wasn’t the ally you chose for Courageous Assault, this effect doesn’t continue to a third ally, even if the second ally also critically succeeds at their Strike.
You can project your premonitions of danger to your allies.
When you use [[Premonition of Avoidance]], allies within 15 feet of you who are rolling the same saving throw against the same hazard also gain a +2 circumstance bonus to their saving throws.
You can project your premonitions of clarity to your allies.
When you use [[Premonition of Clarity]], allies within 15 feet of you who failed the same saving throw against the same mental effect can also spend their reactions to reroll the failed saving throw with a +2 circumstance bonus.
When you use [[Cat's Luck]] to reroll a [[Reflex]] saving throw, any creatures you choose within 10 feet who also just failed a [[Reflex]] saving throw against the same effect (such as a single spell) can also reroll their saving throws and use the better result.
You are evidence that it’s lucky to travel with a halfling.
You can use [[Halfling Luck]] when an ally within 30 feet fails a skill check or a saving throw to allow the ally to reroll the triggering check instead of you rerolling your own failed check.
As usual, your ally must use the new result, even if it’s worse than their first roll.
If you have [[Guiding Luck]], you can’t use Guiding Luck’s effect that applies to attack rolls and Perception checks to use Shared Luck to benefit an ally.
{{||SpellSummaryTable}}
Merging minds with the target, you swap disorienting visions from one another’s nightmares.
One of you will become [[Confused]], but which it’ll be depends on the target’s [[Will]] save.
{{||SaveSuccessTable}}
Hunting as a duo, you and your ally both single out your prey.
When you use [[Hunt Prey]] and select only one prey, you can grant your Hunt Prey benefits and hunter’s edge to an ally in addition to gaining them yourself.
The ally retains these benefits until you use Hunt Prey again.
When your deity blesses your warlike acts, you can extend that favor to your allies.
You can grant the temporary Hit Points from [[Replenishment of War]] to an ally within 10 feet instead of gaining them yourself.
You can grant these temporary Hit Points to a different ally each time, meaning you might be able to grant them to multiple creatures in a single turn.
The plans you make include your allies as well as yourself.
When you hit a creature with an attack on which you substituted your attack roll due to [[Devising a Stratagem|Devise a Stratagem]], designate one ally.
The creature you hit is [[Flat-Footed]] to that ally on the next attack the designated ally makes against that creature before the start of your next turn.
You can grant the benefit from [[Dualistic Synergy]] to an ally within 30 feet instead of yourself, either allowing that ally to [[Recall Knowledge]], granting that ally temporary Hit Points, or both, depending on the spell’s tradition.
Affix to armor.
''Requirements'' You're an expert in [[Acrobatics]].
''Trigger'' You attempt to [[Escape]] using [[Acrobatics]] for your roll, but you haven't rolled yet.
This dried-seaweed bracelet is lined with charms shaped like small shark teeth.
When you activate {{FreeAction}} the bracelet, if you roll a success on the triggering check, you get a critical success instead (if you roll a critical failure, you get a failure instead).
If you fail the [[Acrobatics]] check against a grabbing creature, the creature must either release you as a free action or take 2d8 piercing damage as shark’s teeth momentarily emerge from your skin.
With your sharp beak, you are never without a weapon.
You have a beak unarmed attack that deals 1d6 piercing damage.
Your beak is in the [[Brawling]] weapon group and has the [[Finesse]] and [[Unarmed]] traits.
Your teeth are formidable weapons.
You gain a fangs unarmed attack that deals 1d8 piercing damage.
You gain a +2 circumstance bonus to locate [[Undetected]] creatures that you could hear within 30 feet with a [[Seek]] action. As long as you’re aware of a creature via sound, once per round, your ears can help you [[Point Out]] the creature to all allies as a free action.
{{||SpellSummaryTable}}
A high-frequency sonic attack shatters a nearby object.
You deal 2d10 <<tag Sonic>> damage to the object, ignoring the object’s Hardness if it is 4 or lower.
''Heightened (+1)'' The damage increases by 1d10, and the Hardness the spell ignores increases by 2.
''Requirements'' A [[Frightened]] creature is in your melee reach.
Your offense exploits your enemy’s fear.
Make a melee [[Strike]] against a frightened creature.
If you hit and deal damage, the target becomes [[Flat-Footed]] until its frightened condition ends.
If the target was already flat-footed to you when you damaged it with this Strike, it can’t reduce its frightened value below 1 until the start of your next turn.
Your forceful blows shatter objects with ease.
While you are raging, your melee [[Strike]]s ignore 5 points of an object’s Hardness.
If you have the [[Devastator]] class feature, you instead ignore 10 points of an object’s Hardness.
{{||SpellSummaryTable}}
A large gem floats around the target in an erratic pattern.
Each time a creature Strikes the target, the target attempts a DC 11 flat check. On a success, the gem blocks the attack, so the attack first damages the gem and then applies any remaining damage to the target.
The gem has 5 Hit Points.
If the gem is reduced to 0 Hit Points, it shatters, immediately dealing the creature that destroyed it 1d8 slashing damage (basic [[Reflex]] save), as long as that creature is within 10 feet of the target.
''Heightened (+1)'' The gem has 5 additional HP, and the damage dealt by its detonation increases by 1d8.
''Trigger'' An improvised weapon that you are wielding becomes broken as a result of a critical success on an [[Improvised Pummel]].
The improvised weapon shatters, destroying it completely but dealing anadditional 3d6 piercing damage to the creature you hit with the Improvised Pummel.
This extra damage you apply on the critical hit doesn’t double from the critical hit, as normal.
The force of your considered blow shatters objects and defenses alike.
Make an unarmed [[Strike]]. It bypasses the target’s resistances.
If the target has [[Hardness]], the Strike treats the Hardness as if it were half its value.
''Trigger'' You become [[Grabbed]].
''Requirements'' You have a fully grown tail.
You can shed your tail to escape.
You cease being grabbed, then [[Stride]] without triggering any reactions from the creature that grabbed you.
It takes 1 week for your tail to fully grow back. Until it does, you can’t use your tail unarmed attack, and you take a –2 circumstance penalty on checks to [[Balance]].
The stone around you is your ally, and you have learned to use it to shore up your weaknesses.
As long as you remain on the ground and are adjacent to a vertical stone wall that rises to your height or taller, you aren’t [[Flat-Footed]] against attacks as a result of being [[Flanked|Flanking]].
This works even if you are at the outside corner of the wall.
{{||SpellSummaryTable}}
''Trigger'' A living creature within 30 feet takes damage.
You stay the hand of fate for one not yet destined to die, sacrificing some of your own vitality to heal them.
You lose up to 15 Hit Points as a sacrifice, and the target reduces the damage by twice the number of Hit Points sacrificed. If this reduction exceeds the amount of damage, the target recovers Hit Points equal to the excess amount.
''Heightened (+2)'' The maximum number of Hit Points you can sacrifice increases by 5.
{{||SpellSummaryTable}}
You raise a magical shield of force.
This counts as using the [[Raise a Shield]] action, giving you a +1 circumstance bonus to AC until the start of your next turn, but it doesn’t require a hand to use.
While the spell is in effect, you can use the [[Shield Block]] reaction with your magic shield.
The shield has Hardness 5.
After you use Shield Block, the spell ends and you can’t cast it again for 10 minutes.
Unlike a normal Shield Block, you can use the spell’s reaction against the [[Magic Missile]] spell. //(Which you couldn't normally because it only works against physical damage.)//
Heightening the spell increases the shield’s Hardness.
| !Heighten Level | !Hardness |
| 1 | 5 |
| 3 | 10 |
| 5 | 15 |
| 7 | 20 |
| 9 | 25 |
''Trigger'' The user has their shield raised and takes damage from a physical attack.
The user snaps their shield into place to deflect a blow.
The shield prevents the user from taking an amount of damage up to the shield’s [[Hardness]].
The user and the shield each take any remaining damage, possibly breaking or destroying the shield.
Residual energy from your domain spells bolsters your defenses.
When you spend a Focus Point to cast a domain spell, you gain a +1 status bonus to your AC until the start of your next turn.
You protect an ally with both your shield and your body.
Whenever you use the [[Shield Block]] reaction to prevent damage to an ally, you can evenly split the remaining damage after the Shield Block between the ally and yourself.
''Prerequisites'' [[Divine Ally]] (shield), tenets of good.
''Trigger'' A foe’s attack against an ally matches the trigger for both your [[Shield Block]] reaction and your Champion’s Reaction.
When you shield your ally against an attack, you call upon your power to protect your ally further.
You use the [[Shield Block]] reaction to prevent damage to an ally and also use your Champion’s Reaction against the foe that attacked your ally.
{{||SpellSummaryTable}}
You forge a temporary link between the target’s life essence and your own.
The target takes half damage from all effects that deal Hit Point damage, and you take the remainder of the damage.
When you take damage through this link, you don’t apply any resistances, weaknesses, or other abilities you have to that damage; you simply take that amount of damage.
The spell ends if the target is ever more than 30 feet away from you.
If either you or the target is reduced to 0 Hit Points, any damage from this spell is resolved and then the spell ends.
''Prerequisites'' [[Divine Ally]] (shield)
Your shield is a vessel of divine protection.
When you’re wielding your chosen shield, it is always raised, even without you using the [[Raise a Shield]] action.
Your chosen shield doubles its HP and BT, rather than increasing them by half.
If it would be destroyed, it vanishes to your deity’s realm instead, where your divine ally repairs it. During your next daily preparations, the shield returns to you fully repaired.
You can save your shield from total destruction, even after a devastating attack.
If a shield would be destroyed due to damage taken during your [[Shield Block]], the shield remains intact at 1 Hit Point instead.
Its construction is weakened until you take the time to repair it, preventing you from using Shield Salvation to save the same shield until your next preparations.
''Prerequisites'' [[Divine Ally]] (shield) for a [[Champion]] or [[Shield Block]] for a [[Fighter]].
You use your shield to protect your allies as well as yourself.
When you have a shield raised, you can use your [[Shield Block]] reaction when an attack is made against an ally adjacent to you.
If you do, the shield prevents that ally from taking damage instead of preventing you from taking damage, following the normal rules for Shield Block.
When your shield is up, your enemies’ blows can’t touch you.
When you have your shield raised, you can [[Stride]] to move half your Speed without triggering reactions that are triggered by your movement (such as [[Attacks of Opportunity|Attack of Opportunity]]).
You can use Shielded Stride while Flying or Swimming instead of Striding if you have the corresponding movement type.
''Usage'' etched onto a melee weapon.
With a moment of manipulation, you can shift this weapon into a different weapon with a similar form.
''Activate'' {{OneAction}} [[Interact]]; ''Effect'' The weapon takes the shape of another melee weapon that requires the same number of hands to wield. The weapon’s runes and any precious material it’s made of apply to the weapon’s new shape. Any property runes that can’t apply to the new form are suppressed until the item takes a shape to which they can apply.
''Prerequisites'' tailless alternate form
''Frequency'' once per day
You wear many faces, even those that don’t belong to you.
When you [[Change Shape|Change Shape (Kitsune)]] into your tailless form, you gain the effects of 3rd-level [[Illusory Disguise]] for 1 hour or until you shift back, except it’s a <<tag Transmutation>> effect rather than an <<tag Illusion>>.
{{||SpellSummaryTable}}
You gain one of the following abilities of your choice.
You can [[Dismiss]] this spell.
* You gain a 20-foot status bonus to your Speed.
* You gain a climb or swim Speed equal to half your Speed.
* You gain [[Darkvision]].
* You gain a pair of claws. These are [[Agile]] [[Finesse]] [[Unarmed]] attacks that deal 1d8 <<tag Slashing>> damage.
* You gain [[Scent]] 60 feet ([[Imprecise]]).
{{||SpellSummaryTable}}
You cause the surface to heave.
The area becomes [[Difficult Terrain]] and any tracks in the area are destroyed by the churning ground.
Creatures standing in the area take a –1 status penalty to [[Acrobatics]] checks to [[Balance]] and [[Tumble Through]] and [[Athletics]] checks to [[High Jump]] and [[Long Jump]].
When you [[Sustain the Spell|Sustain a Spell]], you can move the churning area up to 10 feet in any direction. Creatures [[Immobilized]] by the spell are carried along with the shifting sand in the same direction, if possible; this movement is [[Forced Movement]]
Creatures that enter or begin their turn standing in the shifting sand must attempt a [[Reflex]] save.
{{||SaveSuccessTable}}
''Heightened (5th)'' The status penalty increases to –2 and the spell’s range increases to 60 feet.
''Heightened (7th)'' The status penalty increases to –3, the spell’s range increases to 60 feet, and the spell’s area increases to a 30-foot burst.
''Heightened (9th)'' The status penalty increases to –4, the spell’s range increases to 60 feet, and the spell’s area increases to a 40-foot burst.
{{||SpellSummaryTable}}
The target grows vines and leaves, brimming with primal energy.
The target becomes a +1 [[Striking]] weapon while in your hands, gaining a +1 item bonus to attack rolls and increasing the number of weapon damage dice to two.
Additionally, as long as you are on your home plane, attacks you make with the target against <<tag Aberration>>s, extraplanar creatures, and <tag Undead>> increase the number of weapon damage dice to three.
Any ammunition.
Shining ammunition gives off a faint glow.
When shot, it sheds bright light in a 20-foot radius (and dim light to the next 20 feet) for 10 minutes.
If it hits a target, it sticks, causing the target to shed light in the same radius.
A creature can remove the ammunition with an [[Interact]] action, but the ammunition itself continues to glow for the rest of the duration or until destroyed.
''Prerequisites'' Tenets of Good.
You’ve sworn an oath to put the undead to rest.
Add the following tenet to your champion’s code after the other tenets: “You must end the existence of undead you encounter as long as you have a reasonable chance of success; in the unlikely event you find a good undead, you can try to work out a more peaceful way to help it recover from its undead state rather than destroying it in combat, such as helping it complete its unfinished business and find peace.”
Your [[Retributive Strike]] gains a +4 circumstance bonus to damage against an undead, or +6 if you have master proficiency with the weapon you used.
Your [[Glimpse of Redemption]]’s resistance against damage from an undead is 7 + your level.
If you use [[Liberating Step]] triggered by an undead, your ally gains a +4 circumstance bonus to checks granted by your Liberating Step, and the ally can [[Step]] twice afterward.
You don’t consider undead to be legitimate authorities, even in nations ruled by undead.
You can dart around and between your larger allies’ legs without tripping them up.
As long as you’re Small or smaller, you can end your movement in the same square as a Medium or larger ally.
Only two creatures total can share the same space when using this ability or a similar one.
''Usage'' etched onto a weapon.
Electric arcs crisscross this weapon, dealing an extra 1d6 <<tag Electricity>> damage on a hit.
On a critical hit, electricity arcs out to deal an equal amount of electricity damage to up to two other creatures of your choice within 10 feet of the target.
''Greater Shock'': Electricity damage dealt by this weapon ignores the target’s electricity resistance (and the other creatures’ on a critical hit).
{{||SpellSummaryTable}}
You shroud your hands in a crackling field of lightning.
Make a melee spell attack roll.
On a hit, the target takes 2d12 electricity damage.
If the target is wearing metal armor or is made of metal, you gain a +1 circumstance bonus to your attack roll with shocking grasp, and the target also takes 1d4 [[persistent|Persistent Damage]] electricity damage on a hit.
On a critical hit, double the initial damage, but not the persistent damage.
''Heightened (+1)'' The damage increases by 1d12, and the persistent electricity damage increases by 1.
{{||SpellSummaryTable}}
You create a wave of energy that ripples through the earth.
Terrestrial creatures in the affected area must attempt a [[Reflex]] save to avoid stumbling as the shockwave shakes the ground.
''Heightened (+1)'' The area increases by 5 feet (to a 20-foot cone at 2nd level, and so on).
{{||SaveSuccessTable}}
Improvised or of dubious make, shoddy items are never available for purchase except for in the most desperate of communities.
When available, a shoddy item usually costs half the Price of a standard item, though you can never sell one in any case.
Attacks and checks involving a shoddy item take a –2 item penalty.
This penalty also applies to any DCs that a shoddy item applies to (such as AC, for shoddy armor).
A shoddy suit of armor also worsens the armor’s check penalty by 2.
A shoddy item’s Hit Points and Broken Threshold are each half that of a normal item of its type.
You feel a connection to shokis, the rambling collectors of wayward souls, and might have found old texts written by one.
You are trained in [[Diplomacy]]. If you were already trained in Diplomacy (from your background or class, for example), you instead become trained in a skill of your choice.
You can also cast [[Disrupt Undead]] as a divine innate cantrip at will. A cantrip is heightened to a spell level equal to half your level rounded up.
Growing up in shoony society, you learned the value of honesty, friendship, and hard work, even during trying times.
You gain the trained proficiency rank in [[Diplomacy]] and [[Survival]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Shoony [[Lore]].
You enter a stance that lets you throw [[Shuriken]] with lightning speed.
While in this stance, you can use your monk feats or monk abilities that normally require unarmed attacks with shuriken instead.
You are trained in [[Athletics]], and you gain the [[Underwater Marauder]] skill feat as a bonus skill feat.
You gain the [[Ride]] feat. Additionally, you are not flat-footed while you [[Climb]].
{{LOCGFeat}}
//You can take this feat without the prerequisite if you are able to cast [[Fly]].//
You gain a +2 circumstance bonus to [[Acrobatics]] checks to [[Maneuver in Flight]] and a +5-foot status bonus to your fly Speed whenever you are flying via magic.
{{LOCGFeat}}
You can cast 4th-level [[Fly]] on yourself as an innate arcane spell once per day.
''Trigger'' An enemy critically succeeds at a [[Strike]] against an adjacent ally.
You’ve trained to protect your allies by diverting the worst attacks to yourself.
The enemy doesn’t double the damage from the triggering Strike but instead applies the normal damage to both you and your ally.
Both of you take any effects that would happen on a hit that dealt damage, such as poison, but neither of you are subject to any effects that would happen only on a critical success.
''Requirements'' You have at least one hand free. The target can’t be more than one size larger than you //unless you have [[Titan Wrestler]], in which case they can be two or three sizes bigger depending on your proficiency in Athletics.//
You push an opponent away from you.
Attempt an [[Athletics]] check against your opponent’s [[Fortitude]] DC.
{{||ActionSuccessTable}}
A weapon with the Shove trait can be used to Shove with the [[Athletics]] skill even if you don’t have a free hand.
This uses the weapon’s reach (if different from your own) and adds the weapon’s item bonus to attack rolls as an item bonus to the Athletics check.
If you critically fail a check to Shove using the weapon, you can drop the weapon to take the effects of a failure instead of a critical failure.
''Requirements'' Your last action was a successful [[Shove]].
You leverage your weight to topple foes that you move.
You attempt to [[Trip]] the target, even if the target is no longer in your reach.
''Trigger'' A creature within your reach leaves a square during a move action it’s using.
''Requirements'' You are wielding a melee weapon in two hands.
You swing your weapon at your foe, rebuffing them back.
You attempt to [[Shove]] the triggering creature, ignoring the requirement that you have a hand free.
The creature continues its movement after the Shove.
{{||SpellSummaryTable}}
You and affected allies gain preternatural knowledge of the path ahead, allowing you to intuit the best way forward and avoid potential obstacles such as difficult or confusing terrain.
For the purpose of long-distance overland travel during exploration mode, traveling through [[Difficult Terrain]] reduces you to only three-quarters your travel Speed instead of half, and traveling through greater difficult terrain reduces your travel Speed to only half your travel Speed instead of one-third.
Show the way does not prevent you from falling into traps or encountering other artificial obstacles and hazards.
''Heightened (6th)'' For the purpose of long-distance overland travel during exploration mode, traveling through difficult terrain doesn’t reduce your travel Speed at all, and traveling through greater difficult terrain reduces your travel Speed to only three-quarters of its normal value instead of one-third.
{{||SpellSummaryTable}}
You warp space to make a creature smaller.
The target shrinks to become Tiny in size.
Its equipment shrinks with it but returns to its original size if removed.
The creature’s reach changes to 0 feet.
This spell has no effect on a Tiny creature.
''Heightened (6th)'' The spell can target up to 10 creatures.
{{||SpellSummaryTable}}
You shrink the target to roughly the size of a coin. This reduces it to negligible Bulk.
You can [[Dismiss]] the spell, and the spell ends if you toss the object onto a solid surface.
The object can’t be used to attack or cause damage during the process of it returning to normal size.
If there isn’t room for the object to return to normal size when the spell ends, the spell’s duration continues until the object is in a location large enough to accommodate its normal size.
This fungus-flavored potion conveys the effects of the [[Shrink]] spell to make you and all your gear smaller. After the //1 minute// onset, you remain small for 10 minutes.
The greater variant has no onset, lasts for 1 hour, and grants the effects of a 4th-level [[Shrink]] spell. In addition, you gain a +2 item bonus to [[Stealth]] checks while shrunken.
{{||SpellSummaryTable}}
Drawing your hand in a sweeping gesture, you shroud the target in a veil of night. The target’s eyes are blanketed in darkness.
If you cast this hex on a [[Willing]] ally (for instance, one with light blindness), the ally can choose which result it gets without rolling.
Regardless of the outcome, the target is then temporarily immune for 1 minute.
{{||SaveSuccessTable}}
Choose one cantrip from the occult spell list.
You can cast this cantrip as an occult innate spell at will, heightened to a spell level equal to half your level rounded up.
You’re used to dealing with dangerous situations and sinister creatures.
You become trained in [[Deception]] (or another skill of your choice, if you’re already trained in
[[Deception)]], and you gain the [[Lengthy Diversion]] skill feat as a bonus feat.
You feel ill.
Sickened always includes a value. You take a status penalty equal to this value on all your checks and DCs.
You can’t willingly ingest anything—including elixirs and potions—while sickened.
You can spend a single action retching in an attempt to recover, which lets you immediately attempt a [[Fortitude]] save against the DC of the effect that made you sickened. On a success, you reduce your sickened value by 1 (or by 2 on a critical success).
You and your animal companion fight in tandem, distracting your foes and keeping them off balance.
Whenever you and your animal companion are adjacent to the same foe, you are both flanking that foe with each other, regardless of your actual positions.
''Trigger'' The attack roll for a [[Strike]] targeting you fails or critically fails.
You deftly step out of the way of an attack, letting the blow continue to the creature next to you.
You redirect the attack to a creature of your choice that is adjacent to you and within the reach of the triggering attack.
The attacker rerolls the [[Strike]]’s attack roll against the new target.
{{||SpellSummaryTable}}
You harmlessly place your unique magical sigil, which is about 1 square inch in size, on the targeted creature or object.
The mark can be visible or invisible, and you can change it from one state to another by using an [[Interact]] action to touch the target.
The mark can be scrubbed or scraped off with 5 minutes of work. If it’s on a creature, it fades
naturally over the course of a week. The time before the mark fades increases depending on your heightened level.
| !Heighten Level | !Fade Time |
| 1 | 1 week |
| 3 | 1 month |
| 5 | 1 year |
| 7 | Unlimited |
''Prerequisites'' Trained in [[Society]].
You learn the sign languages associated with the languages you know, allowing you to sign and understand signs.
Sign languages typically require both hands to convey more complex concepts, and they are [[Visual]] rather than [[Auditory]].
Sign language is difficult to understand during combat due to the level of attention needed, unlike basic gestures like pointing at a foe to suggest a target.
Sign language is hard to use in areas of low visibility, just like speech is difficult in a noisy environment.
Your research field adds a number of formulas to your formula book; these are your signature items.
When using a batch of infused reagents to create your signature items using [[Advanced Alchemy]], you create three items instead of two.
Each time you gain a level, you can swap one of your signature items with another formula in your formula book. This new signature item must be on your research field’s list of possible signature items.
Your innate connection to magic lets you cast more spells with greater freedom.
You gain two additional signature spells, each of which must have a minimum level of 3rd or lower.
Experience allows you to cast some spells more flexibly.
For each spell level you have access to, choose one spell of that level to be a signature spell.
You don’t need to learn heightened versions of signature spells separately; instead, you can heighten these spells freely.
If you’ve learned a signature spell at a higher level than its minimum, you can also cast all its lower-level versions without learning those separately.
If you swap out a signature spell, you can choose a replacement signature spell of the same spell level at which you learned the previous spell.
You can also [[retrain|Retraining]] specifically to change a signature spell to a different spell of that level without swapping any spells; this takes as much time as retraining a spell normally does.
{{LOCGFeat}}
You’ve spent enough time helping your comrades equip medium and heavy armor that you spread your own expertise to those armors as well.
If you have expert proficiency in any armor or unarmored defense, you also gain expert proficiency in medium and heavy armor.
{{LOCGFeat}}
The magic flowing through your signifer’s mask allows you to see in the dark, and the mask dampens the distraction caused by sudden flashes of bright light.
While wearing your signifer’s mask, you gain [[Darkvision]].
Additionally, if you are [[Dazzled]] while wearing your signifer’s mask and the target is [[Concealed]] only because you are dazzled, you reduce the flat check DC to target that creature from 5 to 3.
{{||SpellSummaryTable}}
The target makes no sound, preventing creatures from noticing it using hearing or other senses alone.
The target can’t use <<tag Sonic>>attacks, nor can it use actions with the <<tag Auditory>>trait.
This prevents it from casting spells that include <<tag Verbal>>components.
''Heightened (4th)'' The spell effect emanates from the touched creature, silencing all sound in or passing through a 10-foot radius and preventing any auditory and sonic effects in the affected area. While within the radius, creatures are subject to the same effects as the target. Depending upon the position of the effect, a creature might notice the lack of sound reaching it (blocking off the noise coming from a party, for example).
You channel a power that stifles dangerous words.
Make a melee [[Strike]].
If the attack hits, the target is unable to speak in a voice louder than a whisper for 1 round.
This prevents the target from using most auditory effects involving its voice, and it must succeed at a DC 5 flat check to [[Cast a Spell]] with a verbal component or the spell is disrupted.
If your [[Strike]] is a critical hit, the target is entirely unable to speak for 1 round and is limited to a whisper for 1 minute thereafter.
Once a creature has been affected by this ability, it is temporarily immune for 1 minute.
A quick strike to the face or mouth silences your opponent.
Make a melee [[Strike]] against a foe.
The foe must succeed at a [[Fortitude]] save against your class DC.
{{||SaveSuccessTable}}
You’ve learned how to cast many of your spells without speaking the words of power you would normally need to provide.
If the next action you use is [[Casting a Spell|Cast a Spell]] that has a verbal component and at least one other component, you can remove the verbal component. This makes the spell quieter and allows you to cast it in areas where sound can’t carry.
However, the spell still has visual manifestations, so this doesn’t make the spell any less obvious to someone who sees you casting it.
When you use Silent Spell, you can choose to gain the benefits of [[Conceal Spell]], and you don’t need to attempt a [[Deception]] check because the spell has no verbal components.
You vanish with silent treads.
You [[Step]], then [[Hide]] or [[Sneak]].
You still need to meet the requirements to Hide or Sneak, as normal.
Silver weapons are a bane to creatures ranging from devils to werewolves. Silver items are less durable than steel items, and low-grade silver items are usually merely silver-plated.
| !Unit | !Price | !Bulk |
| Chunk | 100 | L |
| Ingot | 1000 | 1 |
| !Grade | !Level | !Price |
| Low | 2 | 200/Bulk |
| Standard | 7 | 2500/Bulk |
| High | 15 | 4500/Bulk |
| !Item | !Grade | !Hardness | !HP | !BT |
| Thin | Low | 3 | 12 | 6 |
| Thin | Standard | 5 | 20 | 10 |
| Thin | High | 8 | 32 | 16 |
| Item | Low | 5 | 20 | 10 |
| Item | Standard | 7 | 28 | 14 |
| Item | High | 10 | 40 | 20 |
| Structure | Low | 10 | 40 | 20 |
| Structure | Standard | 14 | 56 | 28 |
| Structure | High | 20 | 80 | 40 |
Silver armor sickens certain creatures that touch it.
A creature with weakness to silver that critically fails an unarmed attack against a creature in cold iron armor becomes [[Sickened]] 1.
A creature with weakness to silver is sickened 1 as long as it wears silver armor.
| !Type | !Level | !Price | !Value of Silver needed | !Hardness | !HP | !BT | !Magic Level Limit |
| Low-Grade | 5 | 1400 + 140/Bulk | 70 + 7/Bulk | 5 | 20 | 10 | 8 |
| Standard-Grade | 11 | 12000 + 1200/Bulk | 1500 + 150/Bulk | 7 | 28 | 14 | 15 |
| High-Grade | 18 | 200000 + 20000/Bulk | 100000 + 10000/Bulk | 10 | 40 | 20 | Any |
Silver weapons deal additional damage to creatures with weakness to silver, like werewolves, and ignore the resistances of some other creatures, like devils.
| !Type | !Level | !Price | !Value of Silver needed |
| Low-Grade | 2 | 400 + 40/Bulk | 20 + 2/Bulk |
| Standard-Grade | 10 | 8800 + 880/Bulk | 1100 + 110/Bulk |
| High-Grade | 16 | 90000 + 9000/Bulk | 45000 + 4500/Bulk |
{{||SpellSummaryTable}}
Weapon and unarmed attacks by allies in the area are treated as [[Silver]].
In addition, this spell automatically attempts to [[Counteract]] any [[Dimension Door]] cast by a <<tag Devil>>within the area or cast by a devil attempting to enter the area using dimension door. If a devil attempts to enter the area using dimension door and the spell is counteracted, the devil remains where it started.
You can slather this silvery paste onto one melee weapon, one thrown weapon, or 10 pieces of ammunition.
Silversheen spoils quickly, so once you open a vial, you must use it all at once, rather than saving it.
For the next hour, the weapon or ammunition counts as [[Silver]] instead of its normal precious material (such as cold iron) for any physical damage it deals.
Your features become striking and your voice becomes musical and commanding, though facts and figures become hazy for you and emotion clouds your ability to reason.
''Benefit'' You gain an item bonus to [[Deception]], [[Diplomacy]], [[Intimidation]], and [[Performance]] checks. Your critical failures with any of these skills become failures instead.
''Drawback'' You take a –2 item penalty to [[Arcana]], [[Crafting]], [[Lore]], [[Occultism]], and [[Society]] checks. Choose one skill in which you are trained; for the duration, you become untrained in that skill. All your failures on checks to [[Recall Knowledge]] become critical failures.
| !Type | !Level | !Price | !Bonus | !Duration |
| Lesser | 1 | 40 | +1 | 1 minute |
| Moderate | 3 | 120 | +2 | 10 minutes |
| Greater | 11 | 3000 | +3 | 1 hour |
| Major | 17 | 30000 | +4 | 1 hour |
As long as you meditate before a gemstone worth at least 10 gp as part of your daily preparations, you are capable of seeing magic as flowing runes that reveal information about magic objects, and you can scribe a personal rune that represents you.
You gain the [[Read Aura]] and [[Sigil]] cantrips. You cast these cantrips as arcane innate spells at will. A cantrip is heightened to a spell level equal to half your level rounded up.
{{||RitualSummaryTable}}
''Cost'' a piece of hair, drop of blood, or other part of the creature to be duplicated, plus rare oils, minerals, and pigments with a total value of 300 gp;
You create an illusory duplicate of the target creature by animating ice or snow sculpted in its shape.
//The skill used by a secondary caster must be an appropriate one to [[Recall Knowledge]] about the target.//
//The ritual check is made in <<tag Secret>>.//
The simulacrum is a 4th-level creature with no special abilities. If it needs to attempt a roll or use a DC, use the moderate number for a monster, except as noted below.
It doesn’t have any specific memories from the target, but it can use information about the creature gained from any of the casters to [[Impersonate]] the target. It looks exactly like the target and has a [[Deception]] modifier to Impersonate that creature equal to the modifier of the secondary spellcaster who rolled the Deception check, with a +4 status bonus.
While it doesn’t have any of the original’s special abilities, like a dragon’s breath weapon, the illusions that make up the simulacrum allow it to appear to use those abilities; they just never seem to have an effect. For instance, against a simulacrum dragon’s breath weapon, all creatures in the area seem to critically succeed at their saving throws and take no damage.
Creatures can attempt to disbelieve the illusion by attempting a [[Perception]] check against the Deception DC of the secondary spellcaster who rolled the Deception check.
{{||ActionSuccessTable}}
This serum jolts the body to help shake off physical debilitations.
When you drink this elixir, it attempts a counteract check with the listed counteract modifier to remove the [[Clumsy]] or [[Enfeebled]] condition from a single source, using the source of that condition to determine the counteract level and DC.
| !Type | !Level | !Price | !Counteract modifier |
| Lesser | 2 | 50 | +6 |
| Moderate | 4 | 150 | +8 |
| Greater | 12 | 3250 | +19 |
| Major | 18 | 32500 | +28 |
You possess horns, a tail, or red eyes, or could otherwise be mistaken for a tiefling.
You gain the trained proficiency rank in [[Intimidation]]. If you would automatically become trained in Intimidation (from your background or class, for example), you instead become trained in a skill of your choice.
You gain the [[Intimidating Glare]] skill feat, as well as a +2 circumstance bonus on [[Deception]] checks to [[Impersonate]] when pretending to be a version of yourself who is a tiefling.
''Frequency'' once per day
''Requirements'' You haven’t acted yet on your turn.
You draw upon the reservoir of your patron’s magic that resides within your familiar.
During your turn, you can cast one spell your familiar knows that was granted by your patron’s theme or lessons without spending a spell slot to do so (or even having it prepared).
The spell must be at least 1 level lower than the highest-level spell you can cast.
''Special'' This feat has the trait corresponding to the tradition of spells you cast (arcane, divine, occult, or primal).
A grinning skull tops the bow of this macabre key.
This key can be used in place of thieves’ tools when attempting to [[Pick a Lock]], and it grants a +1 item bonus to the [[Thievery]] check.
If the skeleton key becomes broken due to a critical failure on the check, it works as normal thieves’ tools and loses its benefits until repaired.
''Activate'' {{FreeAction}} [[Interact]]; ''Frequency'' once per day; ''Trigger'' You attempt to [[Pick a Lock]] but haven’t rolled yet; ''Effect'' The key casts [[Knock]] on the lock you’re trying to pick.
| !Type | !Level | !Price | !Item Bonus | !Activation Frequency |
| Standard | 5 | 1250 | +1 | Once per day |
| Greater | 11 | 12500 | +2 | Once per hour |
The following are skills and their governing abilities:
<table>
<tr><th>Skill</th><th>Governing Ability</th></tr>
<$list filter="[tag[Skill]!tag[Feat]sort[]]">
<$set name="stat" tiddler=<<currentTiddler>> field="skill-stat">
<tr><td><$link to=<<currentTiddler>>/></td><td><$link to=<<stat>>/></td></tr>
</$set>
</$list>
</table>
The Skill trait is also used to indicate Skill Feats, which are as follows:
<table>
<tr><th>Skill Feat</th><th>Skill</th></tr>
<$list filter = "[tag[Skill]tag[Feat]sort[]]">
<tr><td><$link to=<<currentTiddler>>/></td><td><<spacedlist "[list[!!feat-skill]]">></td></tr>
</$list>
</table>
''Prerequisites'' Trained in at least one skill and expert in at least one skill.
Increase your proficiency rank in one of your skills from expert to master and in another of your skills from trained to expert.
You gain a skill feat associated with one of the skills you chose.
''Special'' You can select this feat up to five times.
''Prerequisites'' [[Intelligence]] 12.
You become trained in the skill of your choice.
You can select this feat multiple times, choosing a new skill to become trained in each time.
''Actions for this skill:''
<ul>
<$list filter="[tag[Action]contains:a-skill<currentTiddler>sort[]]">
<li><$link to=<<currentTiddler>> /></li>
</$list>
</ul>
Your ingenuity allows you to train in a wide variety of skills. You become trained in one skill of your choice. At 5th level, you become an expert in the chosen skill.
''Feats for this skill:''
<$set name="skill" value=<<currentTiddler>>>
<table>
<$list filter="T E M L">
<tr>
<th><$transclude tiddler="SkillProficiencyLongName" index=<<currentTiddler>> /></th>
<td><$list filter="[tag[Feat]!tag[Class]contains:feat-skill<skill>field:feat-spre<currentTiddler>]"> {{||FeatLink}} <br> </$list>
</td>
</tr>
</$list>
</table>
</$set>
You gain a skill feat.
This feat must be for an [[Intelligence]]-, [[Wisdom]]-, or [[Charisma]]-based skill, or for the skill you gained from your methodology.
You have a tail or similar body part that is always willing to lend a hand (so to speak).
You can perform simple [[Interact]] actions with your tail, such as opening an unlocked door.
Your tail can’t perform actions that require fingers or significant manual dexterity, including any action that would require a check to accomplish, and you can’t use it to hold items.
You were born with a tail, and with practice you’ve learned how to perform simple [[Interact]] actions with it, such as opening an unlocked door.
Your tail can’t perform actions that require fingers or significant manual dexterity, including any action that would require a check to accomplish, and you can’t use it to hold items.
You’ve always had a tail, but with practice, you’ve learned to use it for more than signaling your mood.
You can perform simple [[Interact]] actions with your tail such as opening an unlocked door.
Your tail can’t perform actions that require fingers or significant manual dexterity, including any action that would require a check to accomplish, and you can’t use it to hold items.
U:Untrained
T:Trained
E:Expert
M:Master
L:Legendary
''Rituals using this skill as primary caster:''
<ul>
<$list filter="[all[current]listed[rit-pskill]sort[]]">
<li><$link to=<<currentTiddler>> /></li>
</$list>
</ul>
''Rituals using this skill as secondary caster:''
<ul>
<$list filter="[all[current]listed[rit-sskill]sort[]]">
<li><$link to=<<currentTiddler>> /></li>
</$list>
</ul>
You can activate the magic of a scroll with a cursory read as you draw it from your belt.
You [[Interact]] to draw forth a scroll, then use [[Trick Magic Item]] on the scroll.
Your feet and weapon move in tandem.
Either [[Step]] and then [[Strike]], or Strike and then Step.
You can travel the border between the Material and Shadow Planes and even bring others along.
You can cast [[Shadow Walk]] as an occult innate spell once per day.
''Prerequisites'' Dexterity 16, [[Fleet]].
You can scoot swiftly across the ground.
You can [[Crawl]] up to half your Speed.
You can scuttle farther and faster when maneuvering alongside allies.
When you use [[Goblin Scuttle]], you can [[Stride]] up to half your Speed instead of Stepping.
You squish, slink, and skitter from cover to cover with great speed and stealth.
You can move up to your full Speed when you [[Sneak]].
You wear skulls to demoralize foes.
You become trained in [[Intimidation]] and gain the [[Intimidating Glare]] skill feat. If you’re already trained in Intimidation, you instead become trained in a skill of your choice.
If you pay 50 gp for a splendid skull mask, the mask grants you a +1 item bonus to [[Intimidation]]; its usage is worn (mask).
You take no damage from [[Falling]], regardless of the distance you fall.
Your mother was an annis hag, known for physical prowess, and you have one violet or steel-gray eye. You have thick, sturdy claws made of cold iron that grow naturally from your body.
You gain a claw unarmed attack that deals 1d6 slashing damage. Your claws are in the brawling group, have the [[Unarmed]] and [[Grapple]] traits, and are [[Cold Iron]].
{{||SpellSummaryTable}}
Each creature in the area becomes drowsy and might fall asleep.
A creature that falls [[Unconscious]] from this spell doesn’t fall [[Prone]] or release what it’s holding.
This spell doesn’t prevent creatures from waking up due to a successful [[Perception]] check, limiting its utility in combat.
{{||SaveSuccessTable}}
''Heightened (4th)'' The creatures fall unconscious for 1 round on a failure or 1 minute on a critical failure. They fall prone and release what they’re holding, and they can’t attempt Perception checks to wake up. When the duration ends, the creature is sleeping normally instead of automatically waking up.
Ammunition: Arrow.
Sleep arrows often have shafts of deep blue or black, and their fletching is exceptionally soft and downy.
An activated sleep arrow deals no damage, but a living creature hit by it is subject to the effects of a [[Sleep]] spell (DC 17).
''Craft Requirements'' Supply one casting of [[Sleep]].
''Requirements'' You have a creature [[Grabbed]] or [[Restrained]].
You pinch crucial points of your target’s nervous system, impeding its ability to function.
Attempt an [[Athletics]] check to [[Grapple]] the creature, with the following success and critical success effects instead of the usual effects.
//The Attack trait on this action was removed by errata.//
{{||ActionSuccessTable}}
''Usage'' etched onto armor.
This property makes armor slippery, as though it were coated with a thin film of oil.
You gain a +1 item bonus to [[Acrobatics]] checks to [[Escape]] and [[Squeeze]].
| !Type | !Level | !Price | !Item Bonus |
| (standard) | 3 | 450 | +1 |
| Greater | 8 | 4500 | +2 |
| Major | 16 | 90000 | +3 |
You can move through gloom with the speed of darkness.
You can move 5 feet farther when you take the [[Sneak]] action, up to your Speed.
In addition, as long as you continue to use Sneak actions and succeed at your [[Stealth]] check, you don’t become [[Observed]] if you end a Sneak action in dim light or darkness, as long as you have cover or greater cover or are concealed at the end of your turn.
''Prerequisites'' ability to cast at least one spell with the <<tag Darkness>> trait
Your shadow magic bleeds into the space around you.
Whenever you cast a spell with the darkness trait, a lingering aura of shadows reduces bright light within a 5-foot emanation around you to [[Dim Light]] until the end of your turn.
Like in natural dim light, you can use these shadows to [[Hide]], but the aura still makes your overall position obvious, so you can’t become [[Undetected]] through the use of these shadows alone.
''Requirements'' You are [[Grabbed]], [[Immobilized]], or [[Restrained]].
You have some feature that allows you to quickly evade effects that restrain you.
Attempt a check to [[Escape]]. If you succeed, you can [[Stride]], [[Step]], or make a [[Strike]] with a melee unarmed attack targeting the creature you Escaped from.
If you fail, you instead attempt to [[Escape]] a second time.
You increase your [[Multiple Attack Penalty]] as appropriate for the actions you took, but only after completing both actions. //(Remember that Escape is an Attack action.)//
You create gusts of wind when you jump, allowing you to carry yourself across greater distances.
You gain the [[Quick Jump]] and [[Powerful Leap]] skill feats as bonus feats.
You play mental games and employ cognitive tricks to throw off mind-altering effects.
Your proficiency rank for [[Will]] saves increases to master. When you roll a success at a [[Will]] save, you get a critical success instead.
''Prerequisites'' Master in [[Deception]].
You elude and evade attempts to uncover your true nature or intentions.
When a spell or magical effect tries to read your mind, detect whether you are lying, or reveal your alignment, you can attempt a Deception check against the spell or effect’s DC. If you succeed, the effect reveals nothing.
You are an expert at moving through extremely tight spaces.
You gain the [[Quick Squeeze]] skill feat, even if you’re not trained in [[Acrobatics]].
When you roll a success on an Acrobatics check to [[Squeeze]], you get a critical success instead.
{{||SpellSummaryTable}}
You continually and harmlessly slough off the top layer of your skin while new skin regenerates immediately, quickly moving damaging substances away from your body.
The flat check to remove [[Persistent Damage]] from effects that coat your skin (such as most persistent <<tag Acid>> damage) is reduced to 5, and you gain a +2 status bonus to your initial save against contact poison (but not to further saves, since by that point, the toxin has already entered your system).
If you’re suffering from an effect other than persistent damage that depends on continuous contact with your skin, if that effect allows a saving throw, you receive a new saving throw against that effect at the end of each turn when you attempt your flat checks against persistent
damage, and you also receive a +2 status bonus to those saving throws.
While affected by this spell, your continually shedding skin makes you much easier to [[Track]]. Anyone Tracking you gains a +2 circumstance bonus to do so, and you cannot Hide Your Tracks.
{{||SpellSummaryTable}}
You dilate the flow of time around the target, slowing its actions.
//They make a [[Fortitude]] save.//
{{||SaveSuccessTable}}
''Heightened (6th)'' You can target up to 10 creatures.
You have fewer actions.
Slowed always includes a value. When you regain your actions at the start of your turn, reduce the number of actions you regain by your slowed value.
Because slowed has its effect at the start of your turn, you don’t immediately lose actions if you become slowed during your turn.
//If you are both [[Stunned]] and slowed, actions lost to the Stunned condition also count against those lost to the Slowed condition in the turn in which you recover from being Stunned.//
Slumber wine sees its greatest use in games of intrigue, where an absence can be more devastating than injury.
Characters unconscious from slumber wine can’t wake up by any means while the poison lasts, don’t need to eat or drink while unconscious in this way, and appear to be recently dead unless an examiner succeeds at a DC 40 Medicine check.
| !Saving Throw |DC 32 [[Fortitude]] |
| !Onset |1 hour |
| !Maximum Duration |7 days |
| !Stage 1 |[[Unconscious]] (1 day) |
| !Stage 2 |[[Unconscious]] (2 days) |
| !Stage 3 |[[Unconscious]] (3 days) |
Your attacks deal more damage, even against creatures that aren’t [[Flat-Footed]].
When you succeed or critically succeed at a [[Strike]] against a creature that isn’t flat-footed, you also deal 1d6 precision damage.
This applies only if you’re using a weapon or unarmed attack you could deal sneak attack damage with.
At 14th level, if you would normally deal 3d6 or more sneak attack damage to flat-footed creatures, you deal 2d6 precision damage to creatures that aren’t flat‑footed.
Your expertise enables you to knock away spells.
You can use [[Cut from the Air]] against ranged spell attack rolls.
You have a tail that serves as a potent weapon.
You gain a tail unarmed attack that deals 1d6 bludgeoning damage, has the [[Sweep]] trait, and is in the brawling weapon group.
''Prerequisites'' [[Divine Ally]] (blade), __Tenets of Good__.
Your blade ally becomes an even more powerful tool against evildoers.
Select one foe you can see.
Until the start of your next turn, your [[Strike]]s with the weapon your blade ally inhabits against that foe deal an extra 4 <<tag Good>> damage, increasing to 6 if you have master proficiency with this weapon.
If the foe attacks one of your allies, the duration extends to the end of that foe’s next turn.
If the foe continues to attack your allies each turn, the duration continues to extend.
''Prerequisites'' [[Blade Ally|Divine Ally]], tenets of evil.
Your blade ally shares your lust for the blood of good creatures.
Select one enemy you can see.
Until the start of your next turn, your [[Strike]]s against that foe using the weapon your blade ally inhabits deal an extra 4 evil damage, increasing to 6 if you have master proficiency with this weapon.
If the chosen enemy attacks you before the start of your next turn, the duration extends to the end of that enemy’s next turn. If the enemy continues to attack you each turn, the duration
continues to extend.
''Frequency'' Once per round.
''Additive 1''.
''Trigger'' You use [[Quick Alchemy]] to craft an alchemical bomb with a level at least 1 lower than your advanced alchemy level.
You cause the bomb to create a cloud of thick smoke, in addition to its normal effects.
When thrown, the bomb creates a cloud of smoke in a 10-foot-radius burst. You choose which corner of the target’s space (or the space in which the bomb lands) the cloud is centered on.
Creatures within that area have the [[Concealed]] condition, and all other creatures are concealed to them.
The smoke lasts for 1 minute or until dissipated by a strong wind.
You have a connection to smoke and haze. You gain the Smoke Blending reaction.
''Smoke Blending'' {{ReactionIcon}} <<tag Sylph>> ''Trigger'' A creature attempts a flat check to target you because you’re [[Concealed]] or [[Hidden]] due to fog, haze, mist, or smoke; ''Effect'' You shroud yourself in smoke, making it harder for your foe to hit you. If you’re concealed, the DC of the flat check increases from 5 to 7; if you’re hidden, it increases from 11 to 13.
With a sharp twist of this item, you instantly create a screen of thick, opaque smoke in a burst centered on one corner of your space.
All creatures within that area are [[Concealed]], and all other creatures are [[Concealed]] to them.
The smoke lasts for 1 minute or until dispersed by a strong wind.
| !Type | !Level | !Price | !Burst Radius |
| Lesser | 1 | 30 | 5' |
| Greater | 7 | 530 | 20' |
You gain fire resistance equal to half your level (minimum 1).
You automatically succeed at the DC 5 flat check to target a [[Concealed]] creature if that creature is concealed only by smoke.
''Requirements'' You have one hand free, and your target is within reach of that hand.
You combine an attack with quick grappling moves to throw an enemy off balance as long
as it stays in your reach.
Make a [[Strike]] while keeping one hand free.
If this Strike hits, the target is [[Flat-Footed]] until the start of your next turn or until it’s no longer within the reach of your hand, whichever comes first.
''Size'' Small
''Melee'' {{OneAction}} jaws [[Finesse]], damage 1d8 piercing
''Str'' +3, ''Dex'' +3, ''Con'' +1, ''Int'' –4, ''Wis'' +1, ''Cha'' +0
''Hit Points'' 6
''Skill'' [[Stealth]]
''Senses'' [[Low-Light Vision]], [[Scent]] (Imprecise, 30 feet)
''Speed'' 20 feet, climb 20 feet, swim 20 feet
''Support Benefit'' Your snake holds your enemies with its coils, interfering with reactions. Until the start of your next turn, any creature your snake threatens can’t use reactions triggered by your actions unless its level is higher than yours.
''Advanced Maneuver'' [[Constrict (Snake)]]
You can apply snake oil onto a wound or other outward symptom of an [[Affliction]] or condition (such as sores from a disease or discoloration from a poison).
For the next hour, the symptom disappears and the wounded or afflicted creature doesn’t feel as if it still has the wound or affliction, though all effects remain.
A creature can uncover the ruse by succeeding at a DC 17 [[Perception]] check, but only if it uses a [[Seek]] action to specifically examine the snake oil’s effects.
You give a quick shout, hoping to shake the fog clouding your ally’s thoughts.
Choose one target ally within your marshal’s aura who is affected by a <<tag Mental>> effect that allowed a [[Will]] save and has a duration of no longer than 1 minute.
That ally can immediately attempt a Will save with a +1 circumstance bonus against the effect’s DC, ending the effect on a success.
This can’t end the effect for any creatures other than your target ally.
Regardless of the result of the save, your ally is temporarily immune to Snap Out of It! for 10 minutes.
You’ve learned to react with ranged weapons when a creature is in close quarters.
You can use a reaction that normally allows you to make a melee weapon [[Strike]] to instead make a ranged weapon Strike.
You must be Striking an adjacent target.
If necessary for the reaction’s trigger, you treat your ranged weapon as if it had a reach of 5 feet.
If the reaction has other requirements, such as wielding a specific kind of weapon, Snap Shot doesn’t allow you to ignore them; it allows you only to replace a melee weapon Strike with a ranged weapon Strike.
''Trigger'' A creature fails or critically fails a save against your snare.
Your snares are so befuddling that your victims rarely notice you slipping out of sight.
If you have expert proficiency in [[Deception]], you can [[Create a Diversion]] against the triggering creature.
If you have expert proficiency in [[Intimidation]], you can instead [[Demoralize]] the triggering creature.
If you have both, choose one of the two effects.
''Prerequisites'' Trained in [[Crafting]].
You can use the [[Craft]] activity to create [[Snare]]s.
When you select this feat, you add the formulas for four common snares to your formula book.
''Prerequisites'' Expert in [[Crafting]].
Your expertise makes your snares more powerful, and you can place them quickly and
efficiently.
Each day during your daily preparations, you can prepare three snares from your formula book for quick deployment; if the snare normally takes 1 minute to [[Craft]], you can Craft it with 3 [[Interact]] actions.
Snares prepared in this way don’t cost you any resources to Craft.
The number of snares you can prepare this way increases to four if you are a master in [[Crafting]], and to five if you are legendary.
When you Craft and deploy a snare that deals damage, any creature that critically fails its saving throw against the snare’s initial effect and takes damage becomes [[Flat-Footed]] until the end of its next turn.
{{||SpellSummaryTable}}
You may not have placed your snare in the right place, but you can magically move it there.
You teleport the target snare to another unoccupied location in range.
''Heightened (+1)'' The range of the spell increases by 10 feet.
''Prerequisites'' trained in [[Crafting]].
You are adept at the time-honored kobold art of trap making.
<<trainnodupe "Crafting">>
You gain access to all uncommon kobold snares.
You gain the [[Snare Crafting]] feat, though when choosing your formulas for that feat, you can also choose from uncommon kobold snares, as well as common snares.
You specialize in creating quick traps to obstruct your enemies on the battlefield.
If your proficiency rank in [[Crafting]] is expert, you gain the formulas for three common or uncommon snares.
If your rank is master, you gain 6. If your rank is legendary, you gain 9.
Each day during your daily preparations, you can prepare four snares from your formula book for quick deployment;
if they normally take 1 minute to [[Craft]], you can Craft them with 3 Interact actions.
The number of snares increases to six if you have master proficiency in Crafting and eight if you have legendary proficiency in Crafting.
Snares prepared in this way don’t cost you any resources to Craft.
You've learned to create a limited number of snares at no cost.
Each day during your daily preparations, you can prepare four snares from your formula book for quick deployment; if they normally take 1 minute to [[Craft]], you can Craft them with 3 Interact actions.
The number of snares increases to six if you’re a master in Crafting and eight if you’re legendary.
Snares prepared in this way don’t cost you any resources to Craft.
''Special'' The feat counts as [[Snare Specialist]] for the purpose of feat prerequisites.
If you also have the Snare Specialist ranger feat, the quick snares from both feats are cumulative.
<<archetypefeatlist "4 6 8 10 12 14" "Snarecrafter">>
You can attempt to move to another place while becoming or staying undetected.
[[Stride]] up to half your Speed. (You can use Sneak while [[Burrow]]ing, [[Climb]]ing, [[Fly]]ing, or [[Swim]]ming instead of Striding if you have the corresponding movement type; you must move at half that Speed.)
If you’re [[Undetected]] by a creature and it’s impossible for that creature to observe you (for a typical creature, this includes when you’re [[Invisible]], the observer is [[Blinded]], or you’re in darkness and the creature can’t see in darkness), for any critical failure you roll on a check to Sneak, you get a failure instead. You also continue to be undetected if you lose [[Cover]] or [[Greater Cover]] against or are no longer [[Concealed]] from such a creature.
At the end of your movement, the GM rolls your [[Stealth]] check in secret and compares the result to the [[Perception]] DC of each creature you were hidden from or undetected by at the start of your movement.
If you have cover or greater cover from the creature throughout your Stride, you gain the +2 circumstance bonus from cover (or +4 from greater cover) to your Stealth check. Because you’re moving, the bonus increase from Taking Cover doesn’t apply.
You don’t get to roll against a creature if, at the end of your movement, you neither are concealed from it nor have cover or greater cover against it. You automatically become observed by such a creature.
//You can't use Concealment granted by [[Blur]] to sneak.//
{{||ActionSuccessTable}}
When the user [[Strike]]s a creature that has the [[Flat-Footed]] condition with an [[Agile]] or [[Finesse]] melee weapon, an agile or finesse unarmed attack, or a ranged weapon attack, they also deals the listed [[Precision]] damage.
For a ranged attack with a thrown weapon, that weapon must also be an agile or finesse weapon.
You gain the [[Sneak Attack]] class feature, except it deals 1d4 damage, increasing to 1d6 at 6th level.
You don’t increase the number of dice as you gain levels.
It is almost impossible to spot you without taking effort to look.
When you roll a failure on a [[Sneak]] action, you get a success instead.
You can still critically fail.
Stealth is an important tool in your arsenal.
You can move 5 feet farther when you take the [[Sneak]] action, up to your Speed.
In addition, as long as you continue to use Sneak actions and succeed at your Stealth check, you don’t become [[Observed]] if you don’t have [[Cover]] or greater cover and aren’t [[Concealed]] at the end of the Sneak action, as long as you have cover or greater cover or are concealed at the end of your turn.
//This is identical to the Goblin feat [[Very Sneaky]].//
Affix to armor.
''Requirements'' You are in expert in [[Thievery]].
This small silver skeleton key can be pinned to armor or a sleeve.
When you turn the key to activate {{OneAction}} it, for the next minute, if the outcome of any your attempts to [[Pick a Lock]] is a critical failure, you get a failure instead.
You are acclimated to living in frigid lands and have skin ranging from sky blue to navy in color, as well as blue fur. You gain cold resistance equal to half your level (minimum 1). You treat environmental cold effects as if they were one step less extreme (incredible cold becomes extreme, extreme cold becomes severe, and so on).
You’re the child of a winter hag, with one blue-white eye and an affinity for rime and snow.
When moving over ice or snow in arctic terrain, you always gain the benefits of the [[Cover Tracks]] action without needing to use the activity or having to move half your Speed.
You don’t treat icy terrain as [[Uneven Ground]] (though it’s still [[Difficult Terrain]] for you), and you ignore difficult terrain caused by snow.
Cold precipitation and environmental cold effects don’t alter the time it takes for you to become fatigued.
You have a thicker coat and bulkier frame to defend against the cold, granting you cold resistance equal to half your level (minimum 1). You treat [[environmental cold effects|Temperature Effects]] as if they were one step less extreme (incredible cold becomes extreme, extreme cold becomes severe, and so on).
{{||SpellSummaryTable}}
You throw a magically propelled and chilled ball of dense snow.
The target takes 2d4 cold damage and potentially other effects, depending on the result of your spell attack roll.
''Heightened (+1)'' The damage increases by 2d4.
{{||ActionSuccessTable}}
''Usage'' etched onto armor
A set of soaring armor helps you fly faster and protects you and nearby allies from falling.
While wearing soaring armor, you gain a +10-foot item bonus to your fly Speed, if you have one. As normal, if your fly Speed is based on your land Speed and you already have an item bonus to your land Speed, these bonuses aren’t cumulative.
''Activate'' {{ReactionIcon}} [[Command]]; ''Trigger'' You or a creature within 60 feet of you is falling; ''Effect'' You cast [[Feather Fall]] on the triggering creature.
''Frequency'' once per day.
To be a tengu is to be unburdened by the concerns of the world below.
You grow a pair of magical wings or expand your existing ones. For 5 minutes, you gain a fly Speed equal to your land Speed or 20 feet, whichever is greater.
Your wings grow stronger.
You gain the effects of [[Soaring Flight]] at all times.
Wings free you from the shackles of the ground below.
Add the bat and bird forms in [[Aerial Form]] to your [[Wild Shape]] list.
If you have [[Insect Shape]], you also add the wasp form to your wild shape list.
If you have [[Ferocious Shape]], you also add the pterosaur form to your wild shape list.
Whenever you use wild shape to gain a form that grants you a specific [[Acrobatics]] modifier, you gain a +1 status bonus to Acrobatics checks.
You’re extremely extroverted, and you often spend your time carousing or otherwise socializing.
You are trained in [[Diplomacy]] (or another skill of your choice if you were already trained in Diplomacy), and you gain the [[Hobnobber]] skill feat.
You have built a reputation for yourself in your social identity.
Choose one archetype that you meet the prerequisites for. You gain that archetype’s dedication feat and can select feats from that archetype, even if you haven’t yet gained enough feats in the vigilante archetype to take another dedication feat.
These feats become part of your social identity and gain the <<tag Social>> trait—for instance, a fighter vigilante could take the wizard dedication feat and have a wizard social
identity.
Using these feats in your social identity doesn’t risk exposing your vigilante identity, but using them in your vigilante identity could put you at risk for exposure.
''Key Ability'' [[Intelligence]].
You understand the people and systems that make civilization run, and you know the historical events that make societies what they are today. Further, you can use that knowledge to navigate the complex physical, societal, and economic workings of settlements.
{{||SkillActionList}}
{{||SkillFeatList}}
{{||SkillRitualList}}
Years toiling in soil have made you an expert digger.
You gain a burrow Speed of 10 feet through loose soil or dirt.
If you rest outdoors for 10 minutes during the day, you regain Hit Points equal to your Constitution modifier × half your level.
You gain this benefit in addition to any healing from [[Treat Wounds]].
Leshies whose plant nourishment does not rely on photosynthesis require a similarly suitable environment. For example, fungus leshies need dark, damp environments and a pile of decaying plant matter.
{{||SpellSummaryTable}}
You conjure a bank of fog so thick it impedes movement as well as sight.
This functions as [[Obscuring Mist]] except that the area is also [[Difficult Terrain]].
You can [[Dismiss]] the spell.
Sometimes your case splinters into smaller mysteries, but you never lose sight of the big picture.
Once per day when you give up on the subject of a lead due to using [[Pursue a Lead]] again, you can designate the lead you stopped pursuing as your solid lead for the day.
Even though you stopped following the solid lead, you can change back to your solid lead any number of times by using a single action, which has the <<tag Concentrate>> trait.
Doing so ends one of your current leads as normal.
During your next daily preparations, you can maintain your solid lead or you can remove it; removing it allows you to designate a new solid lead later that day.
A somatic component is a specific hand movement or gesture that generates a magical nexus.
Somatic components, such as twisting your hand in a complex gesture, shape magical energy into directed forms. While verbal components bring forward powerful forces, somatic components compel those forces to obey the spellcaster’s wishes. Spells that have only somatic components typically have a physical effect or require touching a creature.
The spell gains the [[Manipulate]] trait and requires you to make gestures.
You can use this component while holding something in your hand, but not if you are restrained or otherwise unable to gesture freely.
Spells that require you to touch the target require a somatic component. You can do so while holding something as long as part of your hand is able to touch the target (even if it’s through a glove or gauntlet).
{{BardConSub}}
{{||SpellSummaryTable}}
You maintain a brisk performance that keeps allies on the move.
You and your allies in the area can [[Hustle]] for the spell’s duration, even though you are also [[Sustaining the Spell|Sustain a Spell]].
You and your allies then become temporarily immune for 1 day.
''Heightened (6th)'' You can Sustain the Spell for up to 2 hours.
''Heightened (9th)'' You can Sustain the Spell for up to 4 hours.
{{||SpellSummaryTable}}
You bolster your allies’ physical strength with a hearty exhortation.
You and your allies gain a +1 status bonus to [[Athletics]] checks and to their DCs against Athletics skill actions such as [[Disarm]], [[Shove]], and [[Trip]].
{{||SpellSummaryTable}}
You chant a dirge or an elegy that either rouses the dead to action or reminds undead that they should lay to rest.
If you target dead creatures, the bodies animate and can continue acting as if they were alive. A creature animated in this way has 60 temporary Hit Points. The animated creatures are [[Slowed]] 1 but can otherwise act normally. Creatures animated with this spell die again once the spell ends.
If you target undead creatures, each undead must attempt a [[Will]] save.
{{||SaveSuccessTable}}
You receive a +1 circumstance bonus on [[Deception]] checks to [[Impersonate]] a mimicked voice, where the sound of the voice is the only factor; if you are a master in Deception, you gain a +2 circumstance bonus instead. You also gain a +1 circumstance bonus on [[Performance]] checks to sing; if you are a master in Performance, you gain a +2 circumstance bonus instead.
{{||SpellSummaryTable}}
You grace the target’s mind, boosting its mental defenses and healing its wounds.
The target regains 1d10+4 Hit Points when you Cast the Spell and gains a +2 status bonus to saves against <<tag Mental>>effects for the duration.
''Heightened (+1)'' The amount of healing increases by 1d10+4.
{{||SpellSummaryTable}}
You draw upon your muse to soothe your allies.
Choose one of the following three effects:
* The spell attempts to [[Counteract]] <<tag Fear>> effects on the targets.
* The spell attempts to counteract effects imposing [[Paralysis|Paralyzed]] on the targets.
* The spell restores 7d8 Hit Points to the targets.
''Heightened (+1)'' When used to heal, soothing ballad restores 1d8 more Hit Points.
{{||SpellSummaryTable}}
You call forth a magical mist of positive energy that envelops a creature.
The mist restores 2d8 Hit Points to a target living creature and ends one source of persistent <<tag Acid>>, <<tag Bleed>>, <<tag Fire>>, <<tag Negative>>, or <<tag Poison>> damage affecting it.
If the creature is taking persistent damage from multiple sources, you select which one is removed.
Against an <<tag Undead>> target, you deal 2d8 positive damage (basic [[Fortitude]] save); if it fails the save, it also takes 2 persistent positive damage.
''Heightened (+1)'' The amount of healing (or damage to an undead target) increases by 1d8, and the persistent positive damage to an undead creature increases by 1.
{{||SpellSummaryTable}}
You attempt to calm the target by uttering soothing words in a calm and even tone. //They do not need to be able to hear or understand you.//
The target gains a +1 status bonus to [[Will]] saving throws. This bonus increases to +2 against <<tag Emotion>> effects.
In addition, when you Cast this Spell, you can attempt to [[Counteract]] one emotion effect on the target.
''Heightened (5th)'' The bonus to saves increases to +2, or +3 against emotion effects.
!! Splats
<$list filter="[tag[Bloodline]sort[]]" />
!! Class Features
| !Level | !Features |
| 1 | 3 1st level slots |
| 2 | +1 1st level slot |
| 3 | [[Signature Spells]], 3 2nd level slots |
| 4 | +1 2nd level slot |
| 5 | [[Magical Fortitude]], 3 3rd level slots |
| 6 | +1 3rd level slot |
| 7 | [[Expert Spellcaster]], 3 4th level sllots |
| 8 | +1 4th level slot |
| 9 | [[Lightning Reflexes]], 3 5th level slots |
| 10 | +1 5th level slot |
| 11 | [[Alertness]], Simple Weapon Expertise, 3 6th level slots |
| 12 | +1 6th level slot |
| 13 | [[Defensive Robes]], [[Weapon Specialization]], 3 7th level slots |
| 14 | +1 7th level slot |
| 15 | [[Master Spellcaster]], 3 8th level slots |
| 16 | +1 8th level slot |
| 17 | __[[Resolve]]__, 3 9th level slots |
| 18 | +1 9th level slot |
| 19 | [[Bloodline Paragon]], [[Legendary Spellcaster]] |
| 20 | |
!! Class Feats
{{||ClassFeatList}}
Choose a bloodline.
You become trained in the bloodline’s two skills; for each of these skills in which you were already trained, you become trained in a skill of your choice.
You cast spells like a sorcerer. You gain access to the [[Cast a Spell]] activity.
You gain a spell repertoire with two common cantrips from the spell list associated with your bloodline ,or any other cantrips you learn or discover.
You’re trained in spell attack rolls and spell DCs for your tradition’s spells.
Your key spellcasting ability for sorcerer archetype spells is [[Charisma]], and they are sorcerer spells of your bloodline’s tradition.
You don’t gain any other abilities from your choice of bloodline.
!! Bloodlines
<$list filter="[tag[Bloodline]sort[]]" />
<<levelfeatlist "4 6 8 12 18" "[tag[Archetype]field:feat-arch[Sorcerer]]">>
{{||SpellSummaryTable}}
You siphon off a portion of the target’s soul to bolster your own vitality.
The target //takes 1d4// <<tag Negative>> damage //with a basic [[Fortitude]] save//.
//In addition, if the target fails the save they become [[Drained]] 1. If they critically fail, they become [[Drained]] 2.//
You gain temporary Hit Points equal to the total amount of HP the target loses, including the HP lost from becoming drained.
''Heightened (+1)'' Increase the damage by 1d4.
You gain [[Spiritsense]] as an imprecise sense with a range of 60 feet.
Spiritsense enables you to sense the spirits of creatures, including living creatures, most non mindless undead, and haunts within the listed range.
As with your hearing and other imprecise senses, you still need to [[Seek]] to locate an [[Undetected]] creature.
As spiritsense detects spiritual essence, not physical bodies, it can detect spirits projected by spells such as [[Project Image]] or possessing otherwise soulless objects.
It can’t detect soulless bodies, constructs, or objects, and like most senses, it doesn’t penetrate through solid objects.
{{||SpellSummaryTable}}
A cacophonous noise blasts out, dealing 2d10 <<tag Sonic>> damage.
Each creature must attempt a [[Fortitude]] save.
{{||SaveSuccessTable}}
''Heightened (+1)'' The damage increases by 1d10.
You spread rumors, which may or may not be true, about a specific subject.
If the subject of your rumor is not currently the subject of any contradictory rumors, this takes as long as it would normally take you to [[Gather Information]] (typically 2 hours), at the end of which the GM rolls a secret [[Deception]] check to see how well you spread the rumor.
If your rumor matches any current rumors about the subject, it takes less time to spread the rumor, and if you are attempting to overtake a particularly popular and contradictory rumor, it takes much longer or may be impossible.
The DC similarly increases or decreases depending on how plausible your rumor is.
{{||ActionSuccessTable}}
You fold your spell into a seed.
If your next action is to [[Cast a Spell]] using 1 action or 2 actions, the spell instead plants itself in an adjacent square.
You must make all decisions regarding the spell at the time you cast it.
Within the next 10 minutes, you can direct your sown spell to sprout and produce the spell’s effects as a reaction, which is triggered when a creature enters the sown spell’s space or a square adjacent to it.
You can have only one sown spell at a time, and if you don’t trigger the spell within 10 minutes, it dissipates and the spell is lost.
A creature can notice the sown spell with a successful [[Perception]] check against your spell DC.
\define spacedlist(filter:"")
<$list filter=<<__filter__>> ><$link/> </$list>
\end
//Implied by [[Quivering Palm]].//
If you hit and the target is alive, anytime during the duration, you can spend a single action, which has the Auditory and Concentrate traits, to speak a word of death that could instantly slay it.
{{||SpellSummaryTable}}
You can ask questions of, receive answers from, and use the [[Diplomacy]] skill with animals.
The spell doesn’t make them more friendly than normal.
Cunning animals are likely to be terse and evasive, while less intelligent ones often make inane comments.
You can ask questions of, receive answers from, and use the [[Diplomacy]] skill with bats. You gain a +2 circumstance bonus on all [[Diplomacy]] checks to [[Make an Impression]] on bats or [[Request]] something from bats.
You have a connection with creatures that share your physiology.
You can ask questions of, receive answers from, and use the [[Diplomacy]] skill with plants or fungi that match your leshy heritage.
Generally, fungus leshies can speak to mushrooms and fungi; gourd leshies can speak to gourds, melons, and similar fruiting plants; leaf leshies can speak with deciduous trees; and vine leshies can speak with vines and climbing plants.
The GM determines which plants or fungi count for this ability.
{{||SpellSummaryTable}}
You can ask questions of and receive answers from plants, but the spell doesn’t make them more friendly or intelligent than normal.
Most normal plants have a distinctive view of the world around them, so they don’t recognize details about creatures or know anything about the world beyond their immediate vicinity.
Cunning plant monsters are likely to be terse and evasive, while less intelligent ones often make inane comments.
//Implied by [[Word of Recall]].//
Any participant in the ritual can spend a single action, which has the Concentrate trait, to utter a word of power you choose when you cast the spell. When they do, all the participants can immediately return to the sanctuary from any distance, as long as they are on the same plane as the sanctuary. Each participant arrives in the position in which they were standing during the casting of the ritual. When the word is spoken, all other participants know it, and each can choose whether or not to return to the sanctuary at that time. The ritual then immediately ends
Your nimble and savage animal companions become cunning enough to become specialized.
Each companion gains one specialization of your choice.
''Special'' You can select this feat more than once. Each time, add a different specialization to your nimble and savage companions. Your nimble and savage companions can have up to three specializations each.
Your animal companion continues to grow in power and ability, and it is now cunning enough to become specialized.
Your animal companion gains one specialization of your choice.
''Special'' You can select this feat up to three times. Each time, add a different specialization to your companion.
You’ve trained your mount to perform in unusual or even extreme circumstances, granting it abilities far beyond others of its kind.
Your mount gains one specialization of your choice.
''Special'' You can select this feat up to three times. Each time, add a different specialization to your mount. You mount can’t have more than three specializations.
''Prerequisites'' Trained in [[Crafting]].
Your training focused on Crafting one particular kind of item.
Select one of the specialties listed below; you gain a +1 circumstance bonus to Crafting checks to [[Craft]] items of that type. If you are a master in Crafting, this bonus increases to +2.
If it’s unclear whether the specialty applies, the GM decides.
Some specialties might apply only partially. For example, if you were making a morningstar and had specialty in woodworking, the GM might give you half your bonus because the item requires both blacksmithing and woodworking.
|!Specialty|!Applicable Items|
|Alchemy|Alchemical items such as elixirs (you must have the [[Alchemical Crafting]] Feat to Craft alchemical items)|
|Artistry|Fine art, including jewelry|
|Blacksmithing|Durable metal goods, including metal armor|
|Bookmaking|Books and paper|
|Glassmaking|Glass, including glassware and windows|
|Leatherworking|Leather goods, including leather armor|
|Pottery|Ceramic goods|
|Shipbuilding|Ships and boats|
|Stonemasonry|Stone goods and structures|
|Tailoring|Clothing|
|Weaving|Textiles, baskets, and rugs|
|Woodworking|Wooden goods and structures|
{{||SpellSummaryTable}}
You create a semicorporeal hand out of your essence that delivers [[Touch]] spells for you.
Whenever you [[Cast a Spell]] with a range of touch, you can have the hand crawl to a target within range along the ground, touch it, and then crawl back to you. //(This does not mean that the hand takes the [[Crawl]] action.)//
When making a melee spell attack with the hand, you use your normal bonuses.
The hand can move as far as it needs to within range.
The hand has your AC and saves, but any damage to the hand destroys it and causes you to take 1d6 damage.
''Usage'' etched onto a weapon.
Attacks with a speed weapon are supernaturally swift.
While wielding a speed weapon, you gain the [[Quickened]] condition, but you can use the additional action granted only to make a [[Strike]] with the etched weapon.
You can perform rituals in only a fraction of the usual time.
If a ritual has a casting time measured in days, you can cast it in an equal number of hours.
If this results in a ritual longer than 8 hours, you split the ritual between multiple days, as normal for a ritual.
//Spells are magical effects.//
Sort by: <$button set="!!sort-order" setTo="title">Name</$button> <$button set="!!sort-order" setTo="m-level">Level</$button>
Show: <$button set="!!tag-filter" setTo="Spell">All</$button>, or only
<$button set="!!tag-filter" setTo="Arcane">Arcane</$button>
<$button set="!!tag-filter" setTo="Divine">Divine</$button>
<$button set="!!tag-filter" setTo="Occult">Occult</$button>
<$button set="!!tag-filter" setTo="Primal">Primal</$button>
<table>
<tr><th>Spell</th><th>Level</th><th>Arcane</th><th>Divine</th><th>Occult</th><th>Primal</th><th>Focus</th></tr>
<$list filter="[tag[Spell]tag{!!tag-filter}sortan{!!sort-order}]">
<tr><th align="left"><$link/></th><td>{{!!m-level}}</td>
<td><$list filter="[all[current]tag[Arcane]]">✓</$list></td>
<td><$list filter="[all[current]tag[Divine]]">✓</$list></td>
<td><$list filter="[all[current]tag[Occult]]">✓</$list></td>
<td><$list filter="[all[current]tag[Primal]]">✓</$list></td>
<td><$list filter="[all[current]tag[Focus Spell]]">✓</$list></td>
</tr>
</$list>
</table>
You theorize that spell slots are a shorthand for an underlying energy that powers all spellcasting, and you’ve found a way to tinker with the hierarchy of spell slots, combining them to fuel more powerful spells.
When you make your daily preparations, you can trade two spell slots of the same level for a bonus spell slot of up to 2 levels higher than the traded spell slots.
You can exchange as many spell slots as you have available.
Bonus spell slots must be of a level you can normally cast, and each bonus spell slot must be of a different spell level.
You can also trade any spell slot for two additional cantrips, though you cannot trade more than one spell slot at a time for additional cantrips in this way.
You can merge spells, producing multiple effects with a single casting.
One slot of each level of spell you can cast, except 2nd level and 1st level, becomes a spell combination slot (this doesn’t apply to cantrips).
When you prepare your spells, you can fill a combination slot with a combination of two spells. Each spell in the combination must be 2 or more spell levels below the slot’s level, and both must target only one creature or object or have the option to target only one creature or object.
Each spell in the combination must also have the same means of determining whether it has an effect—both spells must require a ranged spell attack roll, require the same type of saving throw, or automatically affect the target.
When you cast a combined spell, it affects only one target, even if the component spells normally affect more than one.
If any spell in the combination has further restrictions (such as targeting only living creatures), you must abide by all restrictions.
The combined spell uses the shorter of the component spells’ ranges.
Resolve a combined spell as if were a single spell, but apply the effects of both component spells. For example, if the spell’s target succeeded at the save against a combined spell, it would apply the success effect of each spell, and if it critically failed, it would apply the critical failure effect of both spells.
| !Counteracting Level | !1 | !2 | !3 | !4 | !5 | !6 | !7 | !8 | !9 | !10 |
| !1 | 0 | 0 | +10 | +10 | x | x | x | x | x | x |
| !2 | -10 | 0 | 0 | +10 | +10 | x | x | x | x | x |
| !3 | -10 | -10 | 0 | 0 | +10 | +10 | x | x | x | x |
| !4 | -10 | -10 | -10 | 0 | 0 | +10 | +10 | x | x | x |
| !5 | -10 | -10 | -10 | -10 | 0 | 0 | +10 | +10 | x | x |
| !6 | -10 | -10 | -10 | -10 | -10 | 0 | 0 | +10 | +10 | x |
| !7 | -10 | -10 | -10 | -10 | -10 | -10 | 0 | 0 | +10 | +10 |
| !8 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | 0 | 0 | +10 |
| !9 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | 0 | 0 |
| !10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | -10 | 0 |
You don’t just resist magic; you devour it.
Whenever you succeed at a saving throw against a spell or magical effect, you gain temporary Hit Points equal to double the spell’s level, or equal to the level if the magical effect isn’t a spell.
These temporary Hit Points last until the end of your next turn.
{{||SpellSummaryTable}}
You ward a creature against the effects of a single spell.
Choose a spell and name it aloud as part of the verbal component.
Spell immunity attempts to [[Counteract]] that spell whenever spell immunity’s target is the target of the named spell or in that spell’s area.
Successfully counteracting a spell that targets an area or multiple targets with spell immunity negates the effects only for the target affected by spell immunity.
//Note that the target does not have to be willing, so you could name a healing spell.//
You have mastered a handful of spells to such a degree that you can cast them even if you haven’t prepared them.
Select any four spells of 9th level or lower that you have access to. Each spell you select must be of a different level.
These spells are automatically prepared when you make your daily preparations and have their own spell slots.
You can select a different array of spells by spending 1 week of downtime retraining your mastered spells.
You’ve studied ways of overcoming the innate magical resistance that dragons, otherworldly beings, and certain other powerful creatures have.
Any creature that has a status bonus to saving throws against magic reduces that bonus by 1 against your spells.
''Trigger'' An ally [[Casts a Spell|Cast a Spell]] and you are within that spell’s range.
You open the power in your blood to your ally’s spellcasting, using your magic to boost their range.
Your ally can use you as the point of origin for their spell, calculating range and cover from your space instead of their own.
{{LOWGFeat}}
The magical runes on your body grant you several magical abilities.
Choose a 1st-level arcane spell. You gain a spell rune on your body corresponding to the chosen spell, which you can cast once per day as an innate spell.
At 6th level, you gain a spell rune corresponding to a 2nd-level arcane spell, and at 8th level, you gain a spell rune corresponding to a 3rd-level arcane spell.
Your spell shrouds you in a billowing cloud.
If your next action is to [[Cast a Spell]] that targets you, you surround yourself in a 15-foot [[Emanation]] of dense magical mist that lasts until the start of your next turn.
All creatures within the cloud become [[Concealed]], and all creatures outside the cloud are concealed to creatures within it.
You don’t accept the fact that once spells are prepared, they can’t be changed until your next daily preparation, and you have uncovered a shortcut allowing you to substitute new spells for those you originally prepared.
You can spend 10 minutes to empty one of your prepared spell slots and prepare a different spell from your spellbook in its place.
If you are interrupted during such a swap, the original spell remains prepared and can still be cast. You can try again to swap out the spell later, but you must start the process over again.
You’ve learned to alter choices you make when casting spells on yourself.
After casting a spell on only yourself that offers several choices of effect (such as [[Resist Energy]], [[Spell Immunity]], or a polymorph spell that offers several potential forms), you can alter the choice you made when Casting the Spell (for instance, choosing a different type of damage for resist energy).
However, your tinkering weakens the spell’s integrity, reducing its remaining duration by half.
You can’t use this feat if the benefits of the spell have already been used up or if the effects of the first choice would persist in any way after switching (for instance, if one of the choices was to create a consumable item you already used, or to heal you), or if the feat would create an effect more powerful than that offered by the base spell. The GM is the final arbiter of what
Spell Tinker can be applied to.
{{||SpellSummaryTable}}
This abjuration reflects spells cast at you back at their caster.
When a spell targets you, you can spend a reaction to attempt to reflect it.
This uses the rules for [[Counteract]] the spell, but if the spell is successfully counteracted, the effect is turned back on the caster.
Whether or not the counteract attempt is successful, spell turning then ends.
Spell turning can’t affect spells that aren’t targeted (such as area spells).
If spell turning reflects a spell back at a caster who is also under the effect of spell turning, their spell turning can attempt to reflect their own spell back at you again; if they do so, their counteract attempt automatically succeeds.
''Usage'' etched onto a melee weapon.
A spell-storing rune creates a reservoir of eldritch energy within the etched weapon.
A spellcaster can spend 1 minute to cast a spell of 3rd level or lower into the weapon. The spell must have a casting of 2 actions or fewer and must be able to target a creature other than the caster. The spell has no immediate effect—it is instead stored for later.
When you wield a spell-storing weapon, you immediately know the name and level of the stored spell.
A spell-storing weapon found as treasure has a 50% chance of having a spell of the GM’s choice stored in it.
''Activate'' {{OneAction}} Command; ''Requirements'' On your previous action this turn, you hit and damaged a creature with this weapon; ''Effect'' You unleash the stored spell, which uses the target of the triggering attack as the target of the spell. This empties the spell from the weapon and allows a spell to be cast into it again. If the spell requires a spell attack roll, the result of your attack roll with the weapon determines the degree of success of the spell, and if the spell requires a saving throw, the DC is 30.
''Activate'' {{OneAction}} Command; ''Effect'' Harmlessly expend the stored spell. This frees the weapon to have a new spell cast into it.
You are particularly adept at learning spells to add to your spellbook.
You can [[Learn a Spell]] in half the time it normally takes.
Further, when you roll a critical failure on your check to Learn a Spell, you get a failure instead. When you roll a failure, you can try again after 1 week.
{{||SpellSummaryTable}}
{{||SaveSuccessTable}}
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
{{||SaveSuccessTable}}
{{||ActionSuccessTable}}
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" height="1em" width="1em" viewBox="0 0 122.88 95.57" style="enable-background:new 0 0 122.88 95.57" xml:space="preserve">
<style type="text/css">
.st0{fill-rule:evenodd;clip-rule:evenodd;}
</style>
<g>
<path class="st0" d="M30.45,57.96h-0.93c0-7.62-2.85-14.28-8.54-19.97c-5.69-5.69-12.35-8.54-19.97-8.54v-0.93 c7.62,0,14.28-2.85,19.97-8.55C26.67,14.25,29.52,7.59,29.52,0h0.93c0,7.62,2.85,14.28,8.54,19.97c5.69,5.69,12.35,8.54,19.97,8.54 v0.93c-7.62,0-14.28,2.85-19.97,8.54C33.3,43.68,30.45,50.34,30.45,57.96L30.45,57.96z M13.51,92.85h-0.43 c0-3.49-1.31-6.55-3.92-9.16C6.55,81.08,3.49,79.77,0,79.77v-0.43c3.49,0,6.55-1.31,9.16-3.92c2.61-2.62,3.92-5.67,3.92-9.15h0.43 c0,3.49,1.31,6.55,3.92,9.16c2.61,2.61,5.66,3.92,9.16,3.92v0.43c-3.49,0-6.55,1.31-9.16,3.92C14.81,86.3,13.51,89.36,13.51,92.85 L13.51,92.85z M68.37,95.57h-0.43c0-3.49-1.31-6.55-3.92-9.16c-2.61-2.61-5.66-3.92-9.16-3.92v-0.43c3.49,0,6.55-1.31,9.16-3.92 c2.61-2.62,3.92-5.67,3.92-9.15h0.43c0,3.49,1.31,6.55,3.92,9.16c2.61,2.61,5.66,3.92,9.16,3.92v0.43c-3.49,0-6.55,1.31-9.16,3.92 C69.67,89.02,68.37,92.07,68.37,95.57L68.37,95.57z M98.95,64.57h-0.78c0-6.39-2.39-11.98-7.17-16.76 c-4.78-4.78-10.36-7.17-16.76-7.17v-0.78c6.39,0,11.98-2.39,16.76-7.18c4.78-4.79,7.17-10.38,7.17-16.75h0.78 c0,6.39,2.39,11.98,7.17,16.76c4.78,4.78,10.36,7.17,16.76,7.17v0.78c-6.39,0-11.98,2.39-16.76,7.17 C101.34,52.59,98.95,58.18,98.95,64.57L98.95,64.57z"/>
</g>
</svg>
1:1
2:3
3:5
4:7
5:9
6:11
7:13
8:15
9:17
10:19
{{LOCGFeat}}
''Prerequisites'' Intelligence, Wisdom, or Charisma 14; ability to cast focus spells.
As a Spellmaster, you are adept at identifying magic.
You gain a +2 circumstance bonus when you [[Identify Magic]] with a skill in which you are trained or better.
If you have the [[Wayfinder Resonance Tinkerer]] feat, you can change the cantrip you chose for that feat each day during your daily preparations.
<<archetypefeatlist "8 10 12 14" "[[Spellmaster]]">>
Your experience with a specific type of harmful magic makes you more resistant to it.
Choose a magical tradition (arcane, divine, occult, or primal).
You gain a +1 circumstance bonus to saving throws against spells and effects with that tradition’s trait and resistance 5 to all damage from spells and effects with that tradition’s trait.
The effect must have actually been cast or created with that tradition, rather than simply being on that tradition’s spell list.
''And to save against these spells:''
<ul>
<$list filter="[all[current]listed[m-save]sort[]]">
<li><$link to=<<currentTiddler>> /></li>
</$list>
</ul>
Choose one cantrip from the <<tag Arcane>> spell list. You can Cast this Spell as an arcane innate spell at will. A cantrip is heightened to a spell level equal to half your level rounded up. You gain the trained proficiency rank in arcane spell attack rolls and spell DCs, and your key spellcasting ability is [[Charisma]].
Mystic patterns create a magic reservoir within this ammunition.
You activate spellstrike ammunition by [[Casting a Spell|Cast a Spell]] into the ammunition. The spell must be of a spell level the ammunition can hold, and the spell must be able to target a creature other than the caster.
A creature hit by activated spellstrike ammunition is targeted by the spell.
If the creature isn’t a valid target for the spell, the spell is lost.
The ammunition affects only the target hit, even if the spell would normally affect more than one target.
If the spell requires a spell attack roll, use the result of your ranged attack roll with the ammunition to determine the degree of success of the spell.
If the spell requires a saving throw, the target attempts the save against your spell DC.
The maximum level of spell the ammunition can hold determines its item level and Price.
| !Type | !Level | !Price | !Maximum Spell Level |
| I | 3 | 120 | 1 |
| II | 5 | 300 | 2 |
| III | 7 | 700 | 3 |
| IV | 9 | 1500 | 4 |
| V | 11 | 3000 | 5 |
| VI | 13 | 6000 | 6 |
| VII | 15 | 13000 | 7 |
| VIII | 17 | 30000 | 8 |
| IX | 19 | 80000 | 9 |
<table>
<tr><th>Level</th><td>{{!!m-level}}</td></tr>
<tr><th>Components</th><td>
<$list filter="[all[current]list[!!m-components]]">
<$link/>
</$list>
<$list filter = "[all[current]tag[Focus Spell]!tag[Cantrip]]">
1 Focus Point
</$list>
</td></tr>
<tr><th>Cast Time</th><td>{{!!m-time}}</td></tr>
<tr><th>Range</th><td>{{!!m-range}}</td></tr>
<tr><th>Area</th><td>{{!!m-area}}</td></tr>
<tr><th>Target</th><td>{{!!m-targets}}</td></tr>
<tr><th>Save</th><td>
<$list filter="[all[current]list[!!m-save]]">
<$link/>
</$list>
</td></tr>
<tr><th>Duration</th><td>{{!!m-duration}}</td></tr>
<$list filter="[all[current]has[m-domain]]">
<tr><th>Domain</th><td>{{!!m-domain}}</td></tr>
</$list>
<$list filter="[all[current]has[m-bloodline]]">
<tr><th>Bloodline</th><td>{{!!m-bloodline}}</td></tr>
</$list>
<$list filter="[all[current]has[m-mystery]]">
<tr><th>Mystery</th><td>{{!!m-mystery}}</td></tr>
</$list>
</table>
<$list filter="[all[current]tag[Composition]tag[Somatic]!tag[Verbal]]">
<p style="border: 1px solid black; padding:2px">Because this is a somatic composition spell, to cast it you must act (adds <<tag Auditory>>, <<tag Linguistic>> and <<tag Visual>>) or dance (adds <<tag Move>> and <<tag Visual>>).</p>
</$list>
<$list filter="[all[current]tag[Composition]tag[Verbal]!tag[Somatic]]">
<p style="border: 1px solid black; padding:2px">Because this is a verbal composition spell, to cast it you must sing (adds <<tag Auditory>> and <<tag Linguistic>>) or play an instrument (adds <<tag Auditory>> and <<tag Manipulate>>).</p>
</$list>
<$list filter="[all[current]tag[Composition]tag[Verbal]tag[Somatic]]">
<p style="border: 1px solid black; padding:2px">Because this is a verbal and somatic composition spell, to cast it you must act (adds <<tag Audistory>>, <<tag Linguistic>> and <<tag Visual>>)..</p>
</$list>
{{||SpellSummaryTable}}
You cause any spells cast on the target to spill out their energy in harmful surges.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
You can open your mouth to an immense size and spew forth an impossibly large field of tentacles.
You can cast [[Black Tentacles]] once per day as an innate occult spell, though when you do so, you spew them from your mouth out to the appropriate range, where they take root and begin [[Grappling|Grapple]] creatures as usual.
The tentacles recognize you as a part of them and don’t attempt to Grapple you, even if you are in the area.
{{||SpellSummaryTable}}
Tiny clinging hairs sprout across the creature’s hands and feet, offering purchase on nearly any surface.
The target gains a climb Speed equal to its Speed.
''Heightened (5th)'' The duration increases to 1 hour.
A paste made by mashing the fine, threadlike roots of a certain creeper vine, spider root renders a victim clumsy and maladroit.
| !Saving Throw |DC 28 [[Fortitude]] |
| !Onset |1 minute |
| !Maximum Duration |6 minutes |
| !Stage 1 |8d6 poison damage and [[Clumsy]] 1 (1 minute) |
| !Stage 2 |9d6 poison damage and [[Clumsy]] 2 (1 minute) |
| !Stage 3 |10d6 poison damage and [[Clumsy]] 3 (1 minute) |
{{||SpellSummaryTable}}
You magically duplicate a spider’s venomous sting.
You deal 1d4 piercing damage to the touched creature and afflict it with spider venom.
The target must attempt a [[Fortitude]] save.
{{||SaveSuccessTable}}
''Spider Venom'' (poison); Level 1; ''Maximum Duration'' 4 rounds. ''Stage 1'' 1d4 poison damage and [[Enfeebled]] 1 (1 round); ''Stage 2'' 1d4 poison damage and [[Enfeebled]] 2 (1 round).
{{||SpellSummaryTable}}
Long, sharp spikes of solid rock thrust up from the ground in the area.
The area becomes [[Difficult Terrain]] and [[Hazardous Terrain]].
A creature that moves on the ground through the area takes 3 piercing damage for every square of that area it moves into.
''Heightened (+1)'' Increase the damage by 1.
You have a spine ranged unarmed attack with the unarmed trait that deals 1d4 poison damage, has a range increment of 10 feet, and is in the dart weapon group.
{{||SpellSummaryTable}}
You concentrate ethereal energy and attack a creature’s spirit, dealing 16d6 force damage //with a basic [[Fortitude]] save.//
Because spirit blast affects the creature’s spirit, it can damage a target projecting its consciousness (such as via [[Project Image]]) or possessing another creature even if the target’s body is elsewhere.
The possessed creature isn’t harmed by the blast.
The blast doesn’t harm creatures that have no spirit, such as <<tag Construct>>s.
''Heightened (+1)'' The damage increases by 2d6.
Whether you are emotionally sensitive to the spirits around you; worship ancestors or apparitions; or are haunted by the specter of an ancestor, relative, friend, or foe, your rage takes the form of a spiritual possession.
''Anathema'' Disrespecting corpses or spirits is anathema to your instinct; defending yourself against undead creatures is not.
''Spirit Rage (Instinct Ability)'' When you are raging, you can increase your damage from [[Rage]] from 2 to 3 and deal <<tag Negative>> or <<tag Positive>> damage, instead of the normal damage type for your weapon or unarmed attack (choose each time you Rage). If you choose to deal negative or positive damage, your weapon or unarmed attack gains the effects of the [[Ghost Touch]] property rune, which makes it more effective against incorporeal creatures, and your Rage action gains the <<tag Divine>> and <<tag Necromancy>> traits, plus negative or positive, as appropriate. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
''Specialization Ability'' When using spirit rage, increase the damage from Rage from 3 to 7. If you have greater weapon specialization, instead increase the damage when using spirit rage to 13. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
''Raging Resistance'' You resist negative damage, as well as damage dealt by the attacks and abilities of undead creatures, regardless of the damage type. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
{{||SpellSummaryTable}}
You form a spiritual link with another creature, allowing you to take in its pain.
When you Cast this Spell and at the start of each of your turns, if the target is below maximum Hit Points, it regains 2 Hit Points (or the difference between its current and maximum Hit Points, if that’s lower).
You lose as many Hit Points as the target regained.
This is a spiritual transfer, so no effects apply that would increase the Hit Points the target regains or decrease the Hit Points you lose.
This transfer also ignores any temporary Hit Points you or the target have.
Since this effect doesn’t involve positive or negative energy, spirit link works even if you or the target is <<tag Undead>>.
While the duration persists, you gain no benefit from [[Regeneration]] or [[Fast Healing]].
You can [[Dismiss]] this spell, and if you’re ever at 0 Hit Points, spirit link ends automatically.
''Heightened (+1)'' The number of Hit Points transferred each time increases by 2.
{{||SpellSummaryTable}}
You briefly bring an object to life.
The object gains a means of locomotion, such as sprouting chicken legs, and [[Stride]]s up to 25 feet to a space you decide within range.
If you spent 2 actions Casting the Spell, the object then attacks one creature of your choice adjacent to its new space. Make a melee spell attack roll against the creature. On a success, the creature takes bludgeoning, piercing, or slashing damage (as appropriate for the object) equal to 1d4 plus your spellcasting ability modifier, and on a critical success, it takes double damage.
''Heightened (+1)'' Increase the maximum Bulk of the target by 1 and the damage by 1d4.
{{||SpellSummaryTable}}
You open your mind to the metaphysical, enabling you to sense nearby spirits.
Even if you aren’t [[Search]]ing, you get a check to find haunts and spirits in the area.
You gain a +1 status bonus to the following checks regarding haunts or spirits: [[Perception]] checks to [[Seek]], attempts to [[Recall Knowledge]], skill checks to determine the reason for their existence, and skill checks to disable a haunt.
You also gain a +1 status bonus to [[AC]] and saving throws against haunts and spirits.
''Heightened (6th)'' The spell’s duration lasts until the next time you make your [[daily preparations|Rest]].
{{||SpellSummaryTable}}
Your eldritch song sends pulsing waves of ethereal energy to attack creatures’ spirits in the area, dealing 18d6 <<tag Force>>damage //with a basic [[Fortitude]] save.//
Because spirit song affects creatures’ spirits, it can damage a target projecting its consciousness (such as via [[Project Image]]) or possessing another creature even if the target’s body is elsewhere.
The vibrating waves of spiritual song penetrate into, but not through, solid barriers, damaging incorporeal creatures hiding in solid objects in the area but not passing onward to damage creatures in other rooms.
Possessed creatures aren’t harmed by the song.
The song doesn’t harm creatures that have no spirit, such as <<tag Construct>>s.
''Heightened (+1)'' The damage increases by 2d6.
You are attuned to the minute sounds and sensations of restless spirits.
Even if you aren’t [[Search]]ing, you can attempt a check to find haunts that normally require you to be Searching.
//[[Search]] is an exploration activity, and is not the same as [[Seek]].//
You still need to meet any other requirements to find the haunt.
Your connection to the Boneyard empowers you to bring death to all forms of life and unlife, exploiting their weaknesses.
All your weapon and unarmed [[Strike]]s are magical and deal 1 additional <<tag Negative>> damage to living creatures and 1 additional <<tag Positive>> damage to undead.
{{||SpellSummaryTable}}
You draw an occluding veil of spirits around yourself, blocking yourself especially well from undead eyes.
You become [[Concealed]] to all creatures, and you are hidden from undead creatures regardless of what precise senses they have; this grants the effects of [[invisibility|Invisible]], but against all the undead creature’s precise senses.
If you physically interact with an undead creature or use a [[Hostile Action]], the spell ends.
''Heightened (+1)'' You can target one additional willing creature within 30 feet. The spell ends if any target physically interacts with an undead creature or uses a hostile action.
''Prerequisites'' [[Spirit Instinct]].
You call forth an ephemeral apparition, typically the ghost of an ancestor or a nature spirit, which takes the form of a wisp.
The spirit wisp makes a melee wisp rush unarmed attack against an enemy within 120 feet of you.
The wisp’s attack modifier is equal to your proficiency bonus for martial weapons plus your [[Strength]] modifier plus a +2 item bonus, and it applies the same circumstance and status bonuses and penalties that you have.
On a hit, the wisp deals damage equal to 4d8 plus your Constitution modifier. The damage is your choice of negative or positive damage; don’t apply your Rage damage or your weapon specialization damage, but circumstance and status bonuses and penalties that would also affect the wisp’s damage apply.
If your wisp’s [[Strike]] is a critical hit, the target becomes [[Frightened]] 1.
This attack uses and counts toward your [[Multiple Attack Penalty]] as if you were the one attacking.
You call forth protective spirits to ward off ranged attacks.
Until your rage ends, anyone making a ranged attack against you must succeed at a DC 5 flat check or the attack misses with no effect.
Spiritsense enables you to sense the spirits of creatures, including living creatures, most non mindless undead, and haunts within the listed range.
As spiritsense detects spiritual essence, not physical bodies, it can detect spirits projected by spells such as Project Image or possessing otherwise soulless objects.
It can’t detect soulless bodies, constructs, or objects, and like most senses, it doesn’t penetrate through solid objects.
{{AoA3Spell}}
{{||SpellSummaryTable}}
Memories of a past life that seem incredibly real (and may even be) overwhelm the target’s mind.
//They must make a [[Will]] save.//
This is especially disorienting for undead and creatures that have lived a previous life (such as celestials, fiends, monitors, and many other extraplanar creatures); if such creatures roll a critical success on their save, they get a success instead, and if they roll a failure, they get a critical failure instead.
{{||SaveSuccessTable}}
You channel disruptive power that severs a foe’s spiritual connection to their heretical magic.
Make a melee [[Strike]].
If the attack hits, any time the target attempts to cast a divine or occult spell, the spell is disrupted unless they succeed at a DC 5 flat check (DC 7 on a critical hit); if the target is also [[Stupefied]], it must attempt the harder of the two flat checks (but not both).
This effect lasts for 1 minute.
{{||SpellSummaryTable}}
You curse the target, sapping its spirit and leaving a contagious trap in its essence.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
Any creature that casts a <<tag Divine>> or <<tag Occult>> spell on the target while it’s affected is targeted by spiritual epidemic and must also attempt a [[Will]] save. The curse continues to spread in this way.
{{||SpellSummaryTable}}
''Requirement'' You have a deity.
A Medium guardian made of magical force appears and attacks foes you designate within range.
The spiritual guardian is translucent and appears to be holding your deity’s favored weapon.
When you Cast the Spell, the spiritual guardian appears in an unoccupied space next to a foe of your choice within range and makes a [[Strike]] against it.
Each time you Sustain the Spell, you can move the spiritual guardian to an unoccupied space next to a target within range (if necessary) and make a Strike with it.
The guardian uses and contributes to your multiple attack penalty.
Alternatively, when you Sustain the Spell, you can have the guardian move adjacent to an ally and protect that ally. If you do, each time the ally would take damage, the guardian takes the first 10 damage instead of your ally.
It continues to do so until you move the guardian to attack an enemy or defend a different ally, or until the guardian is destroyed (it has 50 Hit Points and can’t recover Hit Points by any means).
The guardian can’t usually take damage except when protecting an ally, though [[Disintegrate]] automatically destroys it if it hits the spiritual guardian’s AC of 25.
The guardian’s Strikes are melee spell attacks.
Regardless of the appearance of the guardian’s weapon, the guardian deals <<tag Force>> damage equal to 2d8 plus your spellcasting ability modifier, but you can deal damage of the type normally dealt by the weapon it holds instead of force damage.
No other traits or statistics of the weapon apply, and even a ranged weapon attacks adjacent creatures only.
Despite making a spell attack, the spiritual guardian’s weapon is a weapon for the purposes of triggers, resistances, and so forth.
The guardian takes up space and allies can use it when [[Flanking]], but it doesn’t have any other attributes a creature would normally have aside from Hit Points, and creatures can move through its space without hindrance.
The guardian can’t make any attack other than its Strike, and feats or spells that affect weapons or enhance allies do not apply to the guardian.
''Heightened (+2)'' The guardian’s damage increases by 1d8, and its Hit Points increase by 20.
''Trigger'' You fail, but don’t critically fail, a [[Perception]] check or a skill check.
Though no one sees them and only you can hear them, the spirits around you constantly chatter, save when you are raging. Sometimes they’re even helpful.
You can heed the spirits’ guidance to reroll the triggering check, using the second result even if it’s worse.
You have a vague connection to the Ethereal Plane that enables you to notice spirits.
While you’re exploring but not Searching, the GM rolls a secret check for you to find haunts that usually require Searching, as well as spirits, creatures on the Ethereal Plane, and beings made entirely of spiritual essence such as celestials, fiends, and monitors.
You can also potentially notice ethereal creatures and spirits inside solid objects, provided they are within 30 feet of you. This applies while [[Search]]ing, while [[Seek]]ing, and on the automatic secret check you gain while exploring even if you aren’t Searching. You can still notice spirits only on a successful check, and you can’t see them if they’re more than 5 feet inside an object.
When you notice a creature with your Spiritual Sense, you also learn its location, making it [[Hidden]] to you if it had been [[Undetected]].
{{||SpellSummaryTable}}
''Requirements'' You have a deity.
A weapon made of pure magical force materializes and attacks foes you designate within range.
This weapon has a ghostly appearance and manifests as your deity’s favored weapon.
When you cast the spell, the weapon appears next to a foe you choose within range and makes a [[Strike]] against it.
Each time you Sustain the Spell, you can move the weapon to a new target within range (if needed) and Strike with it.
The spiritual weapon uses and contributes to your multiple attack penalty.
The weapon’s Strikes are melee spell attacks.
Regardless of its appearance, the weapon deals force damage equal to 1d8 plus your spellcasting ability modifier. You can deal damage of the type normally dealt by the weapon instead of force damage (or any of the available damage types for a versatile weapon).
No other statistics or traits of the weapon apply, and even a ranged weapon attacks adjacent creatures only.
Despite making a spell attack, the spiritual weapon is a weapon for purposes of triggers, resistances, and so forth.
The weapon doesn’t take up space, grant flanking, or have any other attributes a creature would.
The weapon can’t make any attack other than its Strike, and feats or spells that affect weapons do not apply to it.
''Heightened (+2)'' The weapon’s damage increases by 1d8.
''Prerequisites'' claw unarmed attack
Your instincts sing of spite and malice, and you’ve learned a devastating trick: go for the eyes.
You make a claw [[Strike]].
If you hit and deal damage, the target is [[Dazzled]] for 1 round. On a critical hit, the target is instead [[Blinded]] for 1 round and dazzled until restored to maximum hit points.
{{||SpellSummaryTable}}
A deluge of colorful illusory paint, tools, or other symbols of art and artisanship drift down in the area.
Roll 1d4 to determine the color of the illusion.
Each creature in the area must attempt a [[Will]] save. A creature is unaffected on a success. On a failure or critical failure, the creature takes the results listed on the table relevant to the color.
| !1d4 | !Color | !Failure | !Critical Failure |
| 1 | White | [[Dazzled]] 1 round | [[Dazzled]] 1 minute |
| 2 | Red | [[Enfeebled]] 1, 1 round | [[Enfeebled]] 2, 1 round |
| 3 | Yellow | [[Frightened]] 1 | [[Frightened]] 2 |
| 4 | Blue | __[[Clumsy]]__ 1, 1 round | __[[Clumsy]]__ 2, 1 round |
//Splats are used as a generic term for the options taken within classes.//
//The particular names used for splats of particular classes are://
<table>
<$list filter="[tag[Class]!tag[Feat]]">
<tr><th><$link/></th><td><$view tiddler="SplatNameDict" index=<<currentTiddler>> /></td></tr>
</$list>
Alchemist:Field
Barbarian:Instinct
Bard:Muse
Champion:Cause
Cleric:Doctrine
Druid:Order
Rogue:Racket
Sorcerer:Bloodline
Wizard:Thesis
Swashbuckler:Style
Investigator:Methodology
Oracle:Mystery
Witch:Theme
Your faith in your deity is represented in an extremely unusual way that some might call heretical.
When you select this feat, you should detail the fundamental tenets of your splinter faith, though it shouldn’t affect the deity’s edicts or anathema.
Choose four domains. These domains must be chosen from among your deity’s domains, your deity’s alternate domains, and up to one domain that isn’t on either list and isn’t anathematic to your deity.
Any domain spell you cast from a domain that isn’t on either of your deity’s lists is always heightened to 1 level lower than usual for a focus spell.
For the purpose of abilities that depend on your deity’s domains, the four domains you chose are your deity’s domains, and any of your deity’s domains you didn’t choose are now among your deity’s alternate domains.
''Special'' Unless you take this feat at 1st level, changing the way you relate to your deity requires [[Retraining]]. If you take this feat and previously benefited from any effect that requires a domain your splinter faith doesn’t include, such as a domain spell from [[Domain Initiate]], you lose that effect.
You siphon some of the power from an offensive hex you cast to direct it at a second target as well.
If the next action you use is to [[Cast a Spell]] to cast a harmful hex with a single target, reduce its level by 2 (making it 2 levels lower than the maximum spell level you can cast). If you do, you can select a second target for that hex to affect.
You fragment a ranged spell into a pair of smaller shots.
If your next action is to [[Cast a Spell]] without a duration that requires an attack roll against a single target and has no effect beyond dealing damage, you roll a single attack roll and compare the result to the AC of two targets within the spell’s range.
The spell deals only half its usual damage to each target.
This counts as one attack for your multiple attack penalty.
You can prepare two spells in one slot, giving you the freedom to choose the spell when you cast it.
When you prepare your spells for the day, you can choose one spell slot at least 1 level lower than the highest-level spell you can cast and prepare two spells in that slot.
When you [[Cast a Spell]] from that slot, choose which spell to cast.
Once you’ve chosen, the unused spell dissipates as though you hadn’t prepared it at all—for example, it isn’t available for use with [[Drain Bonded Item]].
''Frequency'' once per hour
You unleash a cloud of pollen or similar spores.
All creatures in a 10-foot emanation around you must attempt a [[Fortitude]] save using your class DC or spell DC (whichever is higher) with the following results.
Plants and fungi are immune to this effect.
{{||SaveSuccessTable}}
''Trigger'' Another creature within 60 feet uses a linguistic effect in a language you understand.
You interpret a creature’s words, repeating their message in a different language that you know.
If the triggering effect’s targets speak either the original language or the one you translated into, they are affected.
{{||SpellSummaryTable}}
You fling a spray of tiny shooting stars, dealing 1d4 <<tag Fire>> damage.
Each creature in the area must attempt a [[Reflex]] save.
{{||SaveSuccessTable}}
''Heightened (+1)'' Increase the damage by 1d4.
''Requirements'' You are adjacent to an enemy.
Springing away from one foe, you [[Strike]] at another.
[[Stride]] up to your Speed, but you must end that movement within melee reach of a different enemy.
At the end of your movement, make a melee Strike against an enemy now within reach.
You can use Spring Attack while Burrowing, Climbing, Flying, or Swimming instead of Striding if you have the corresponding movement type.
Leaping out from hiding, you assail your target when they least expect it.
You [[Stride]] up to your Speed, but you must end your movement next to an enemy you’re [[Hidden]] from or [[Undetected]] by.
You then [[Strike]] that enemy; you remain [[Hidden]] from or [[Undetected]] by that creature until after you Strike.
You can use Spring from the Shadows while Burrowing, Climbing, Flying, or Swimming instead of Striding if you have the corresponding movement type.
Your powerful legs allow you to make sudden and dramatic leaps.
You can [[Leap]] as a 2-action activity to double the distance you can Leap vertically, or Leap as a 3-action activity to triple the distance you can Leap vertically.
You don’t automatically fail [[Long Jump]]s for jumping in a different direction than your Stride.
You can fling a portion of your magic at foes.
You gain a ranged unarmed attack in the sling weapon group with a maximum range of 20 feet that deals 1d4 damage. (No ability modifier is added to the damage roll.)
The damage type and name of the unarmed attack depends on your heritage, described below; most sprite heritages not presented in this book also use luminous spark.
Like other unarmed attacks, you can improve this attack with [[Handwraps of Mighty Blows]].
| !Heritage | !Name | !Damage type |
| [[Draxie]] | Euphoric Spark | <<tag Mental>> |
| [[Grig]] | Dissonant Note | <<tag Sonic>> |
| [[Luminous Sprite]] | Luminous Spark | <<tag Fire>> |
| [[Melixie]] | Sting Shot | <<tag Poison>> |
| [[Nyktera]] | Ultrasonic Pulse | <<tag Sonic>> |
| [[Pixie]] | Pixie Dust | <<tag Mental>> |
//In the book, this feat refers to "Firefly Sprite", which presumably means Luminous Sprite.//
{{LOWGFeat}}
You’ve learned how to analyze and fake your responses to the most common magic used against spies.
Whenever you succeed at your save against a <<tag Divination>> or <<tag Mental>> effect, you can [[Identify Magic]] to identify the spell as a free action triggered when you succeed, even if you didn’t notice the spell being cast.
If you successfully identify a divination effect targeting you and the spell would normally fail or have no effect, you can create a substitute result, causing the spell’s caster to think the spell succeeded, with a result of your choice.
If you successfully identify a mental effect targeting you and the spell would normally fail or have no effect, you can make it appear as if you were affected and attempt to play along with the spell; if the spell normally establishes a mental link, it functions normally but you can disregard any commands you receive through the link.
You are adept at working with your allies to surround a foe.
If an enemy is within reach of you and at least two of your allies, that enemy is [[Flat-Footed]] against you.
''Trigger'' You critically fail a [[Deception]], [[Diplomacy]], or [[Intimidation]] check against a creature that doesn’t have the tengu trait.
You let out an awkward squawk, ruffle your feathers, or fake some other birdlike tic to cover up a social misstep or faux pas.
You get a failure on the triggering check, rather than a critical failure.
All creatures that witnessed you Squawk are temporarily immune for 24 hours.
You contort yourself to squeeze through a space so small you can barely fit through.
This action is for exceptionally small spaces; many tight spaces are [[Difficult Terrain]] that you can move through more quickly and without a check.
{{||ActionSuccessTable}}
//If you have [[Quick Squeeze]], you move much faster.//
{{||SpellSummaryTable}}
Positive energy shuts death’s door.
The target loses the [[Dying]] condition, though it remains [[Unconscious]] at 0 Hit Points.
//Losing the Dying condition will normally give the [[Wounded]] condition.//
''Prerequisites'' Trained with at least one of the following weapons: staff, bo staff, halfling sling staff, or any weapon in the spear or polearm group (referred to in this archetype as “your staff”)
When you [[High Jump]], [[Leap]], or [[Long Jump]] while wielding your staff, you gain a +2 circumstance bonus to any [[Athletics]] check required and add 5 feet to the distance you can Leap vertically and horizontally.
You can [[Shove]] and [[Trip]] even if you don’t have a free hand, provided you are wielding your staff.
Finally, when you roll a success on a check to [[Balance]] while wielding your staff, you get a critical success instead.
<<archetypefeatlist "4 6 8 10 14" "[[Staff Acrobat]]">>
Your thesis maintains that early and intense adoption of staves from the first days of study can create a symbiotic bond between spellcaster and staff, allowing them to create remarkable magic together. You’ve formed such a connection with a makeshift staff you built, and you are ready to infuse any staff you encounter with greater power.
You begin play with a makeshift staff of your own invention. It contains one cantrip and one 1st level spell, both from your spellbook, but it gains no charges normally during your preparations; you must expend a spell slot to grant it charges in the same way you would add additional charges to a normal staff.
You can [[Craft]] your makeshift staff into any other type of staff for the new staff’s usual cost, adding the two spells you originally chose to the staff you Craft.
At 8th level, you can expend two spells instead of one when preparing your staff, adding additional charges equal to the combined levels of the expended spells.
At 16th level, you can expend up to a total of three spells to add charges to the staff, adding additional charges equal to the combined levels of all three spells.
This intricately carved wooden staff is warm to the touch and thrums with inner energy. While wielding the staff, you gain a +2 circumstance bonus to checks to identify abjuration magic.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 6 | 2300 | Cantrip |[[Shield (Spell)]] |
|~|~|~| 1st |[[Alarm]], [[Feather Fall]] |
|~|~|~| 2nd |[[Dispel Magic]], [[Endure Elements]], [[Resist Energy]] |
| Greater | 10 | 9000 | 3rd |[[Alarm]], [[Glyph of Warding]] |
|~|~|~| 4rd |[[Dimensional Anchor]], [[Dispel Magic]], [[Resist Energy]] |
| Major | 14 | 40000 | 5th |[[Banishment]], [[Endure Elements]] |
|~|~|~| 6th |[[Dispel Magic]], [[Repulsion]] |
This ash staff is decorated with animals; wielding it, you gain a +2 circumstance bonus to checks to identify conjuration magic.
''Craft Requirements'' Supply one casting of all listed levels of all listed spells.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 6 | 2300 | Cantrip | [[Tanglefoot]] |
|~|~|~| 1st |[[Summon Construct]], [[Unseen Servant]] |
|~|~|~| 2nd |[[Obscuring Mist]], [[Phantom Steed]], [[Summon Construct]], [[Summon Elemental]] |
| Greater | 10 | 9000 | 3rd |[[Stinking Cloud]], [[Summon Construct]], [[Summon Elemental]] |
|~|~|~| 4rd |[[Creation (Spell)]], [[Phantom Steed]], [[Summon Construct]], [[Summon Elemental]] |
| Major | 14 | 40000 | 5th |[[Black Tentacles]], [[Summon Construct]], [[Summon Elemental]] |
|~|~|~| 6th |[[Phantom Steed]], [[Summon Construct]], [[Summon Elemental]] |
Semiprecious gemstones emerge, seemingly at random, from the surface of this gnarled wooden staff. While wielding it, you gain a +2 circumstance bonus to checks to identify divination magic.
''Craft Requirements'' Supply one casting of all listed levels of all listed spells.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 6 | 2300 | Cantrip |[[Detect Magic]] |
|~|~|~| 1st |[[True Strike]] |
|~|~|~| 2nd |[[Comprehend Language]], [[Darkvision]], [[See Invisibility]] |
| Greater | 10 | 9000 | 3rd |[[Clairaudience]], [[Darkvision]] |
|~|~|~| 4rd |[[Clairvoyance]], [[Comprehend Language]], [[Telepathy]] |
| Major | 14 | 40000 | 5th |[[Prying Eye]], [[Sending]] |
|~|~|~| 6th |[[Telepathy]], [[True Seeing]] |
A mesmerizing gemstone caps the head of this handsomely crafted wooden staff. While wielding the staff, you gain a +2 circumstance bonus to checks to identify enchantment magic.
''Craft Requirements'' Supply one casting of all listed levels of all listed spells.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 6 | 2300 | Cantrip |[[Daze]] |
|~|~|~| 1st |[[Charm]], [[Command]] |
|~|~|~| 2nd |[[Hideous Laughter]], [[Touch of Idiocy]] |
| Greater | 10 | 9000 | 3rd |[[Paralyze]] |
|~|~|~| 4rd |[[Charm]], [[Confusion]], [[Suggestion]] |
| Major | 14 | 40000 | 5th |[[Command]], [[Crushing Despair]] |
|~|~|~| 6th |[[Dominate]], [[Feeblemind]] |
This staff is tapered at the base and carved into a gemstudded twist at the top. While wielding the staff, you gain a +2 circumstance bonus to checks to identify evocation magic.
''Craft Requirements'' Supply one casting of all listed levels of all listed spells.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 6 | 2300 | Cantrip |[[Ray of Frost]] |
|~|~|~| 1st |[[Magic Missile]], [[Shocking Grasp]] |
|~|~|~| 2nd |[[Acid Arrow]], [[Glitterdust]] |
| Greater | 10 | 9000 | 3rd |[[Lightning Bolt]], [[Magic Missile]] |
|~|~|~| 4rd |[[Fireball]], [[Weapon Storm]] |
| Major | 14 | 40000 | 5th |[[Cone of Cold]], [[Magic Missile]] |
|~|~|~| 6th |[[Chain Lightning]], [[Wall of Force]] |
This staff resembles a blackened and burned length of ashen wood. It smells faintly of soot and glows as if lit by embers.
You can use an [[Interact]] action to touch the tip of this staff to a torch, tinder, or a flammable substance to ignite a flame
''Craft Requirements'' Supply one casting of all listed levels of all listed spells.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 3 | 600 | Cantrip |[[Produce Flame]] |
|~|~|~| 1st |[[Burning Hands]] |
| Greater | 8 | 4500 | 2nd |[[Burning Hands]], [[Flaming Sphere]] |
|~|~|~| 3rd |[[Flaming Sphere]], [[Fireball]] |
| Major | 12 | 18000 | 4th |[[Fire Shield]], [[Fireball]], [[Wall of Fire]] |
|~|~|~| 5th |[[Fireball]], [[Wall of Fire]] |
Made of smooth, white wood, this staff is capped at each end with a golden cross adorned with a multitude of ruby cabochons.
A staff of healing grants an item bonus to the Hit Points you restore anytime you cast the [[Heal]] spell using your own spell slots or using charges from the staff.
''Craft Requirements'' Supply one casting of all listed levels of all listed spells.
| !Type | !Level | !Price | !Heal Bonus | !Spell Level | !Spells |
| Standard | 3 | 900 | +1 | Cantrip |[[Stabilize]] |
|~|~|~|~| 1st |[[Heal]] |
| Greater | 8 | 4700 | +2 | 2nd |[[Heal]], [[Restoration]], [[Restore Senses]] |
|~|~|~|~| 3rd |[[Heal]], [[Remove Disease]] |
| Major | 12 | 18000 | +3 | 4th |[[Heal]], [[Restoration]] |
|~|~|~|~| 5th |[[Breath of Life]], [[Heal]], [[Remove Disease]] |
| True | 16 | 92000 | +4 | 6th |[[Heal]], [[Restoration]], [[Restore Senses]] |
|~|~|~|~| 7th |[[Heal]], [[Regenerate]], [[Remove Disease]] |
This simple iron staff is capped with a faceted, clear gem.
''Activate'' {{OneAction}} [[Interact]]; ''Effect'' The gem at the top of the staff glows as a torch, shedding bright light in a 20-foot radius (and dim light to the next 20 feet) for 10 minutes.
''Craft Requirements'' Supply one casting of all listed levels of all listed spells.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 8 | 4250 | Cantrip |[[Light]] |
|~|~|~| 2nd |[[Continual Flame]] |
|~|~|~| 3rd |[[Continual Flame]], [[Searing Light]] |
This ornately designed metal staff shines with precious inlays of gold. When you Cast a Spell from the staff, the illusory image of something you desire flashes across its surface. While wielding the staff, you gain a +2 circumstance bonus to checks to identify illusion magic.
''Craft Requirements'' Supply one casting of all listed levels of all listed spells.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 6 | 2300 | Cantrip |[[Ghost Sound]] |
|~|~|~| 1st |[[Illusory Disguise]], [[Illusory Object]] |
|~|~|~| 2nd |[[Illusory Creature]], [[Item Facade]], [[Ventriloquism]] |
| Greater | 10 | 9000 | 3rd |[[Illusory Disguise]], [[Item Facade]] |
|~|~|~| 4rd |[[Illusory Creature]], [[Veil]] |
| Major | 14 | 40000 | 5th |[[Illusory Scene]], [[Veil]] |
|~|~|~| 6th |[[Hallucination]], [[Mislead]] |
This twisted and grim-looking staff is adorned with hideous skull and bone motifs. While wielding the staff, you gain a +2 circumstance bonus to checks to identify necromancy magic.
''Craft Requirements'' Supply one casting of all listed levels of all listed spells.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 6 | 2300 | Cantrip |[[Chill Touch]] |
|~|~|~| 1st |[[Grim Tendrils]], [[Ray of Enfeeblement]] |
|~|~|~| 2nd |[[Deafness]], [[Gentle Repose]] |
| Greater | 10 | 9000 | 3rd |[[Blindness]], [[Vampiric Touch]] |
|~|~|~| 4rd |[[Grim Tendrils]], [[Vampiric Touch]] |
| Major | 14 | 40000 | 5th |[[Cloudkill]], [[Gentle Repose]] |
|~|~|~| 6th |[[Grim Tendrils]], [[Vampiric Exsanguination]] |
This staff of magically hardened wood is topped with a silver sculpture depicting magical runic symbols.
When used as a weapon, a staff of power is a [[+2|Weapon Potency]] greater [[Striking]] staff.
Voluntarily destroying a staff of power unleashes an incredible blast of energy. When wielding the staff, you can [[Interact]] to break it. This releases a 30-foot-burst magical explosion centered on the staff. This deals 2d8 force damage per charge remaining in the staff (DC 40 basic [[Reflex]] save). You automatically critically fail your save. A creature reduced to 0 Hit Points by this damage dies instantly; this is a death effect.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 16 | 100000 | 1st |[[Ray of Enfeeblement]] |
|~|~|~| 2nd |[[Continual Flame]] |
|~|~|~| 3rd |[[Levitate]] |
|~|~|~| 4th |[[Globe of Invulnerability]], [[Paralyze]] |
|~|~|~| 5th |[[Magic Missile]] |
|~|~|~| 6th |[[Wall of Force]] |
|~|~|~| 7th |[[Cone of Cold]], [[Fireball]], [[Lightning Bolt]] |
Sigils and runes of ancient and powerful magic cover the iron cladding on this long wooden staff.
A staff of the magi is a [[+3|Weapon Potency]] major [[Striking]] staff, and when wielding it you gain a +1 circumstance bonus to saving throws against spells.
Voluntarily destroying a staff of the magi unleashes a truly devastating wave of arcane energy that surges out, dissipating with distance. When wielding the staff, you can break it using an [[Interact]] action. This releases a 30-foot‑burst magical explosion centered on the staff. This deals 2d10 force damage per charge remaining in the staff (DC 40 basic [[Reflex]] save), You automatically critically fail your save.
The explosion continues to echo beyond the initial blast zone, dealing half as much damage to creatures beyond 30 feet but within a 60-foot burst. A creature reduced to 0 Hit Points by this damage dies instantly; this is a <<tag Death>> effect.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 20 | 900000 | Cantrip |[[Detect Magic]], [[Light]], [[Mage Hand]], [[Telekinetic Projectile]] |
|~|~|~| 1st |[[Lock]] |
|~|~|~| 2nd |[[Enlarge]], [[Glitterdust]], [[Invisibility]], [[Knock]], [[Telekinetic Maneuver]], [[Web]] |
|~|~|~| 3rd |[[Dispel Magic]], [[Fireball]], [[Lightning Bolt]] |
|~|~|~| 4th |[[Invisibility]], [[Enlarge]], [[Fireball]], [[Wall of Fire]], [[Web]] |
|~|~|~| 5th |[[Cone of Cold]], [[Passwall]], [[Telekinetic Haul]] |
|~|~|~| 6th |[[Disintegrate]], [[Dispel Magic]], [[Fireball]], [[Lightning Bolt]] |
|~|~|~| 7th |[[Cone of Cold]], [[Passwall]], [[Plane Shift]], [[Wall of Fire]] |
|~|~|~| 8th |[[Fireball]], [[Mage Armor]] |
|~|~|~| 9th |[[Dispel Magic]], [[Meteor Swarm]], [[Summon Dragon]] |
A glass orb atop this metal staff contains fine, undulating sand. While wielding the staff, you gain a +2 circumstance bonus to checks to identify transmutation magic..
''Craft Requirements'' Supply one casting of all listed levels of all listed spells.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 6 | 2300 | Cantrip |[[Sigil]] |
|~|~|~| 1st |[[Fleet Step]], [[Jump]] |
|~|~|~| 2nd |[[Enlarge]], [[Humanoid Form]] |
| Greater | 10 | 9000 | 3rd |[[Feet to Fins]], [[Jump]] |
|~|~|~| 4rd |[[Gaseous Form]], [[Shape Stone]] |
| Major | 14 | 40000 | 5th |[[Humanoid Transformation]] |
|~|~|~| 6th |[[Baleful Polymorph]], [[Dragon Form]], [[Flesh to Stone]] |
//"Humanoid Transformation" is listed here in the 2nd edition book, but not a listed spell.//
''Requirements'' You are wielding your staff.
You sweep your foes away with your staff.
Roll an [[Athletics]] check to [[Shove]] or [[Trip]], and compare the result to the appropriate DCs of up to two foes, each of whom must be within your reach and no more than 5 feet apart.
During your daily preparations, you can prepare a staff to add charges to it for free. When you do so, that staff gains a number of charges equal to the level of your highest-level spell slot. You don’t need to expend any spells to add charges in this way.
No one can prepare more than one staff per day, nor can a staff be prepared by more than one person per day.
If the charges aren’t used within 24 hours, they’re lost, and preparing the staff anew removes any charges previously stored in it.
You can prepare a staff only if you have at least one of the staff’s spells on your spell list.
The person who prepared a staff can expend the charges to cast spells from it. You can [[Cast a Spell]] from a staff only if you have that spell on your spell list, are able to cast spells of the appropriate level, and expend a number of charges from the staff equal to the spell’s level.
Casting a Spell from a staff requires holding the staff (typically in one hand) and Activating the staff by Casting the Spell, which takes the spell’s normal number of actions.
Use your spell attack roll and spell DC when Casting a Spell from a staff. The spell gains the appropriate trait for your magical tradition (arcane, divine, occult, or primal) and can be affected by any modifications you can normally make when casting spells, such as metamagic feats. You must provide any material components, cost, or focus required by the spell, or you fail to cast it.
If a staff contains a cantrip, you can cast that cantrip using the staff without expending any charges. The cantrip’s level is heightened to the same level as cantrips you cast.
A prepared spellcaster—such as a cleric, druid, or wizard— can place some of their own magic in a staff to increase its number of charges. When a prepared spellcaster prepares a staff, they can expend a spell slot to add a number of charges to the staff equal to the level of the spell. They can’t expend more than one spell in this way each day.
A spontaneous spellcaster, such as a bard or sorcerer, can reduce the number of charges it takes to [[Activate]] a staff by supplementing with their own energy. When a spontaneous spellcaster Activates a staff, they can expend 1 charge from the staff and one of their spell slots to cast a spell from the staff of the same level (or lower) as the expended spell slot. This doesn’t change the number of actions it takes to cast the spell.
You pull punches to give a better show.
You don’t take the usual –2 circumstance penalty when making a nonlethal attack with a weapon or unarmed attack that doesn’t have the nonlethal trait.
This fairly simple ring has no gemstone inlaid, but the band is cast to resembled a fanged wolf’s head.
Once per day, during your daily preparations, you can meditate on this ring to grant yourself 5 temporary Hit Points.
These last until your next daily preparation, as long as you are wearing the ring.
''Trigger'' You roll initiative.
When there’s imminent danger, you drop into a stance with a mere thought.
Use an action that has the <<tag Stance>> trait.
''Trigger'' You roll initiative.
When there’s imminent danger, you drop into a stance with a mere thought.
Use an action that has the <<tag Stance>> trait.
You stand up from [[Prone]].
//The [[Kip Up]] feat allows you to stand up as a free action.//
''Trigger'' A creature within your reach uses a <<tag Move>> action or leaves a square during a move action it’s using.
You strike out when your foe tries to flee.
Make a melee [[Strike]] against the triggering creature.
If the attack is a critical hit and the trigger was a move action, you disrupt that action.
Your magic has crystallized into a spherical stone.
You gain a [[familiar|Familiar (Rule)]], except it’s a star orb: a Tiny stone of light Bulk.
The familiar has no Speeds and must select a Speed familiar ability before it can move, animating in a way appropriate to the chosen Speed and using the statistics of a normal familiar for that day; when it‘s an immobile stone, it can’t select any familiar or master abilities that require it to move.
It always has the innate surge [[master ability|Master Abilities]].
Please use the search box on the left to find content, or start from:
* [[Ancestries|Ancestry]] (and heritages and feats)
* [[Archetypes|Archetype]]
* [[Backgrounds|Background]]
* [[Classes|Class]]
* [[Domains|Domain]]
* [[Items|Item]]
* [[Runes|Rune]]
* [[Skills|Skill]]
* [[Spells|Spell]]
All content in regular text is taken directly from rulebooks or official material.
All content in //italics// is added by the editor or contributors (although TiddlyWiki internally also uses italics to indicate broken links).
All content __underlined__ is taken from official errata.
This Tiddlywiki uses trademarks and/or copyrights owned by Paizo Inc., which are used under Paizo's Community Use Policy. We are expressly prohibited from charging you to use or access this content. This Tiddlywiki is not published, endorsed, or specifically approved by Paizo Inc. For more information about Paizo's Community Use Policy, please visit paizo.com/communityuse. For more information about Paizo Inc. and Paizo products, please visit paizo.com.
Other content used under the [[Open Game License]].
Please note: Archives of Nethys is a Paizo partner and has enhanced licensing. The fact that content appears on Archives of Nethys does ''not'' allow it to be included in these documents.
Ritual icon {{RitualIcon}} made by Freepik from Flaticon.
Reaction icon {{ReactionIcon}} made by Elissa Codazzi from Online Web Fonts.
Clock icon {{ClockIcon}} from Icons8.
SVG versions of Pathfinder standard action icons {{OneAction}}, {{TwoAction}}, {{ThreeAction}}, {{FreeAction}} made by hyphz.
Please keep the [[Style Guide]].
''Requirements'' You are completely unnoticed by the target creature.
You can startle foes who are unaware of your presence.
Make a [[Strike]] against your target. That creature is [[Flat-Footed]] against this Strike, as normal //(for being unnoticed)//.
If your Strike hits, the target remains flat-footed for the rest of your turn and is [[Frightened]] 1 (Frightened 2 on a critical hit).
You are trained in [[Intimidation]] (or another skill of your choice, if you were already trained in Intimidation) and gain the [[Intimidating Glare]] skill feat as a bonus feat.
Typically characters eat and drink enough to survive comfortably.
When they can’t, they’re [[Fatigued]] until they do.
After 1 day + a creature’s [[Constitution]] modifier without food, it takes 1 damage each day that can’t be healed until it sates its hunger.
{{||SpellSummaryTable}}
The flow of time congeals around an object or creature, holding it in place.
The target must attempt a [[Will]] save (an unattended object automatically critically fails its save).
{{||SaveSuccessTable}}
These ancestries boost <<currentTiddler>>:
<<bulletlist "[all[current]listed[anc-boosts]sort[]]">>
These ancestries have flaws in <<currentTiddler>>:
<<bulletlist "[all[current]listed[anc-flaws]sort[]]">>
{{||RitualSummaryTable}}
This ritual is a variant of the [[Shrink Item]] spell that allows for the transformation of significantly larger items.
You transform the object into a tiny statuette of itself that is light Bulk. The ritual does not shrink any creatures inside or on top of the item when it is transformed.
The item remains in statuette form until the ritual’s duration expires or until a creature places it on a stable surface and uses a 10-minute activity to [[Interact]] with the item to enlarge it.
When restored to its normal size, the object simply pushes other creatures and objects aside or harmlessly contains them, as a magic item with the <<tag Structure>> trait.
Your Arcana check determines how long the object remains in statuette form.
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
As long as you and the target are on the same plane of existence and both alive, you remain aware of its present state.
You know the target’s direction from you, distance from you, and any <<tag Condition>>s affecting it.
''Heightened (4th)'' The spell’s range increases to 30 feet, and you can target up to 10 creatures.
Your presence alone is enough to provide your allies with emotional support. // You are such a good dog.//
You can use the [[Aid]] reaction to grant a bonus to another creature’s [[Will]] saving throw even when you haven’t prepared to help.
''Prerequisites'' Trained in [[Acrobatics]].
You can keep your balance easily, even in adverse conditions.
Whenever you roll a success using the [[Balance]] action, you get a critical success instead.
You’re not [[Flat-Footed]] while attempting to Balance on [[Narrow Surface]]s and [[Uneven Ground]].
Thanks to your incredible balance, you can attempt an Acrobatics check instead of a Reflex save to [[Grab an Edge]].
Your connection to the earth makes natural uneven surfaces less of a hindrance for you.
You can ignore [[Difficult Terrain]] caused by rubble and uneven ground made of stone and earth.
In addition, when you use the [[Acrobatics]] skill to [[Balance]] on narrow surfaces or uneven ground made of stone and earth, you aren’t [[Flat-Footed]], and when you roll a success at one of these Acrobatics checks, you get a critical success instead.
You don’t lose spells easily.
If a reaction would disrupt your spellcasting action, attempt a DC 15 flat check.
If you succeed, your action isn’t disrupted.
//NB: there is no protection against spellcasting being disrupted by things other than reactions.//
You try to take a small object from another creature without being noticed.
Typically, you can Steal only an object of negligible Bulk, and you automatically fail if the creature who has the object is in combat or on guard. //If you have [[Pickpocket]] and are a master in Thievery, you do not automatically fail, but you can't steal items that are noticable or actively wielded and you get a -5 penalty. If you have [[Legendary Thief]], you can steal noticeable and actively wielded items but you get a -5 penalty and it takes 1 minute, during which you must remain hidden.//
Attempt a [[Thievery]] check to determine if you successfully Steal the object. The DC to Steal is usually the [[Perception]] DC of the creature wearing the object.
This assumes the object is worn but not closely guarded (like a loosely carried pouch filled with coins, or an object within such a pouch). If the object is in a pocket or similarly protected, you take a –5 penalty to your Thievery check //unless you have [[Pickpocket]]//.
The GM might increase the DC of your check if the nature of the object makes it harder to steal (such as a very small item in a large pack, or a sheet of parchment mixed in with other documents).
You might also need to compare your Thievery check result against the Perception DCs of observers other than the person wearing the object. The GM may increase the Perception DCs of these observers if they’re distracted. //If you have [[Subtle Theft]], the observers take -2 circumstance to their Perception DCs.//
{{||ActionSuccessTable}}
''Prerequisites'' legendary in Thievery or master in Arcana, Nature, Occult, or Religion
''Requirements'' A magic item is within your reach.
The DC to steal the properties of a magic item is equal to the DC for the item’s level or the normal DC to [[Steal]] the item, whichever is higher. The targeted item then becomes temporarily immune for 24 hours.
If the object was on a creature, that creature is also temporarily immune (which prevents you from attempting to Steal the Essence of another object on it).
If you successfully steal the properties of an item, it loses its magical properties for 24 hours and you can move those properties to a non-magical object of the same general kind (such as moving a hat’s properties to another piece of headgear or moving a weapon’s properties to another weapon) for the same length of time.
If the moved properties are [[Counteract]]ed, they return immediately to the original item.
You automatically fail to Steal the Essence of an artifact, cursed item, or similar item.
{{||SpellSummaryTable}}
You steal a creature’s shadow, leaving it weakened and vulnerable.
The target must attempt a [[Fortitude]] save.
{{||SaveSuccessTable}}
''Heightened (+1)'' The damage when the spell is cast and when it is sustained increases by 1d4.
''Key Ability'' [[Dexterity]].
You are skilled at avoiding detection, allowing you to slip past foes, hide, or conceal an item.
{{||SkillActionList}}
{{||SkillFeatList}}
You’ve trained your animal companion to blend in to its surroundings.
Your animal companion gains the benefit of the [[Camouflage]] feat.
If your companion is a specialized ambusher, its proficiency rank for [[Stealth]] increases to master (or legendary if it was already master).
You transform your fire spells into steam, making them more effective underwater.
If your next action is to [[Cast a Spell]] with the <<tag Fire>> trait, you can cast it underwater. When you do so, it takes the form of scalding steam.
Underwater creatures do not gain the normal fire resistance for being underwater against this spell, but they don’t light things on fire or cause persistent fire damage, nor do they add other effects that would apply to fire but not steam (at the GM’s discretion).
You wear your armor like a second skin.
You can rest normally while wearing medium armor.
If you are a master in heavy armor, you can also rest normally while wearing heavy armor.
You encourage an ally to toughen up, giving them a fighting chance.
Choose one ally within your marshal’s aura.
The ally gains temporary Hit Points equal to your [[Charisma]] modifier and a +2 circumstance bonus to [[Fortitude]] saves.
Both benefits last until the start of your next turn.
Your flat check to recover from persistent physical (including bleed), energy, or poison damage is DC 13 (rather than DC 15), or DC 8 when provided particularly effective assistance. //(Most actual poisons don't deal persistent poison damage.)//
''Requirements:'' Your Speed is at least 10 feet.
You carefully move 5 feet.
Unlike most types of movement, Stepping doesn’t trigger reactions, such as [[Attack of Opportunity]], that can be triggered by move actions or upon leaving or entering a square.
You can’t Step into [[Difficult Terrain]] //unless you have [[Feather Step]]//, and you can't Step using a Speed other than your land Speed.
''Trigger'' A Large or larger enemy ends a move action adjacent to you.
You are an expert at avoiding the lumbering footsteps of larger creatures.
You [[Step]] to another space adjacent to the enemy.
''Frequency'' Once per round.
''Trigger'' You use [[Quick Alchemy]] to craft an alchemical bomb, and that bomb’s level is at least 2 levels lower than your [[Advanced Alchemy]] level.
''Additive 2''.
You mix in an additive to make your bomb’s contents adhere to the target and continue to deal damage.
A creature that takes a direct hit from one of your sticky bombs also takes persistent damage equal to and of the same type as the bomb’s splash damage.
If the bomb already deals persistent damage, combine the two amounts.
A combination of additional viscosity and careful application keeps your weapons poisoned even when suffering significant wear and tear.
If your Strike with a poisoned weapon would expend its poison without your target attempting an initial save (due to resistance or your Strike being a critical failure, for example), attempt a DC 5 flat check. On a success, your weapon remains poisoned.
If your Strike with a poisoned weapon succeeds, attempt a DC 17 flat check. On a success, your weapon remains poisoned until the end of your next turn.
{{||SpellSummaryTable}}
You create a cloud of putrid mist in the area. The cloud functions as [[Obscuring Mist]] except it sickens creatures that end their turns within the cloud.
//They must make a [[Fortitude]] save.//
(The [[Concealed]] condition is not a poison effect.)
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
Intense fervor fills the target creature, empowering their blows.
The target gains a +2 status bonus to damage rolls.
Once this spell ends, the target becomes temporarily immune for 1 minute.
''Heightened (+2)'' The status bonus to damage increases by 1.
{{LOWGFeat}}
You can selectively stop your bleeding with ease.
Reduce the DC of flat checks to stop persistent bleed damage you have from 15 to 10, and you can use a single action that has the <<tag Concentrate>> trait to gain an early flat check without physically binding the wounds.
You recover naturally from the drained condition twice as quickly as normal.
This mutagen calcifies your body making it as hard as stone.
''Benefit'' You gain resistance to physical damage (except bludgeoning) equal to the listed amount.
''Drawback'' Your Speeds are reduced by 10 feet (minimum 5 feet) and you take a –2 penalty to [[Reflex]] saves.
| !Type | !Level | !Price | !Resistance | !Duration |
| Lesser | 5 | 220 | 5 | 10 mins |
| Moderate | 12 | 3000 | 5 | 1 hour |
| Greater | 15 | 9200 | 10 | 1 hour |
''Trigger'' You are struck by a critical hit that deals physical damage.
Your intractable nature can help you shrug off even the most grievous injuries.
Attempt a DC 17 flat check. If you are successful, the attack becomes a normal hit.
Sling bullet ammunition.
This sling bullet looks like a petrified serpent’s eye.
A creature hit by an activated {{{OneAction}} [[Interact]]) stone bullet is subject to the effects of a 6th-level [[Flesh to Stone]] spell (DC 34).
''Craft Requirements'' Supply one casting of [[Flesh to Stone]].
{{LOWGFeat}}
You gain a unique communion with the earth and stones.
You learn the Terran language and you can Activate your ka stone with a 10-minute activation (envision) to cast [[Stone Tell]].
Through conditioning or experience, you’ve mastered the art of composure, even in the face of fear.
You gain a +1 circumstance bonus to saves against effects with the <<tag Fear>> trait, and a +2 circumstance bonus to your [[Will]] DC against //[[Intimidation]]// skill actions, such as [[Demoralize]].
Your fists become hard as stone.
For 1 hour, your fists deal 1d6 bludgeoning damage and lose the [[Nonlethal]] trait.
You can transform your body into a pure primal manifestation of earth, an elemental.
Once per day, you can cast [[Elemental Form]] as a 7th-level primal innate spell, but you can only choose the earth elemental form.
{{||SpellSummaryTable}}
You can ask questions of and receive answers from natural or worked stone.
While stone is not intelligent, you speak with the natural spirits of the stone, which have a personality colored by the type of stone, as well as by the type of structure the stone is part of, for worked stone.
A stone’s perspective, perception, and knowledge give it a worldview different enough from a human’s that it doesn’t consider the same details important. Stones can mostly answer questions about creatures that touched them in the past and what is concealed beneath or behind them.
{{||SpellSummaryTable}}
Manipulating the fundamental particles of matter, you convert stone into flesh and blood.
You restore a [[Petrified]] creature to its normal state or transform a stone object into a mass of inert flesh (without stone’s Hardness) in roughly the same shape.
You have a knack for noticing even small inconsistencies and craftsmanship techniques in the stonework around you.
You gain a +2 circumstance bonus to [[Perception]] checks to notice unusual stonework. This bonus applies to checks to discover mechanical traps made of stone or hidden within stone.
If you aren’t using the Seek action or searching, the GM automatically rolls a secret check for you to notice unusual stonework anyway. This check doesn’t gain the circumstance bonus, and it takes a –2 circumstance penalty.
Earthen barriers no longer impede your progress.
You gain [[Passwall]] as a 7th-level divine innate spell that you can cast once per day.
Unlike the spell, however, this ability can be used only to open passages through barriers of earth or stone.
{{||SpellSummaryTable}}
The target’s skin hardens like stone.
It gains [[Resistance]] 5 to physical damage, except adamantine.
Each time the target is hit by a <<tag Bludgeoning>>, <<tag Piercing>>, or <<tag Slashing>> attack, stoneskin’s duration decreases by 1 minute.
''Heightened (6th)'' The resistance increases to 10.
''Heightened (8th)'' The resistance increases to 15.
''Heightened (10th)'' The resistance increases to 20.
You have a deep reverence for and connection to stone.
You gain [[Meld into Stone]] as a 3rd‑level divine innate spell that you can cast once per day.
If you have the [[Stonecunning]] dwarf ancestry feat, you can attempt to find unusual stonework and stonework traps that require legendary proficiency in [[Perception]].
If you have both [[Stonecunning]] and legendary proficiency in Perception, when you’re not [[Seek]]ing and the GM rolls a secret check for you to notice unusual stonework, you keep the bonus from Stonecunning and don’t take the –2 circumstance penalty.
//Implied by [[Enforce Oath]].//
You can also stop Enforcing your Oath at any time during your turn as a free action.
Ammunition: Arrow.
The head of this arrow is made from gleaming copper.
When an activated ({{OneAction}} [[Interact]]) storm arrow hits a target, it is buffeted by raging winds and struck by a bolt of lightning that deals 3d12 <<tag Electricity>> damage and the target must attempt a DC 25 [[Reflex]] saving throw.
If this arrow is shot from a weapon with a [[Shock]] property rune, the save DC increases to 27, though the attack doesn’t benefit from the shock property rune itself.
{{||SaveSuccessTable}}
You are at home out in the elements, reveling in the power of nature unleashed.
You do not take circumstance penalties to ranged spell attacks or [[Perception]] checks caused by weather, and your targeted spells don’t require a flat check to succeed against a target concealed by weather (such as fog).
You can transform into an elemental.
Once per day, you can cast [[Elemental Form]] as a 7th-level primal innate spell, but you can only choose the air elemental form.
{{||SpellSummaryTable}}
The sky above you darkens in a matter of moments, swirling with ominous clouds punctuated by flashes of lighting.
Each round when you [[Sustain the Spell|Sustain a Spell]], you can select one of the following effects to occur in the area.
* ''Calm'' No additional effect.
* ''Fog'' Heavy fog rolls in, concealing the area with the effects of [[Obscuring Mist]].
* ''Rain'' Torrential rain falls from the sky, dousing ordinary flames. Creatures in the area take a –2 circumstance penalty to [[Acrobatics]] and [[Perception]] checks.
* ''Wind'' Powerful winds buffet the area in all directions. Ranged attacks take a –4 circumstance penalty, and all flying is against the wind and counts as moving through [[Difficult Terrain]].
In addition, once per round you can use a single action, which has the <<tag Concentrate>>and <<tag Manipulate>> traits, to call down a bolt of lightning, striking any target in range that you can see.
You deal 10d6 electricity damage to the target; it must attempt a basic [[Reflex]] save. On a failure, it is also [[Deafened]] for 1 round.
{{||SpellSummaryTable}}
A massive storm cloud forms in the air in a 360-foot burst.
Beneath it, rain begins to fall, and gales impose a –4 circumstance penalty to physical ranged attacks and weapon ranged attacks, and the air in the area becomes greater [[Difficult Terrain]] for flying creatures.
When you Cast this Spell and the first time each round you [[Sustain the Spell|Sustain a Spell]], you can choose one of the following storm effects.
You can’t choose the same effect twice in a row.
* ''Acid Rain'' Each creature in the storm takes 4d8 acid damage with no saving throw.
* ''Hail'' The storm deals 4d10 bludgeoning damage to creatures beneath it (basic [[Fortitude]] save).
* ''Lightning'' Up to 10 bolts of lightning strike down, targeting creatures of your choice in the storm. No more than one bolt can target any one creature. Each bolt deals 7d6 electricity damage (basic [[Reflex]] save).
* ''Rain and Wind'' Heavy rain and whipping wind reduce visibility and mobility, making the area under the storm cloud [[Difficult Terrain]] and making everything seen within or through the area [[Concealed]].
* ''Thunderclap'' Each creature in the storm must succeed at a [[Fortitude]] save or be [[Deafened]] for 10 minutes. A creature that succeeds is temporarily immune to thunderclaps from storm of vengeance for 1 hour.
''Heightened (10th)'' The range increases to 2,200 feet, and the cloud is a 1,000-foot burst.
You carry the fury of the storm within you, channeling it to terrifying effect and riding the winds through the sky.
You are trained in [[Acrobatics]].
You also gain the [[Storm Born]] druid feat.
You gain the [[Tempest Surge]] order spell, and you increase the number of Focus Points in your focus pool by 1.
Polluting the air or allowing those who cause major air pollution or climate shifts to go unpunished is anathema to your order. (This doesn’t force you to take action against merely potential harm to the environment or to sacrifice yourself against an obviously superior foe.)
''Prerequisites'' [[Tempest Surge]] order spell.
''Trigger'' An opponent adjacent to you critically hits you with a melee weapon or melee unarmed attack.
''Requirements'' You have at least 1 available Focus Point.
You lash out, directing a burst of storming fury toward a creature that has harmed you.
You cast [[Tempest Surge]] on the triggering opponent and push that creature, moving it 5 feet away from you if it fails its [[Reflex]] save, or 10 feet if it critically fails. This movement is [[Forced Movement]].
Wind and lightning have always been close friends to you.
You can cast the [[Electric Arc]] cantrip as a primal innate spell at will. A cantrip is heightened to a spell level equal to half your level rounded up.
Your elemental ancestor’s influence manifests in you as tumultuous, thundering storms, with dark clouds and bolts of lightning.
You gain resistance to electricity equal to half your level (minimum 1).
You gain electricity resistance equal to half your level (minimum 1).
You automatically succeed at the flat check to target a [[Concealed]] creature if that creature is concealed only by rain or fog.
{{||SpellSummaryTable}}
Powerful winds carry you smoothly through the air, giving you a fly Speed equal to your Speed.
When this spell’s duration would end, if you’re still flying, you float to the ground, as [[Feather Fall]].
''Heightened (6th)'' When you fly using stormwind flight, you don’t count flying against the wind as [[Difficult Terrain]].
The elemental power in your blood is a raging storm.
You can [[Invoke the Elements]] with a frequency of once per 10 minutes, rather than once per day.
You’re a talented story weaver and use your voice effectively.
You are trained in [[Performance]]. If you would automatically become trained in Performance, you instead become trained in a skill of your choice.
You also gain the [[Impressive Performance]] skill feat and gain a +1 circumstance bonus when Performing for an audience of Strix.
{{||SpellSummaryTable}}
You cause the areas to appear to swell, bend, and break, twisting together in a bizarre spatial geometry.
The cubes of the spell’s area can’t be adjacent to one another.
A creature must attempt a [[Will]] save if it’s in one of the cubes when you Cast the Spell, or if it later enters one of the areas, with the following effects.
A creature interacting with the illusion can also attempt a [[Will]] save to disbelieve the illusion, as normal.
If the creature passes their save, they disbelieve the illusion.
If they fail, all terrain in the cubes is [[Difficult Terrain]] for the creature, including the air if the creature is flying, walls if it’s climbing, and so on. When the creature would exit one of the cubes, it exits from one randomly determined by the GM. This is a <<tag Teleportation>> effect. It can exit from any edge of that cube it chooses.
When selecting a random cube, the GM excludes any that don’t match the creature’s terrain; for instance, if the creature were exiting along the ground, the GM would exclude any cube that didn’t have an exit on the ground.
You learn your foes’ strengths and weaknesses by watching them move.
When you critically hit a creature with a [[Strike]] on which you substituted your attack roll due to [[Devising a Stratagem|Devise a Stratagem]], the GM chooses one of the following pieces of information about the enemy to tell you.
* Which of the enemy’s weaknesses is highest.
* Which of the enemy’s resistances is highest.
* Which of the enemy’s saving throws is lowest.
* One immunity the enemy has.
The GM can choose deliberately or at random, but they can’t choose information that doesn’t apply (such as choosing an immunity for an enemy that has no immunities).
This applies only the first time you critically hit a given creature.
Your plans account for your foes’ resistances, enabling you to strike a telling blow.
When you hit with a Strike on which you substituted your attack roll due to [[Devising a Stratagem|Devise a Strategem]], you ignore an amount of resistance equal to your Intelligence modifier for each resistance that applies against your attack.
When you strike carefully and with forethought, you deal a telling blow.
When making a [[Strike]] that adds your [[Intelligence]] modifier on your attack roll due to [[Devising a Stratagem|Devise a Stratagem]], you deal an additional 1d6 precision damage.
As your investigator level increases, so too does the deadliness of your strategic strike. Increase the number of dice by one at 5th, 9th, 13th, and 17th levels.
You descend from one of the truly ancient vampires, a nosferatu cursed to eternal life but not eternal youth. People call you straveika, or ancient-born. The vestiges of your forebear’s powers of domination have left you with an understanding of how a creature’s intentions change its behaviors.
You gain a +1 circumstance bonus to [[Perception]] checks to [[Sense Motive]] and Perception DCs against attempts to [[Lie]] to you.
''Prerequisites'' Trained in [[Society]].
You know about life on the streets and feel the pulse of your local settlement.
You can use your Society modifier instead of your Diplomacy modifier to [[Gather Information]].
In any settlement you frequent regularly, you can use the [[Recall Knowledge]] action with Society to know the same sorts of information that you could discover with Diplomacy to Gather Information. The DC is usually significantly higher, but you know the information without spending time gathering it. If you fail to recall the information, you can still subsequently attempt to Gather Information normally.
Strength measures your character’s physical power.
Strength is important if your character plans to engage in hand-to-hand combat.
Your Strength modifier gets added to melee damage rolls and determines how much your character can carry.
You can carry an amount of [[Bulk]] equal to 5 plus your Strength modifier without penalty; if you carry more, you gain the encumbered condition. You can’t hold or carry more Bulk than 10 plus your Strength modifier. If you are carrying more weight than you can manage, you're [[Encumbered]].
//Strength governs [[Athletics]].//
//Being [[Enfeebled]], [[Sickened]] or [[Frightened]] reduces your Strength rolls.//
{{||StatModSummary}}
You move up to your Speed.
You attack with a weapon you’re wielding or with an unarmed attack, targeting one creature within your reach (for a melee attack) or within range (for a ranged attack).
Roll the attack roll for the weapon or unarmed attack you are using, and compare the result to the target creature’s AC to determine the effect.
{{||ActionSuccessTable}}
''Usage'' etched onto a weapon.
A striking rune stores destructive magic in the weapon.
You can upgrade the striking rune already etched on a weapon to a stronger version, increasing the values of the existing rune to those of the new rune. You must have the formula of the stronger rune to do so, and the Price of the upgrade is the difference between the two runes’ Prices.
| !Type | !Level | !Price | !Number of weapon damage dice |
| (standard) | 4 | 650 | 2 |
| Greater | 12 | 10650 | 3 |
| Major | 19 | 310650 | 4 |
You have an appropriately intense hatred for alghollthus.
You gain a +2 circumstance bonus to damage with weapons and unarmed attacks against creatures from the alghollthu family and those that serve alghollthus (the GM determines which creatures serve an alghollthu).
In addition, if an alghollthu successfully affects you or one of your allies within 60 feet with an <<tag Enchantment>>, your circumstance bonus to damage against that alghollthu increases to +4 for 1 minute.
Your ancestral feud with humans gives you experience dealing with vicious foes, and your vengeance knows no bounds.
You gain a +1 circumstance bonus to [[Intimidation]], [[Perception]], and [[Survival]] checks against humans, as well as on damage rolls against humans with weapons and unarmed attacks.
However, your hatred of humans is immediately obvious, giving you a –2 circumstance penalty to [[Diplomacy]] checks against them and usually starting their attitude one step worse towards you.
You’re well connected to your tribe and perhaps even strix communities beyond your own, where you’ve learned about the land and techniques of graceful movement.
You gain the trained proficiency rank in [[Acrobatics]] and [[Nature]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Strix [[Lore]].
''Frequency'' once per 10 minutes.
''Trigger'' You, or a strix ally you can see, are damaged by an enemy’s critical hit.
You dedicate yourself to destroying those who harm your kin.
Until the end of your next turn, you deal an additional +1d6 damage on Strikes against the triggering enemy.
The bonus increases to +2d6 if you use a [[Striking]] weapon or unarmed attack and +3d6 if you use a major striking weapon or unarmed attack.
All strix possess powerful wings. While not all strix focus on honing their flying skills, a strong flap of their wings allows strix to travel longer distances when jumping.
When [[Leap]]ing horizontally, you move an additional 5 feet.
You don’t automatically fail your checks to [[High Jump]] or [[Long Jump]] if you don’t [[Stride]] at least 10 feet first.
In addition, when you make a Long Jump, you can jump a distance up to 10 feet further than your [[Athletics]] check result, though still with the normal maximum of your Speed.
When you [[Strike]] with a thrown weapon, the weapon’s range increment increases 10 feet.
Your swim Speed increases to match your land Speed.
You gain poison resistance equal to half your level (minimum 1), and each of your successful saving throws against a poison affliction reduces its stage by 2, or by 1 for a virulent poison.
Each critical success against an ongoing poison reduces its stage by 3, or by 2 for a virulent poison.
You gain a jaws unarmed attack that deals 1d6 piercing damage. Your jaws are in the [[Brawling]] group and have the [[Finesse]] and [[Unarmed]] traits.
An item with the structure trait creates a magical building or other structure when activated.
The item must be activated on a plot of land free of other structures.
The structure adapts to the natural terrain, adopting the structural requirements for being built there.
The structure adjusts around small features such as ponds or spires of rock, but it can’t be created on water or other nonsolid surfaces.
If activated on snow, sand dunes, or other soft surfaces with a solid surface underneath, the structure’s foundation (if any) reaches the solid ground.
If an item with this trait is activated on a solid but unstable surface, such as a swamp or an area plagued by tremors, roll a DC 3 flat check each day; on a failure, the structure begins to sink or collapse.
The structure doesn’t harm creatures within the area when it appears, and it can’t be created within a crowd or in a densely populated area.
Any creature inadvertently caught inside the structure when the item is activated ends up unharmed inside the complete structure and always has a clear path of escape.
A creature inside the structure when the activation ends isn’t harmed, and it lands harmlessly on the ground if it was on an upper level of the structure.
Humans are renowned for their ability to persist through the most grueling of trials.
When you would become [[Fatigued]], attempt a DC 17 flat check. On a success, you aren’t fatigued.
If the fatigued condition has an underlying cause that you don’t address, such as lack of rest, you must attempt the check again at an interval determined by the GM until you fail the flat check or address the underlying cause.
{{LOWGFeat}}
''Prerequisites'' [[Powerful Fist]] or expert in unarmed attacks.
You have learned the martial arts techniques of your House of Perfection.
You become trained in your choice of [[Acrobatics]] or [[Athletics]] and Warfare [[Lore]]; if you were already trained, you become an expert instead.
You gain the [[Ki Strike]] monk class feat, which grants you the ki strike ki spell and a focus pool of 1 Focus Point that you can recover using the [[Refocus]] activity as a monk does.
Your ki spells from Student of Perfection are occult spells.
<<archetypefeatlist "2 4 6" "[[Student of Perfection]]">>
''Prerequisites'' Trained in [[Religion]].
You’ve researched many faiths enough to recognize notions about them that are unlikely to be true.
If you roll a critical failure at a Religion check to [[Decipher Writing]] of a religious nature or to Recall Knowledge about the tenets of faiths, you get a failure instead.
When attempting to [[Recall Knowledge]] about the tenets of your own faith, if you roll a failure, you get a success instead, and if you roll a success, you get a critical success instead.
You have studied a great many combat techniques, which you can review each day.
During your daily preparations, you can swap out any number of your duelist archetype feats for other duelist archetype feats of the appropriate level for which you are qualified.
You can’t swap out Duelist Dedication or Student of the Dueling Arts in this way.
In addition, you can enter a stance from a duelist archetype feat you don’t have (such as one listed under Additional Feats) by increasing the number of actions it takes to enter the stance by 1 (typically to 2 actions). You must still meet the feat’s prerequisites.
Your continued study of occult magic has increased your magical capacity, allowing you to cast spells even when it seems impossible.
You can cast one spell each day even after you’ve run out of spell slots of the appropriate spell level, but you can’t use this ability to cast a spell of your highest spell level.
''Requirements'' You are in [[Stumbling Stance]].
You lash out confusingly with what seems to be a weak move but instead allows you to unleash a dangerous flurry of blows upon your unsuspecting foe.
When you use [[Flurry of Blows]], you can attempt a check to [[Feint]] as a free action just before the first Strike.
On a success, instead of making the target [[Flat-Footed]] against your next attack, they become flat-footed against both attacks from the Flurry of Blows.
You enter a seemingly unfocused stance that mimics the movements of the inebriate — bobbing, weaving, leaving false openings, and distracting your enemies from your true movements.
While in this stance, you gain a +1 circumstance bonus to [[Deception]] checks to [[Feint]].
The only Strikes you can make are stumbling swing unarmed attacks. These deal 1d8 bludgeoning damage; are in the brawling group; and have the [[Agile]], [[Backstabber]], [[Finesse]], [[Nonlethal]], and [[Unarmed]] traits.
If an enemy hits you with a melee Strike while in this stance, it becomes [[Flat-Footed]] against the next stumbling swing Strike you make against it before the end of your next turn.
You’ve become senseless.
You can’t act while stunned.
Stunned usually includes a value, which indicates how many total actions you lose, possibly over multiple turns, from being stunned.
Each time you regain actions (such as at the start of your turn), reduce the number you regain by your stunned value, then reduce your stunned value by the number of actions you lost. For example, if you were stunned 4, you would lose all 3 of your actions on your turn, reducing you to stunned 1; on your next turn, you would lose 1 more action, and then be able to use your remaining 2 actions normally.
Stunned might also have a duration instead of a value, such as “stunned for 1 minute.” In this case, you lose all your actions for the listed duration.
Stunned overrides [[Slowed]]. If the duration of your stunned condition ends while you are slowed, you count the actions lost to the stunned condition toward those lost to being slowed. So, if you were stunned 1 and slowed 2 at the beginning of your turn, you would lose 1 action from stunned, and then lose only 1 additional action by being slowed, so you would still have 1 action remaining to use that turn.
Your sudden appearance leaves your foe unable to respond.
When you use [[Startling Appearance]], if your foe’s level is equal to or lower than yours, they are also [[Stunned]] 1 on a hit, or stunned 2 on a critical hit.
The focused power of your flurry threatens to overwhelm your opponent.
When you target the same creature with two [[Strike]]s from your [[Flurry of Blows]], you can try to stun the creature.
If either Strike hits and deals damage, the target must succeed at a [[Fortitude]] save against your class DC or be [[Stunned]] 1 (or [[Stunned]] 3 on a critical failure). This is an incapacitation effect //so a target that's higher level than you is only stunned 1 if they critically fail, and not at all on a regular fail.//
Your thoughts and instincts are clouded.
Stupefied always includes a value. You take a status penalty equal to this value on [[Intelligence]]-, [[Wisdom]]-, and [[Charisma]]-based checks and DCs, including [[Will]] saving throws, spell attack rolls, spell DCs, and skill checks that use these ability scores.
Any time you attempt to [[Cast a Spell]] while stupefied, the spell is disrupted unless you succeed at a flat check with a DC equal to 5 + your stupefied value.
Your grapples are incredibly reliable.
When you roll a critical failure on a check to [[Grapple]] a target, you get a failure instead.
In addition, when a creature you have grabbed rolls a failure on its check to [[Escape]], it gets a critical failure instead, and if it rolls a critical success, it gets a success instead.
!! Text
Text taken directly from rulebooks should be in plain font.
Text taken from official errata should be __underlined__.
Text added by authors should be //italicised//.
Each key point should be made in a separate isolated paragraph. Follow-up discussion can be included in a paragraph with the point it refers to.
Official material may be re-ordered in order to clarify it.
!! Titles
Tiddler titles should correspond to the name of the item in official material.
Tiddler titles should use the same capitalization as in official material, unless official material shows the title only in capitals. In that case, tiddler titles should be in title case, with the first letter of each word capitalised with the exception of standard prepositions like "of", "to", etc.
Tiddler titles should not be plural.
Tiddler titles should not begin with "The".
!! Links
Any referenced topic in text should be linked to the appropriate tiddler unless it is a negative example (ie, Fortitude should not be linked if it is mention in the context of ''not'' being allowed a Fortitude save)
Text that needs to be capitalised in order to become a tiddler link may be so capitalised. There is no need to create a renamed link just in order to keep capitalisation.
Key rules should usually be reciprocally linked and explained in annotations.
!! Tags
<<tag Action>> should be used for actions, that a player can invoke on their turn. These should usually have at least an ``a-actions`` field and include the ``ActionSummary`` template.
<<tag Spell>> should be used for spells. These should also be tagged for school, components, game tags, and <<tag Manipulate>> or <<tag Concentrate>> as appropriate for their components. These should have at least a ``m-level`` field and probably more. (M was supposed to stand for "magic". Sorry.) They should include the ``SpellSummaryTable`` template.
!! Fields
Notes:
* ``a-crit``, etc, fields are for successes on action rolls. ``s-crit``, etc, are for saves. If in doubt, use a- if a crit is better for the ''user'' of the effect, and s- if it is worse for the user and better for the target.
* If using ``a-crit``, etc, add the ``ActionSuccessTable`` transclude to lay out the results. If using ``s-crit``, etc, add ``SaveSuccessTable``.
| !TW field | !Meaning |
| a-actions | Number of actions taken by an action/activity. |
| a-crit | Effect on a critical success on an action roll (not a save). |
| a-hit | Effect on a success on an action roll. |
| a-fail | Effect on a failure on an action roll. |
| a-fumble | Effect on a critical failure on an action roll. |
| a-defense | Value that provides a save or target DC for an action roll. |
| a-hands | Number of free hands required for an action. |
| a-skill | Skill(s) used for an action. |
| a-subactions | Subsidiary actions for an action. |
| a-time | Time (if extended) needed for an action (eg, 10 minutes, not 3 actions - use a-actions for that). |
| a-tool | Object needed to perform an action. |
| feat-class | Class a feat is associated with, if any. |
| feat-level | Level of a feat. |
| feat-skill | Skill associated with a feat. |
| feat-spre | Letter for skill prerequisite level to take feat. |
| m-area | Area of spell. |
| m-components | Spell components. |
| m-duration | Duration of spell. |
| m-level | Level of spell. |
| m-range | Range of spell. |
| m-save | Saving throw used for spell, as source of DC. |
| m-targets | Target specification for a spell. |
| m-time | Time (if extended) needed for casting a spell. |
| s-crit | Effect on a critical success on a save |
| s-hit | Effect on a success on a save |
| s-fail | Effect on a failure on a save |
| s-fumble | Effect on a critical failure on a save |
| skill-stat | Associated statistic for a skill |
| splat-class | Associated class for a splat |
| turn-etc | Effect at the ''E''nd of the ''T''arget's ''C''urrent turn, or their turn immediately after being hit with the effect. |
| turn-etn | Effect at the ''E''nd of the ''T''arget's ''N''ext turn |
| turn-euc | Effect at the ''E''nd of the ''U''ser's ''C''urrent turn |
| turn-eun | Effect at the ''E''nd of the ''U''ser's ''N''ext turn |
| turn-stn | Effect at the ''S''tart of the ''T''arget's ''N''ext turn |
| turn-sun | Effect at the ''S''tart of the ''U''ser's ''N''ext turn |
At 3rd level, 7th level, and 15th level, you gain a skill feat.
This feat must be for [[Acrobatics]] or the trained skill from your swashbuckler’s style.
{{||SpellSummaryTable}}
You implant a subconscious suggestion deep within the target’s mind for them to follow when a [[Trigger]] you specify occurs.
You suggest a course of action to the target.
Your directive must be phrased in such a way as to seem like a logical course of action to the target, and it can’t be selfdestructive or obviously against the target’s self-interest.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
''Heightened (9th)'' You can target up to 10 creatures.
Your disparate identities allow you to defeat magic that detects lies.
As long as what you say is true from the point of view of your current identity, you can say it even under effects like [[Zone of Truth]] that force you to speak the truth.
An action might allow you to use a simpler action—usually one of the Basic Actions—in a different circumstance or with different effects.
This subordinate action still has its normal traits and effects, but is modified in any ways listed in the larger action. For example, an activity that tells you to Stride up to half your Speed alters the normal distance you can move in a Stride. The Stride would still have the move trait, would still trigger reactions that occur based on movement, and so on.
The subordinate action doesn’t gain any of the traits of the larger action unless specified.
The action that allows you to use a subordinate action doesn’t require you to spend more actions or reactions to do so; that cost is already factored in.
Using an activity is not the same as using any of its subordinate actions. For example, the quickened condition you get from the haste spell lets you spend an extra action each turn to Stride or Strike, but you couldn’t use the extra action for an activity that includes a Stride or Strike. As another example, if you used an action that specified, “If the next action you use is a Strike,” an activity that includes a Strike wouldn’t count, because the next thing you are doing is starting an activity, not using the Strike basic action.
You try to provide food and shelter for yourself, and possibly others as well.
This typically uses [[Society]] if you're in a settlement or [[Survival]] if you're in the wild.
The GM determines the DC based on the nature of the place where you’re trying to Subsist. You might need a minimum proficiency rank to Subsist in particularly strange environments.
Unlike most downtime activities, you can Subsist after 8 hours or less of exploration, but if you do, you take a –5 penalty.
{{||ActionSuccessTable}}
//The [[Forager]] feat can reduce your chances of failing to subsist and allow you to provide a living for more creatures.//
//The [[Planar Survival]] feat can allow you to use this to survive on a hostile plane.//
You can capably deliver toxins with a blowgun.
Your blowgun [[Strike]]s can apply injury poisons even if they deal no damage due to a creature’s resistance.
If you critically succeed at an attack roll using a blowgun loaded with a dart you’ve poisoned and the target rolls a failure on the poison’s initial save, the target critically fails instead.
''Prerequisites'' Trained in [[Thievery]].
When you successfully [[Steal]] something, observers (creatures other than the creature you stole from) take a –2 circumstance penalty to their [[Perception]] DCs to detect your theft.
Additionally, if you first [[Create a Diversion]] using [[Deception]], taking a single [[Palm an Object]] or [[Steal]] action doesn’t end your [[Undetected]] condition.
{{||SpellSummaryTable}}
You accelerate the processes of decay in the area.
Each living creature in the area takes 2d10 negative damage (basic [[Fortitude]] save).
A creature afflicted by a disease takes a –2 circumstance penalty to this save.
You can also direct the blight to rot all Small and Tiny non-creature plants in the area, eliminating non-magical undergrowth and any resulting [[Difficult Terrain]], [[Cover]], and [[Concealment]].
Sudden blight attempts to [[Counteract]] any magical effect on the plants before withering them.
''Heightened (+1)'' The damage increases by 1d10.
{{||SpellSummaryTable}}
You call down a small bolt of lightning on the target, dealing 4d12 electricity damage //with a basic [[Reflex]] save//.
''Heightened (+1)'' The damage increases by 1d12.
With a quick sprint, you dash up to your foe and swing.
[[Stride]] twice.
If you end your movement within melee reach of at least one enemy, you can make a melee [[Strike]] against that enemy.
You can use Sudden Charge while [[Burrow]]ing, [[Climb]]ing, [[Fly]]ing, or [[Swim]]ming instead of Striding if you have the corresponding movement type.
You swing at a foe while mid-leap.
Make a [[Leap]], [[High Jump]], or [[Long Jump]] and attempt one melee [[Strike]] at any point during your jump.
Immediately after the Strike, you fall to the ground if you’re in the air, even if you haven’t reached the maximum distance of your jump.
If the distance you fall is no more than the height of your jump, you take no damage and land upright.
When attempting a High Jump or Long Jump during a Sudden Leap, determine the DC using
the Long Jump DCs, and increase your maximum distance to double your Speed.
''Special'' If you are a [[Fighter]] and have [[Felling Strike]], you can spend 3 actions to make a Sudden Leap and use Felling Strike instead of a normal Strike.
{{||SpellSummaryTable}}
''Trigger'' An enemy misses you with a melee attack.
You swiftly move from a dangerous spot and veil yourself.
You [[Step]] and become [[Concealed]].
You can’t recover from being [[Unconscious]] and must attempt a DC 20 [[Fortitude]] save at the end of each of your turns.
On a failure, you take 1d10 damage, and on a critical failure, you die.
On each check after the first, the DC increases by 5 and the damage by 1d10; these increases are cumulative.
Once your access to air is restored, you stop suffocating and are no longer Unconscious (unless you're at 0 Hit Points).
{{||SpellSummaryTable}}
Your honeyed words are difficult for creatures to resist.
You suggest a course of action to the target, which must be phrased in such a way as to seem like a logical course of action to the target and can’t be self‑destructive or obviously against the target’s self-interest.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
''Heightened (8th)'' You can target up to 10 creatures.
You are descended from a janni or otherwise embody a dichotomy of opposing elemental planar forces.
You gain the <<tag Suli>> trait, in addition to the traits from your ancestry.
You also gain [[Low-Light Vision]], or you gain darkvision if your ancestry already has low-light vision.
You can choose from <<tag Suli>> feats and feats from your ancestry whenever you gain an ancestry feat.
{{||VHerFeatList}}
You have power connected to the powerful jann amirs.
You can cast [[Read Omens]] and 4th-level [[Invisibility]] each once per day as arcane innate spells, and you can cast [[Detect Magic]] at will as an arcane innate cantrip, heightened to a spell level equal to half your level rounded up.
Your elemental ancestor was a janni, genies that walk the mortal world and embody all four elements together. You inherited a janni’s nature as a wanderer and ability to survive in many types of environment, from the hottest desert to the coldest tundra.
You gain the trained proficiency rank in [[Survival]]. If you would automatically become trained in Survival (from your background or class, for example), you instead become trained in a skill of your choice.
You gain the [[Forager]] skill feat as a bonus feat.
You have a connection to the Inner Spheres, allowing you to summon an elemental ally.
Once per day, you can cast [[Summon Elemental]] as a 5th-level primal innate spell, but the elemental summoned must be an air elemental.
{{||SpellSummaryTable}}
You conjure an animal to fight for you.
You summon a common creature that has the <<tag Animal>> trait and whose level is –1.
Heightening the spell increases the maximum level of creature you can summon.
{{SummonHeightenList}}
{{||SpellSummaryTable}}
You conjure a celestial to fight on your behalf.
This works like [[Summon Animal]], except you summon a common creature that has the <<tag Celestial>> trait and whose level is 5 or lower.
You can’t summon a creature unless its alignment is one of your deity’s preferred alignments (or, if you don’t have a deity, is within one step of your alignment).
At the GM’s discretion, some deities might restrict specific types of celestials, even if their alignments match.
Heightening the spell increases the maximum level of creature you can summon.
{{SummonHeightenList}}
''Prerequisites'' Any aasimar lineage feat.
You have a connection to the celestial realms, allowing you to summon a celestial ally.
Once per day, you can cast [[Summon Celestial]] as a 5th-level divine innate spell, but the celestial summoned must be from the same category as your own lineage, such as a creature with the angel trait if you are angelkin.
{{||SpellSummaryTable}}
You conjure a construct to fight for you.
This works like [[Summon Animal]], except you summon a common creature that has the <<tag Construct>>trait and whose level is –1.
Heightening the spell increases the maximum level of creature you can summon.
{{SummonHeightenList}}
{{||SpellSummaryTable}}
You conjure a dragon to fight for you.
This works like [[Summon Animal]], except you summon a common creature that has the <<tag Dragon>>trait and whose level is 5 or lower.
Heightening the spell increases the maximum level of creature you can summon.
{{SummonHeightenList}}
You have a connection to the Inner Sphere, allowing you to summon an elemental ally.
Once per day, you can cast [[Summon Elemental]] as a 5th-level primal innate spell, but the elemental summoned must be an earth elemental.
{{||SpellSummaryTable}}
You conjure an elemental to fight for you.
This works like [[Summon Animal]], except you summon a common creature that has the <<tag Elemental>> trait and whose level is 1 or lower.
Heightening the spell increases the maximum level of creature you can summon.
{{SummonHeightenList}}
{{||SpellSummaryTable}}
You conjure an aberration to fight for you.
This works like [[Summon Animal]], except you summon a common creature that has the <<tag Aberration>> trait and whose level is 5 or lower.
{{SummonHeightenList}}
{{||SpellSummaryTable}}
You conjure a fey to fight for you.
This works like [[Summon Animal]], except you summon a common creature that has the <<tag Fey>> trait and whose level is –1.
Heightening the spell increases the maximum level of creature you can summon.
{{SummonHeightenList}}
{{||SpellSummaryTable}}
You conjure a fiend to fight on your behalf.
This works like [[Summon Animal]], except you summon a common creature that has the <<tag Fiend>> trait and whose level is 5 or lower.
You can’t summon a creature unless its alignment is one of your deity’s preferred alignments (or, if you don’t have a deity, is within one step of your alignment).
At the GM’s discretion, some deities might restrict specific types of fiends, even if their alignments match.
Heightening the spell increases the maximum level of creature you can summon.
{{SummonHeightenList}}
''Prerequisites'' any tiefling lineage feat.
You have a deep connection to the fiendish realms, allowing you to summon a fiend matching your own lineage.
Once per day, you can cast [[Summon Fiend]] as a 5th-level divine innate spell. The fiend you summon must match your own lineage.
You can summon an elemental ally.
Once per day, you can cast [[Summon Elemental]] as a 5th-level primal innate spell, but the elemental summoned must be a fire elemental.
{{||SpellSummaryTable}}
You conjure a giant to fight for you.
This works like [[Summon Animal]], except you summon a common creature that has the <<tag Giant>> trait and whose level is 5 or lower.
Heightening the spell increases the maximum level of creature you can summon.
{{SummonHeightenList}}
{{||SpellSummaryTable}}
You materialize a handheld musical instrument in your grasp.
The instrument is typical for its type, but it plays only for you.
The instrument vanishes when the spell ends.
If you cast summon instrument again, any instrument you previously summoned disappears.
''Heightened (5th)'' The instrument is instead a [[Virtuoso]] handheld instrument.
{{||SpellSummaryTable}}
You conjure a plant or fungus to fight for you.
This works like [[Summon Animal]], except you summon a common creature that has the <<tag Plant>> or <<tag Fungus>> trait and whose level is –1.
Heightening the spell increases the maximum level of creature you can summon.
{{SummonHeightenList}}
You can summon an elemental ally.
Once per day, you can cast [[Summon Elemental]] as a 5th-level primal innate spell, but the elemental summoned must be a water elemental.
A creature called by a conjuration spell or effect gains the summoned trait.
A summoned creature can’t summon other creatures, create things of value, or cast spells that require a cost.
__A summoned creature can't control any spawn or other creatures generated from it, and such creatures return to their unaltered state (usually a corpse in the case of spawn) once the summoned creature is gone. If it's unclear what this state would be, the GM decides.__
It has the [[Minion]] trait.
If it tries to cast a spell of equal or higher level than the spell that summoned it, the spell fails and the summon spell ends.
Otherwise, it uses the standard abilities for a creature of its kind.
It generally attacks your enemies to the best of its abilities.
If you can communicate with it, you can attempt to command it, but the GM determines the degree to which it follows your commands.
Immediately when you finish Casting the Spell, the summoned creature uses its 2 actions for that turn.
Summoned creatures can be banished by various spells and effects. They are automatically banished if reduced to 0 [[Hit Point]]s or if the spell that called them ends.
| !Heighten Level | !Summon Level |
| 1 | -1 |
| 2 | 1 |
| 3 | 2 |
| 4 | 3 |
| 5 | 5 |
| 6 | 7 |
| 7 | 9 |
| 8 | 11 |
| 9 | 13 |
| 10 | 15 |
{{||SpellSummaryTable}}
{{LOCGFeat}}
You fire a ray of burning sunlight from your weapon. You must be wielding a sword or spear to cast sun blade, and you perform this spell’s somatic component with the weapon.
Make a spell attack roll. The spell deals double damage on a critical hit. //As written, the spell also deals full damage on a non-critical miss!//
The ray deals 1d4 fire damage. If the target is evil, the ray deals an additional 1d4 good damage, and if the target is undead, the ray deals an additional 1d4 positive damage (both effects apply against creatures that are both evil and undead).
If you are in an area of bright natural sunlight, increase the die size of each damage die by one step (from d4 to d6).
''Heightened (+1)'' The damage increases by 1d4 fire, 1d4 good, and 1d4 positive (or 1d6 of each type of damage in bright natural sunlight).
{{||SpellSummaryTable}}
A powerful globe of searing sunlight explodes in the area, dealing 8d10 <<tag Fire>>damage to creatures in the area, plus 8d10 additional <<tag Positive>>damage to undead creatures.
Each creature in the area must attempt a //basic// [[Reflex]] save; //except, on a critical failure, a creature becomes permanently [[Blinded]] and takes full damage (instead of taking double damage).//
If the globe overlaps with an area of magical darkness, sunburst attempts to [[Counteract]] the darkness effect.
''Heightened (+1)'' The fire damage increases by 1d10, and the positive damage against undead increases by 1d10.
You can focus your superstition to break the magic of an item, in addition to destroying freestanding spells and those active on creatures.
When you [[Sunder a Spell|Sunder Spell]], you can instead attempt to [[Counteract]] either an unattended magic item or one of your target’s magic items.
If your counteract attempt succeeds, the item becomes a mundane item of its type for 10 minutes.
If you target an artifact, an intelligent item, or a particularly powerful item, your counteract attempt automatically fails.
You draw upon your superstitious fury to destroy a spell.
Make a [[Strike]] with a melee weapon or an unarmed attack against a creature, object, or a spell manifestation (such as the wall created by [[Wall of Fire]] or the guardian from [[Spiritual Guardian]]).
If your Strike hits, you can attempt to [[Counteract]] a single spell or magical effect on the target.
Your counteract level for this attempt is equal to half your level rounded up, and you use the result of your attack roll for the counteract check.
Whether or not you succeed at your [[Strike]], the target becomes temporarily immune to your Sunder Spell for 24 hours.
This 1-foot-long, gold-tipped rod glows after it’s struck on a hard surface.
For the next 6 hours, it sheds bright light in a 20-foot radius (and [[Dim Light]] to the next 40 feet).
When you draw upon your bonded item, you can leave a bit of energy within it for later use.
You can use [[Drain Bonded Item]] one additional time per day, but only to cast a spell 2 or more levels lower than your highest-level spell.
Your senses are peerless.
You gain a +2 circumstance bonus to [[Perception]] checks, and you gain [[Low-Light Vision]]. If you already have low-light vision, gain [[Darkvision]] instead.
Furthermore, when you target an enemy, you automatically succeed at the flat check if that enemy is [[Concealed]], [[Hidden]], or [[Undetected]].
The elven magic in your blood manifests as a force you can use to become more appealing or alluring.
You can cast 1st‑level [[Charm]] as an arcane innate spell once per day.
''Prerequisites'' [[Acute Scent]] or precise or imprecise scent.
Your scent is preternaturally sharp, and you can always rely on your sense of smell to help guide you when your vision is compromised.
When you target a [[Concealed]] or [[Hidden]] opponent while you are raging, you reduce the DC of the flat check to 3 for a concealed target or to 9 for a hidden one.
//As written, it is not necessary for the target to emit an odor.//
A deep distrust of magic drives you to forgo and counter the metaphysical nonsense of spellcasters. Whether you’re a member of a superstitious family or culture that distrusts magic, a warrior in constant battle against wizards and witches, a survivor of a magical accident that instilled an intense aversion in your mind and body, or a scion of a bloodline known for its magic resistance, your rage is inimical to magic. This makes you an excellent mage hunter but slow to trust practitioners of magical arts. Your extremely restrictive anathema grants you powers beyond those of other instincts.
''Anathema'' Willingly accepting the effects of magic spells (including from scrolls, wands, and the like), even from your allies, is anathema to your instinct. You can still drink potions and invest and activate most magic items you find, though items that cast spells are subject to the same restrictions as all other spells.
If an ally insists on using magic on you despite your unwillingness, and you have no reason to believe they will stop, continuing to travel with that ally of your own free will counts as willingly accepting their spells (as do similar circumstances) and thus is also anathema to your instinct.
''Superstitious Resilience (Instinct Ability)'': While raging, you gain a +2 status bonus to all saves against magic. Increase your damage from Rage from 2 to 4 against creatures that can cast spells. Once every 10 minutes, when you Rage, you regain Hit Points equal to the temporary Hit Points you gain from that Rage action. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
''Specialization Ability'': Increase the damage from Rage from 4 to 8 against creatures that can cast spells. If you have [[Greater Weapon Specialization]], instead increase the damage from Rage to 12 against creatures with spells and 8 against other creatures. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
''Raging Resistance'': Choose two associated magical traditions: arcane and occult, arcane and primal, divine and occult, or divine and primal. The resistance from your raging resistance class feature applies against all damage you take from spells cast with these two traditions of magic, regardless of the type of damage dealt by the spell. //You only gain this ability automatically if you are a [[Barbarian]], not if you just have [[Barbarian Dedication]].//
You have refined your palate and have a discerning sense of taste that can detect abnormalities in the flavor and texture of food and beverages.
When eating food or drinking a beverage, you automatically attempt to identify the ingredients, which might alert you to the presence of alterations or additives, such as poisons.
The GM rolls a secret [[Perception]] check using the poison’s level to determine the DC; on a success, you learn that the food or drink was poisoned, but not the specific poison used.
If you lick or taste something while Investigating or attempting to [[Recall Knowledge]] to identify something, if the taste would provide relevant additional information (at the GM’s discretion), you gain a +2 circumstance bonus to your check.
This action can only be taken by an [[Animal Companion|Animal Companions]] when ordered to using [[Command an Animal]].
Your animal companion supports you.
You gain the benefits listed in the companion type’s Support Benefit entry.
If the animal uses the Support action, the only other actions it can use on this turn are basic move actions to get into position to take advantage of the Support benefits; if it has already used any other action this turn, it can’t Support you.
//Implied by [[Animus Mine]].//
You can use a single action, which has the Concentrate trait, to suppress the effects of the mine for 1 round to allow someone to safely use a Mental effect on you.
Whether keeping your balance or scrambling up a tricky climb, your hairy, calloused feet easily find purchase. If you roll a success on an [[Acrobatics]] check to [[Balance]] or an [[Athletics]] check to [[Climb]], you get a critical success instead.
You’re not [[Flat-Footed]] when you attempt to Balance or Climb.
You know the secrets of moving in your favored terrain.
You gain a +2 circumstance bonus to skill checks to move within your favored terrain, such as [[Acrobatics]] checks to [[Balance]] on ice, [[Athletics]] checks to [[Swim]] in rough water, [[Acrobatics]] checks to [[Fly]] in windy conditions, and so forth.
{{LOCGFeat}}
Your interactions with other cultures on the surface have not only taught you about many other ancestries, but have also helped you realize the value of your own.
You gain the trained proficiency rank in the [[Society]] skill (or another skill of your choice if you were already trained in Society), and you gain the [[Additional Lore]] skill feat for the Lore corresponding to your culture.
By sinking gently beneath the waves, you obscure your presence and utilize the water as a barrier between you and land combatants.
While you are submerged just below the water’s surface, you have [[Cover]] from attacks made by creatures out of the water.
''Frequency'' once per day
''Trigger'' An ally you can see falls to 0 Hit Points.
When an ally you can see falls in battle, your fight or flight response triggers a surge in your deity’s might within you.
You instantly regain 1 Focus Point.
With a complex gesture, you focus the divine power of your spell to overcome enemies’ resistances.
If the next action you use is to [[Cast a Spell]], the spell ignores an amount of the target’s resistance equal to your level against all the following types of damage: chaotic, evil, good, lawful, negative, and positive.
This applies to all damage the spell deals, including persistent damage and damage caused by an ongoing effect of the spell, such as the positive energy within a field of life.
This doesn’t cause the spell to ignore immunities, only resistances.
You act before foes can react.
On the first round of combat, if you roll [[Deception]] or [[Stealth]] for initiative, creatures that haven’t acted are [[Flat-Footed]] to you.
You install one of your snares prepared for quick deployment in a space that’s occupied by an opponent.
It must be a snare that normally takes 1 minute or less to Craft.
The snare automatically triggers, but it takes a –2 circumstance penalty to any applicable save DC, as well as any attack rolls or other checks the snare attempts.
//The book lists the trait "manipulation". I have assumed they mean Manipulate.//
Whenever you make a Strike with an improvised weapon against a creature that hasn’t seen you make a Strike using an improvised weapon or that is otherwise ignorant of your skill with improvised weapons, the creature is [[Flat-Footed]] against you for that Strike.
You’ve learned that it pays for a Pathfinder to be able to cast spells without being noticed.
You gain the [[Conceal Spell]] wizard class feat, though it’s not a wizard feat for you.
You also gain a +2 circumstance bonus to [[Stealth]] checks to Conceal a Spell and to [[Deception]] checks to conceal verbal components.
''Prerequisites'' Trained in [[Survival]].
You can study details in the wilderness to determine the presence of nearby creatures. You can spend 10 minutes assessing the area around you to find out what creatures are nearby, based on nests, scat, and marks on vegetation.
Attempt a [[Survival]] check against a DC determined by the GM based on how obvious the signs are. On a success, you can attempt a [[Recall Knowledge]] check with a –2 penalty to learn more about the creatures just from these signs.
If you’re a master in Survival, you don’t take the penalty.
''Key Ability'' [[Wisdom]].
You are adept at living in the wilderness, foraging for food and building shelter, and with training you discover the secrets of tracking and hiding your trail.
{{||SkillActionList}}
{{||SkillFeatList}}
{{||SkillRitualList}}
{{LOCGFeat}}
You gain a +2 circumstance bonus to saving throws against unnatural weather events or environmental hazards occurring in blighted or otherwise unnaturally marred regions.
If you roll a success on a saving throw against such an effect, you get a critical success instead; if you roll a critical failure, you get a failure instead.
This does not apply to unnatural events created or directed by active effects, such as spells that create anomalous weather or hazardous areas.
''Trigger'' A foe takes a hostile action against you in combat.
Sometimes something intrudes upon your case unexpectedly, such as an ambush sent to bring your investigation to a close. You’ve learned how to compartmentalize your main lead and pursue a new one for your current predicament.
You [[Pursue a Lead]] against the triggering foe, setting aside but not ending one of your currently active leads, if you have two leads.
At the end of the combat encounter, you stop Pursuing the Lead against the triggering foe and return to the original lead, if you have one.
''Requirements'' You have at least one spell active with a sustained duration, and you are not [[Fatigued]].
Choose one spell with a sustained duration you have in effect. The duration of that spell continues until the end of your next turn.
Some spells might have slightly different or expanded effects if you sustain them.
Sustaining a Spell for more than 10 minutes (100 rounds) ends the spell and makes you [[Fatigued]] unless the spell lists a different maximum duration (such as “sustained up to 1 minute” or “sustained up to 1 hour”).
If your Sustain a Spell action is disrupted, the spell immediately ends.
You were born to one of the moroi, the most common vampires, and you share their supernatural fortitude and power of persuasion.
When you have the [[Drained]] condition, calculate the penalty to your [[Fortitude]] saves and your Hit Point reduction as though the condition value were 1 lower.
You are trained //in// [[Diplomacy]]. If you would automatically be trained in it, you instead become trained in a skill of your choice.
The monster attempts to swallow a creature of the listed size or smaller that it has grabbed in its jaws or mouth.
If a swallowed creature is of the maximum size listed, the monster can’t use Swallow Whole again. If the creature is smaller than the maximum, the monster can usually swallow more creatures; the GM determines the maximum.
The monster attempts an [[Athletics]] check opposed by the grabbed creature’s [[Reflex]] DC. If it succeeds, it swallows the creature. The monster’s mouth or jaws no longer grab a creature it has swallowed, so the monster is free to use them to [[Strike]] or [[Grab]] once again. The monster can’t attack creatures it has swallowed.
A swallowed creature is [[Grabbed]], is [[Slowed]] 1, and has to hold its breath or start
[[Suffocating]].
The swallowed creature takes the listed amount of damage when first swallowed and at the end of each of its turns while it’s swallowed.
If the victim [[Escape]]s this ability’s grabbed condition, it exits through the monster’s mouth. This frees any other creature grabbed in the monster’s mouth or jaws.
A swallowed creature can attack the monster that has swallowed it, but only with unarmed attacks or with weapons of light Bulk or less. The engulfing creature is [[Flat-Footed]] against the attack.
If the monster takes piercing or slashing damage equaling or exceeding the listed Rupture value from a single attack or spell, the engulfed creature cuts itself free.
A creature that gets free by either Escaping or cutting itself free can immediately breathe and exits the swallowing monster’s space.
If the monster dies, a swallowed creature can be freed by creatures adjacent to the corpse if they spend a combined total of 3 actions cutting the monster open with a weapon or unarmed attack that deals piercing or slashing damage.
{{||SpellSummaryTable}}
Ground in the area turns swampy and fetid.
The area is [[Difficult Terrain]].
The sludge at the bottom of the morass animates into diminutive sludge beasts that have a demonic appearance. These don’t function as normal creatures, but they swarm over creatures in the swamp and exude a noxious stench.
The swamp deals 1d6 <<tag Poison>>damage; creatures that end their turn in the area must attempt a basic [[Fortitude]] save.
You can increase the number of actions it takes to Cast the Spell. For each additional action, increase the burst’s radius by 5 feet.
''Heightened (+2)'' The damage increases by 1d6, and the initial radius increases by 5 feet.
{{||SpellSummaryTable}}
You discorporate into a swarm of Tiny creatures.
While in swarm form, you have the <<tag Swarm>> trait and you gain resistance 5 to slashing and piercing damage and weakness 5 to area and splash damage.
You can fit into spaces only a few inches wide, moving your constituent creatures through the gap.
You don’t gain the swarm mind ability, so you are still affected normally by <<tag Mental>> effects.
As a swarm, you can’t speak, cast spells, use <<tag Manipulate>> actions requiring your hands, activate your magic items, or make any of your [[Strike]]s with your normal body.
You can [[Dismiss]] the Spell.
''Heightened (+2)'' Increase your resistances and weaknesses each by 5.
This monster doesn’t have a single mind (typically because it’s a swarm of smaller creatures).
It is immune to [[Mental]] effects that target only a specific number of creatures.
It is still subject to mental effects that affect all creatures in an area.
{{||SpellSummaryTable}}
You extend your senses through a multitude of crawling and flying creatures.
You create a crawling swarm in your square.
You can hear through the swarm as if using your normal auditory senses.
The first time you [[Sustain the Spell|Sustain a Spell]] each round, you can move the swarm 10 feet along the ground in any direction.
The swarm has AC 15 and a +0 bonus to its saves. Any damage dealt to the swarm destroys it and ends the spell.
''Heightened (3rd)'' The swarm has the benefits of [[Spider Climb]].
''Heightened (5th)'' The swarm has a fly Speed of 10 feet. You can see through the swarm using your visual senses.
''Heightened (7th)'' The swarm gains a 10-foot status bonus to its Speeds.
!! Splats
<$list filter="[tag<currentTiddler>tag[Splat]]" />
!! Class Features
| !Level | !Features |
| 1 | [[Panache]], [[Precise Strike]] 2d6, [[Confident Finisher]] |
| 2 | |
| 3 | [[Great Fortitude]], [[Opportune Riposte]], [[Stylish Trick]], [[Vivacious Speed]] +10' |
| 4 | |
| 5 | [[Precise Strike]] 3d6, [[Weapon Expertise]] |
| 6 | |
| 7 | [[Evasion]], [[Stylish Trick]], [[Vivacious Speed]] +15', [[Weapon Specialization]] |
| 8 | |
| 9 | [[Exemplary Finisher]], [[Precise Strike]] 4d6, [[Swashbuckler Expertise]] |
| 10 | |
| 11 | [[Continuous Flair]], [[Vigilant Senses]], [[Vivacious Speed]] +20' |
| 12 | |
| 13 | [[Improved Evasion]], [[Light Armor Expertise]], [[Precise Strike]] 5d6, [[Weapon Mastery]] |
| 14 | |
| 15 | [[Greater Weapon Specialization]], [[Keen Flair]], [[Stylish Trick]], [[Vivacious Speed]] +25' |
| 16 | |
| 17 | [[Precise Strike]] 6d6, [[Resolve]] |
| 18 | |
| 19 | [[Eternal Confidence]], [[Light Armor Mastery]], [[Vivacious Speed]] +30' |
| 20 | |
!! Class Feats
{{||ClassFeatList}}
You perform swashbuckling techniques with exceptional flair, making them harder to resist.
Your proficiency rank for your swashbuckler class DC increases to expert.
This weapon makes wide sweeping or spinning attacks, making it easier to attack multiple enemies.
When you attack with this weapon, you gain a +1 circumstance bonus to your attack roll if you already attempted to attack a different target this turn using this weapon.
{{||SpellSummaryTable}}
With soothing song or tales, you lull the target into an enchanting dream.
When you cast the spell, the target falls [[Unconscious]] if it wasn’t already.
While unconscious, it experiences a dream of your choice. If it sleeps for at least 1 minute, it gains the benefit of the dream for the remainder of the spell’s duration.
* ''Dream of Insight'' +1 status bonus to [[Intelligence]]-based skill checks
* ''Dream of Glamour'' +1 status bonus to [[Charisma]]-based skill checks
* ''Dream of Voyaging'' +5-foot status bonus to Speed
If you Cast this Spell again, the effects of any previous sweet dream you cast end.
You move with the wind always at your back.
Your Speed increases by 5 feet.
''Special'' The Speed increase from this feat isn’t cumulative with any Speed increase from your ancestry feats (such as Nimble Elf).
''Trigger'' You critically hit a creature that is not on its home plane.
''Requirements'' You have a [[Banishment]] spell prepared.
The force of your blow sends your victim back to its home plane.
You expend a [[Banishment]] spell you have prepared, affecting the creature you critically hit without needing to cast the spell.
The creature can attempt to resist the spell as normal.
Affix to a shield.
''Trigger'' You take damage from a physical attack while you don't have the affixed shield raised.
This clear quartz cabochon attaches to the center of your shield.
When you activate {{FreeAction}} the cabochon, you use the [[Shield Block]] reaction even if you hadn’t raised the affixed shield (and even if you don’t normally have that reaction).
You size up your prey with only a glance.
You can use [[Hunt Prey]] as a free action if it’s your first action of your turn.
''Trigger'' Your turn ends and you have a status penalty to your Speed or are [[Immobilized]] or [[Slowed]].
You flow like water, avoiding all restraints.
End one status penalty to your speed, or end one immobilized or slowed condition affecting you.
''Prerequisites'' Master in [[Stealth]].
You can move your full Speed when you [[Sneak]].
You can use Swift Sneak while Burrowing, Climbing, Flying, or Swimming instead of Striding if you have the corresponding movement type.
//When you take the [[Avoid Notice]] exploration activity, you can move at full Speed rather than half.//
You swim faster than most iruxi.
Your swim Speed increases to 25 feet.
You propel yourself through water.
In most calm water, you succeed at the action without needing to attempt a check.
If you must breathe air and you’re submerged in water, you must hold your breath each round. If you fail to hold your breath, you begin to [[drown|Drowning]].
If the water you are swimming in is turbulent or otherwise dangerous, you might have to attempt an [[Athletics]] check to Swim.
If you end your turn in water and haven’t succeeded at a Swim action that turn, you sink 10 feet or get moved by the current, as determined by the GM. However, if your last action on your turn was to enter the water, you don’t sink or move with the current that turn.
{{||ActionSuccessTable}}
//[[Quick Swim]] can increase the distance you move on a success, or avoid any possibility of failure.//
//You can combine Swim with [[Tumble Through]].//
You make a wide, arcing swing.
Make a single melee [[Strike]] and compare the attack roll result to the ACs of up to two foes, each of whom must be within your melee reach and adjacent to the other.
Roll damage only once and apply it to each creature you hit.
A Swipe counts as two attacks for your [[Multiple Attack Penalty]].
If you’re using a weapon with the [[Sweep]] trait, its modifier applies to all your Swipe attacks.
//Implied by [[Threefold Aspect]].//
While the spell lasts, you can change the age to any of the three or to your natural age with a single action, which has the concentrate trait.
//Implied by [[Cozy Cabin]].//
The interior is lit with a small magical light that you can light or extinguish at will using a single action, which has the Concentrate trait.
''Implied by [[Verdant Metamorphosis]].''
You can change from a form that looks mostly like your old self into a tree or any other non creature plant as a single action, which has the Concentrate trait. This has the same effect as [[Tree Shape]], except you can turn into any kind of non-creature plant and your AC is 30.
{{LOCGFeat}}
''Prerequisites'' Strength, Dexterity, or Constitution 14.
Your Swords training taught you to never lose hold of your weapon.
You gain a +2 circumstance bonus to your [[Reflex]] DC when foes attempt to [[Disarm]] you.
If you have the [[Deft Cooperation]] feat and critically succeed on a check to [[Aid]] an ally’s attack roll or skill check, you gain a +2 circumstance bonus from Deft Cooperation (instead of a +1 bonus) the first time you attempt an attack roll or attempt a skill check where the bonus would apply.
<<archetypefeatlist "10 12 14" "[[Swordmaster]]">>
You are descended from air elementals or were born under the element’s influence.
You gain the <<tag Sylph>> trait, in addition to the traits from your ancestry.
You also gain [[Low-Light Vision]] or [[Darkvision]] if your ancestry already has low-light vision.
You can choose from <<tag Sylph>> feats and feats from your ancestry whenever you gain an ancestry feat.
{{||VHerFeatList}}
You call forth the blood of your foes to grant you vigor.
Once per day, you can cast [[Vampiric Exsanguination]] as a 7th-level divine innate spell //(this means it is heightened by one level)//.
You are able to weave countless performances together into a solo symphony.
You are no longer limited to a single composition each turn or a single composition at a time; when you use a new composition, all previous compositions’ effects continue for their remaining duration.
{{||SpellSummaryTable}}
Your symphony lifts listeners from their worldly concerns.
Attempt a [[Performance]] check to [[Counteract]] one of the following conditions affecting the target: [[Grabbed]], [[Immobilized]], [[Paralyzed]], [[Restrained]], [[Slowed]], or [[Stunned]].
If you fail, you can’t target that effect on the target for 1 day.
Use the condition’s source to determine the counteract DC (for example, the [[Escape]] DC for grabbed).
''Heightened (9th)'' You can target up to four creatures.
{{||SpellSummaryTable}}
You emit a pulsating mental blast that penetrates the minds of all enemies in the area.
Each creature in the area must attempt a [[Will]] save.
{{||SaveSuccessTable}}
You have come to see the overlap between two deities’ teachings.
Choose a second deity. You must meet their alignment requirements, and you are subject to their edicts and anathema.
If you are a [[Cloistered Cleric]], select one of that deity’s domains, gaining the benefits of the [[Expanded Domain Initiate]] feat with that domain.
If you are a [[Warpriest]], you gain the favored weapon of that deity as a second favored weapon, and it gains the benefits of feats and abilities you have that affect your deity’s favored weapon, such as [[Deadly Simplicity]].
If you have a different doctrine than cloistered cleric or warpriest, either apply whichever of the above options is most appropriate for your doctrine, or, at the GM’s discretion, add a benefit from the second deity more closely tied to your doctrine.
You combine your synergy and spells into a fantastic web of magic, allowing you to cast two spells at once.
If the next action you use is to [[Cast a Spell]] from one of your halcyon spell slots, after that spell resolves, you can Cast another Spell as a free action.
This spell must be cast from one of your halcyon spell slots and be a spell that would normally take two actions to cast.
{{||SpellSummaryTable}}
The target’s senses are suddenly rewired in unexpected ways, causing them to process noises as bursts of color, smells as sounds, and so on.
This has three effects, and the target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
* Due to the distraction, the target must succeed at a DC 5 flat check each time it uses a <<tag Concentrate>>action, or the action fails and is wasted.
* The target’s difficulty processing visual input makes all creatures and objects [[Concealed]] from it.
* The creature has trouble moving, making it [[Clumsy]] 3 and giving it a –10-foot status penalty to its Speeds.
''Heightened (9th)'' You can target up to five creatures.
Your remarkable breath control and concise instructions allow you to coordinate your allies more effectively.
When you grant allies the quickened condition using [[Cadence Call]], they can use the extra action to either [[Stride]] or [[Strike]], and they aren’t [[Slowed]] 1 on their following turn if they use the extra action.
You learn new debilitations that grant you tactical advantages against your foes.
Add the following debilitations to the list you can choose from when you use [[Debilitating Strike]].
* ''Debilitation'' The target can’t use [[Reaction]]s.
* ''Debilitation'' The target can’t flank or contribute to allies’ [[Flanking]].
You gain imprecise [[Wavesense]] with a range of 30 feet, allowing you to sense motion in the water around you.
You also gain a +1 circumstance bonus to [[Survival]] checks to [[Sense Direction]] in aquatic environments.
You excel at using your tail as a weapon to upend your foes.
Attempt a single [[Athletics]] check to [[Trip]] up to two adjacent creatures. If you roll a success against a target, you get a critical success against that target instead.
''Frequency'' once per day
''Requirements'' You are wielding a piercing or slashing weapon.
You apply your tail’s venom to a piercing or slashing weapon. If your next Strike with that weapon before the end of your next turn hits and deals damage, you deal persistent poison damage equal to your level to the target.
By birth or through training, your tail is strong enough to make for a powerful melee weapon.
You gain a tail unarmed attack that deals 1d6 bludgeoning damage and has the [[Sweep]] trait.
You gain a +2 circumstance bonus to [[Athletics]] checks to [[Climb]], you gain [[Combat Climber]] as a bonus feat, and you reduce the number of free hands required to [[Climb]] or [[Trip]] by one.
''Requirements:'' You are benefiting from cover, are near a feature that allows you to take cover, or are [[Prone]].
You press yourself against a wall or duck behind an obstacle to take better advantage of [[Cover]].
If you would have standard cover, you instead gain greater cover, which provides a +4 circumstance bonus to [[AC]]; to [[Reflex]] saves against area effects; and to [[Stealth]] checks to [[Hide]], [[Sneak]], or otherwise avoid detection.
Otherwise, you gain the benefits of standard cover (a +2 circumstance bonus instead).
This lasts until you move from your current space, use an attack action, become [[Unconscious]], or end this effect as a [[Free]] action.
{{||SpellSummaryTable}}
When someone has overindulged, you can hasten them past the worst of their affliction or intensify their misery.
This spell attempts to progress a [[Disease]] affliction, a [[Poison]] affliction, or persistent poison damage affecting the target. If the target is affected by more than one of these, you can choose from among those you are aware of; otherwise the GM chooses randomly.
An unwilling target can attempt a [[Will]] save to negate take its course.
The effect of this spell depends on whether you’re attempting to end an affliction or persistent poison damage, and whether you are attempting to help or hinder the target’s recovery.
* ''Affliction'' The target immediately attempts its next saving throw against the affliction. You can grant the creature your choice of a +2 status bonus or a –2 status penalty to its saving throw against the affliction.
* ''Persistent Poison'' You can cause the target take the persistent poison damage immediately when you Cast this Spell (in addition to taking it at the end of its next turn). Whether or not you do so, the target attempts an additional flat check against the persistent poison damage. You can set the DC of that flat check to 5 or 20 instead of the normal DC.
''Heightened (7th)'' You can attempt to progress any number of the target’s eligible afflictions and persistent poison damage.
You’ve mastered combat practices that let you get up close and bring down perpetrators alive.
You can use your [[Intelligence]] modifier on attack rolls when you [[Devise a Stratagem]] if you’re using a weapon of the [[Club]] group in one hand (like a [[Club]], [[Staff]], or [[Sap]]), in addition to the usual weapons, and those [[Strike]]s qualify for your [[Strategic Strike]].
Additionally, you can make any of your Strikes nonlethal without taking the normal –2 penalty.
You are trained in the use of talismans and similar magical paraphernalia. This training might have occurred in a formal classroom or been an agglomeration of folk magic picked up over time.
You can craft talismans and know the formulas for all common talismans in the Core Rulebook of your level or lower.
You remember talisman formulas and don’t need a formula book for them.
Additionally, you carry a collection of magical baubles you can turn into temporary talismans.
Each day during your daily preparations, you can make two talismans with an item level no higher than half your level.
You must know each talisman’s formula.
A talisman created this way is a temporary item and loses its magic the next time you make your daily preparations if you haven’t already used it.
Finally, when you [[Affix a Talisman]], you can (in any combination) affix or remove up to four talismans in the 10-minute span.
<<archetypefeatlist "4 8 14" "[[Talisman Dabbler]]">>
You have forgotten more about talismans than lesser warriors have ever known.
Normally, affixing more than one talisman to an item causes the talismans to be suppressed, but when you [[Affix a Talisman]], you can specially treat one item you’re working on, allowing it to have two active talismans at once.
This special treatment ends if you use Affix a Talisman to treat a new item for this ability.
{{||SpellSummaryTable}}
You grant the target corpse a semblance of life, which it uses to speak the answers to three questions posed to it.
This spell calls on the physical body’s latent memories rather than summoning back the deceased’s spirit, so the corpse must be mostly intact for the spell to function.
The more damage the corpse has taken, the more inaccurate or patchwork its answers are, and it must have a throat and mouth to speak at all.
If anyone has previously cast this spell on the corpse in the last week, the spell automatically fails.
The corpse can attempt a [[Will]] save to resist answering the questions using the statistics of the original creature at its time of death, with the following effects:
{{||SaveSuccessTable}}
You gain a talons unarmed attack that deals 1d4 slashing damage.
Your talons are in the brawling group and have the [[Agile]], [[Finesse]], [[Unarmed]], and [[Versatile]] piercing traits.
''Trigger'' You critically hit an adjacent enemy.
Your incredibly vicious Strike pulls you right in close, giving you the opportunity to grab your foe.
Attempt to [[Grapple]] the triggering enemy.
''Requirements'' You are in [[Tangled Forest Stance]].
You reposition foes with raking attacks.
Make a lashing branch [[Strike]].
If you hit and deal damage, you force the target to move 5 feet into a space within your reach.
''Requirements'' You are unarmored.
You extend your arms like gnarled branches to interfere with your foes’ movements.
You can make lashing branch unarmed attacks. These deal 1d8 slashing damage; are in the brawling group; and have the [[Agile]], [[Finesse]], [[Nonlethal]], and [[Unarmed]] traits.
While you’re in Tangled Forest Stance and can act, every enemy in your reach that tries to move away from you must succeed at a [[Reflex]] save, [[Acrobatics]] check, or [[Athletics]] check against your class DC or be [[Immobilized]] for that action. If you prefer, you can allow the enemy to move.
{{||SpellSummaryTable}}
A vine covered in sticky sap appears from thin air, flicking from your hand and lashing itself to the target.
Attempt a spell attack against the target.
{{||ActionSuccessTable}}
''Heightened (2nd)'' The effects last for 2 rounds.
''Heightened (4th)'' The effects last for 1 minute.
A tanglefoot bag is filled with sticky substances.
When you hit a creature with a tanglefoot bag, that creature takes a status penalty to its Speeds for 1 minute. Many types of tanglefoot bag also grant an item bonus on attack rolls.
On a critical hit, a creature in contact with a solid surface becomes stuck to the surface and [[Immobilized]] for 1 round, and a creature flying via wings has its wings tangled, causing it to fall safely to the ground and become unable to [[Fly]] again for 1 round.
Tanglefoot bags are not effective when used on a creature that is in water.
The target can end any effects by [[Escaping|Escape]] or spending a total of 3 [[Interact]] actions to carefully remove the sticky substances. These Interact actions don’t have to be consecutive, and other creatures can provide the actions as well.
| !Type | !Level | !Price | !Penalty to Speed | !Escape DC | !Item bonus to attack |
| Lesser | 1 | 30 | -10' | 17 | None |
| Moderate | 3 | 100 | -15' | 19 | +1 |
| Greater | 11 | 2500 | -15' | 28 | +2 |
| Major | 17 | 25000 | -20' | 37 | +3 |
{{||SpellSummaryTable}}
Dense, twitching creepers sprout from every surface and fill any bodies of water in the area.
Any creature moving on the land, or Climbing or Swimming within the creepers, takes a –10- foot circumstance penalty to its Speeds while in the area.
Once per round, you can make a vine lash out from any square within the expanse of creepers by using a single action, which has the <<tag Concentrate>>trait. This vine has a 15-foot reach and makes a melee unarmed attack using your spell attack modifier.
If the attack succeeds, the vine pulls the target into the creepers and makes it [[Immobilized]] for 1 round or until the creature [[Escapes]] (against your spell DC), whichever comes first.
''Trigger'' An ally succeeds at a ranged Strike against an opponent within your weapon’s first range increment.
''Requirements'' You have a ranged or thrown weapon in hand.
You capitalize on your ally’s attack to create a coordinated barrage.
Make a ranged [[Strike]] with a –2 penalty against the opponent targeted by the triggering attack.
This Strike doesn’t count toward your [[Multiple Attack Penalty]], and your multiple attack penalty doesn’t apply to this Strike.
If this Strike is successful, combine the damage from the attack with the damage from your ally’s attack for the purpose of resistances and weaknesses.
You carefully track your prey’s position and defenses, allowing you to follow up around obstacles that block your shot.
Make a ranged weapon [[Strike]] against your hunted prey.
You ignore the target’s [[Concealed]] condition and all cover.
''Prerequisites'' Cel Rau, Straveika, Svetocher, or another lineage from a vampire with
the Drink Blood ability
You retain not only your vampiric parent’s taste for blood but their ability to gain vitality from it.
You drink fresh blood from a living humanoid creature, gaining temporary Hit Points equal to the target’s level that last for 10 minutes.
The target must succeed at a [[Fortitude]] save against the higher of your class DC or spell DC or become [[Drained]] 1.
Regardless of the outcome of this save, the target is temporarily immune to your Taste Blood for 1 day; further uses of this ability against the target don’t increase the drained condition or grant you more temporary Hit Points.
To drink a creature’s blood, either your last action must have been a fangs [[Strike]] that damaged the target, or the target must be [[Restrained]] or [[Unconscious]] and your last action must have been a Strike that dealt piercing or slashing damage to them. //(Just being a Dhampir doesn't give you fangs unless you take the [[Fangs]] feat.)//
If the target is willing, they don’t need to be restrained or unconscious for the latter.
Draining the life force from an unwilling humanoid creature is a greater violation than just drinking their blood. Taste Blood has the <<tag Evil>> trait unless the target is willing or is an active foe in combat.
Tears of death are among the most powerful of alchemical poisons, distilled from extracts of five other deadly poisons in just the right ratios.
| !Saving Throw |DC 46 [[Fortitude]] |
| !Onset |1 minute |
| !Maximum Duration |10 minutes |
| !Stage 1 |18d6 poison damage and [[Paralyzed]] (1 round) |
| !Stage 2 |25d6 poison damage and [[Paralyzed]] (1 minute) |
| !Stage 3 |30d6 poison damage and [[Paralyzed]] (1 minute) |
When you roll a success on a saving throw against an <<tag Emotion>> effect, you get a critical success instead.
{{||SpellSummaryTable}}
You move the target up to 20 feet, potentially suspending it in midair.
When you [[Sustain the Spell|Sustain a Spell]], you can do so again, or you can choose a different eligible target to move.
{{||SpellSummaryTable}}
With a rush of telekinetic power, you move a foe or something they carry.
You can attempt to [[Disarm]], [[Shove]], or [[Trip]] the target using a spell attack roll instead of an [[Athletics]] check.
{{||SpellSummaryTable}}
You hurl a loose, unattended object that is within range and that has 1 Bulk or less at the target.
Make a __spell attack roll__ against the target.
If you hit, you deal bludgeoning, piercing, or slashing damage—as appropriate for the object you hurled—equal to 1d6 plus your spellcasting ability modifier.
No specific traits or magic properties of the hurled item affect the attack or the damage.
//You deal double damage on a critical.//
''Heightened (+1)'' The damage increases by 1d6.
{{||SpellSummaryTable}}
The targets can communicate telepathically with any or all of the other targets from any point on the same planet.
{{||SpellSummaryTable}}
You send the target a message of 25 words or fewer, and it can respond immediately with its own message of 25 words or fewer.
Your message is insidious and has the effect of [[Suggestion]], with the message substituting for the spoken suggestion.
On a successful save, the target is temporarily immune for 1 day, and on a critical success, the
target is temporarily immune for 1 month.
You can target a creature only if you have previously been in telepathic contact with it before, such as via the [[Telepathy]] spell.
A creature with telepathy can communicate mentally with any creatures within the listed radius, as long as they share a language.
This doesn’t give any special access to their thoughts, and communicates no more information than normal speech would.
{{||SpellSummaryTable}}
You can communicate telepathically with creatures within 30 feet.
Once you establish a connection by communicating with a creature, the communication is two-way.
You can communicate only with creatures that share a language with you.
''Heightened (6th)'' Telepathy loses the linguistic trait. You can communicate telepathically with creatures using shared mental imagery even if you don’t share a language.
{{||SpellSummaryTable}}
You and the targets are instantly transported to any location within range, as long as you can identify the location precisely both by its position relative to your starting position and by its appearance (or other identifying features).
Incorrect knowledge of the location’s appearance usually causes the spell to fail, but it could instead lead to teleporting to an unwanted location or some other unusual mishap determined by the GM.
Teleport is not precise over great distances. The targets appear at a distance from the intended destination equal to roughly 1 percent of the total distance traveled, in a direction determined by the GM.
For short journeys, this lack of precision is irrelevant, but for long distances this could be
up to 1 mile.
''Heightened (7th)'' You and the other targets can travel to any location within 1,000 miles.
''Heightened (8th)'' You and the other targets can travel to any location on the same planet. If you travel more than 1,000 miles, you arrive only 10 miles off target.
''Heightened (9th)'' You and the other targets can travel to any location on another planet within the same solar system. Assuming you have accurate knowledge of the location’s position and appearance, you arrive on the new planet 100 miles off target.
''Heightened (10th)'' As the 9th-level version, but you and the other targets can travel to any planet within the same galaxy.
{{||RitualSummaryTable}}
''Cost'' rare incense, precious metals, and purified chalk worth 500 gp;
You create a 10-foot-diameter circle on the ground, which acts as a portal to a destination determined at the time of the ritual.
You designate the destination of the teleportation as part of the ritual. This destination can’t be changed. The destination must be a location within 1,000 miles and be on the same plane as the teleportation circle. You must be able to identify the location precisely both by its position relative to the location where you create the teleportation circle and by the destination’s appearance (or other identifying features). The destination must also be a 10-foot-diameter circle that doesn’t overlap with any solid structures, but it can be a place that is harmful or dangerous.
A secondary caster attempting a [[Survival]] check for this ritual can be located at the exact site of the destination, instead of with you at the point of origin. If the secondary succeeds at their check at the destination and you roll a success, the ritual is a critical success instead.
While the circle is active, any creature that moves to be fully within the circle is instantly teleported to the destination. A creature that is unwilling to be teleported can attempt a [[Will]] save to resist the effect. If it remains in the circle, the creature must attempt this save again at the end of each of its turns.
The teleportation circle normally goes only in one direction, though you can double the Cost to make the teleportation work in both directions.
''Heightened (9th)'' The cost increases to 2,000 gp, the duration increases to 1 month, and the destination can be anywhere on the same planet.
''Heightened (10th)'' The cost increases to 10,000 gp, the duration is unlimited, and the destination can be anywhere on the same planet.
{{||ActionSuccessTable}}
You channel strength from the earth beneath your feet to pummel your enemies.
When making a melee [[Strike]] against a target who is standing on the same earth or stone surface as you are, you gain a circumstance bonus to the damage roll equal to the number of weapon damage dice.
| !Category | !Temperature | !Fatigue | !Damage |
| Incredible cold | –80º F or colder | 2 hours | Moderate (4-6d6) cold every minute |
| Extreme cold | –79º F to –20º F | 4 hours | Minor (1-2d6) cold every 10 minutes |
| Severe cold | –21º F to 12º F | 4 hours | Minor (1-2d6) cold every hour |
| Mild cold | 13º F to 32º F | 4 hours | None |
| Normal | 33º F to 94º F | 8 hours | None |
| Mild heat | 95º F* to 104º F* | 4 hours | None |
| Severe heat | 105º F* to 114º F | 4 hours | Minor (1-2d6) fire every hour |
| Extreme heat | 115º F to 139º F | 4 hours | Minor (1-2d6) fire every 10 minutes |
| Incredible heat | 140º F or warmer | 2 hours | Moderate (4-6d6) fire every minute |
Adjust temperatures down by 15º in areas of high humidity.
{{||MysterySummary}}
You can see perfectly through wind and water, and you send electric charges through both air and water. You never take penalties to Perception from wind, rain, fog, or other precipitation, or from looking through water or being underwater, and such conditions don’t cause anything to be concealed from you.
When you deal physical damage with a non-cantrip <<tag Air>> or <<tag Water>> spell, you deal an additional 1 electricity damage per spell level.
!!! Curse of the Perpetual Storm
''Minor Curse'' An aura of a whirling storm whips up in a 5-foot emanation around you and in your space. The aura puts out small non-magical fires 1 round after they’re lit or brought
into your aura. Electrical energy builds up within your storm, turning you into a lightning rod; you gain weakness 2 to electricity, and electricity spells or effects that have additional effects for a creature wearing or holding metal treat you as though you were wearing metal.
''Moderate Curse'' Your minor curse’s aura expands to a 10-foot emanation and carries rain on the winds. The whirling winds impose a –2 circumstance penalty on ranged attack rolls using physical ammunition that target you or originate from you. Your weakness to electricity increases to 5 or half your level, whichever is greater, but torrential rain grants you an equal amount of fire resistance.
''Major Curse'' Your minor curse’s aura expands to a 15-foot emanation and grows stronger. High winds blowing outward in the aura impede creatures’ progress. The aura is [[Difficult Terrain]] for Large and smaller creatures on the ground, and for Huge or smaller flying creatures. You aren’t affected by this difficult terrain. The electricity arcing through you becomes dangerous. Any creature that touches you, including with a touch spell or a melee unarmed attack, takes 1d6 electricity damage.
{{||SpellSummaryTable}}
Your body becomes fluid to better suit your surroundings.
When you Cast this Spell, choose whether to become air, water, or mist. The spell gains the <<tag Air>> trait if you choose air or mist, and the <<tag Water>> trait if you choose water or mist.
You become amorphous, as does your armor. You lose any item bonus to AC and use your proficiency bonus for unarmored defense to determine your AC.
You also gain resistance 10 to physical damage and become immune to precision damage.
You can slip through tiny cracks and don’t need to breathe.
You can’t cast spells, activate items, or use actions that have the <<tag Attack>> or <<tag Manipulate>> trait. //(Other than the ones that are given to you by your form.)//
You also gain the following effects based on your form:
* ''Air'' You gain a fly Speed of 20 feet and become [[Invisible]] while you are in the air. You can create the effects of a [[Gust of Wind]] from your space as a 2-action activity, which has the <<tag Manipulate>> trait.
* ''Mist'' You gain a fly Speed of 20 feet, and it becomes hard to see through you. Any creature on one side of your space who is targeted by a creature on the opposite side is [[Concealed]] to the targeting creature.
* ''Water'' You gain a swim Speed of 20 feet and become [[Invisible]] while you are in the water. You can electrically charge yourself by taking a single action, which has the <<tag Manipulate>> trait. If you do, you are no longer invisible in the water due to electricity indicating your location, but any creature that makes a melee attack against you takes 1d6 <<tag Electricity>> damage; if it touches you, this is cumulative with the damage from your major curse.
''Heightened (+2)'' Increase the resistance by 5 and the electricity damage from the charged water form by 1.
//Implied by [[Tempest Form]].//
You can create the effects of a [[Gust of Wind]] from your space as a 2-action activity, which has the Manipulate trait.
{{||SpellSummaryTable}}
You surround a foe in a swirling storm of violent winds, roiling clouds, and crackling lightning.
The storm deals 1d12 <<tag Electricity>>damage. The target must attempt a basic [[Reflex]] save. On a failure, the target also is [[Clumsy]] 2 for 1 round and takes 1 persistent electricity damage.
''Heightened (+1)'' The initial damage increases by 1d12, and the persistent electricity damage on a failure increases by 1.
{{||SpellSummaryTable}}
Your touch calls forth a churning mass of icy water that clings to your target, dealing 1d4 <<tag Bludgeoning>> damage and 1d4 <<tag Cold>> damage //with a basic [[Fortitude]] save.//
//If the target succeeds, but not critically, on their save they take a -5 foot circumstance penalty to their Speeds until the end of your next turn.//
//If they fail (or critically fail) the penalty is -10 feet.//
''Heightened (+1)'' The bludgeoning and cold damage each increase by 1d4.
If the next action you use is to [[Cast a Spell]] from your spell slots that damages other creatures, you can bend some of that spell’s offensive energy, protecting allies in the area and boosting your own defenses against certain foes.
Select any number of targets of the spell and reduce the spell’s damage to those targets by an amount equal to the spell’s level.
Until your next turn, when one of those targets damages you, that damage is reduced by twice the spell’s level.
''Trigger'' You or an ally within 30 feet takes damage.
You transform unrealized spell energy into a protective shield.
If you’re a spontaneous spellcaster, expend a spell slot; if you’re a prepared spellcaster, expend a spell prepared in a spell slot.
Reduce the triggering damage by an amount equal to four times the level of the expended slot or spell.
During your daily preparations, you can create a batch of two temporary oils or potions using a formula you know.
These items follow the normal rules to [[Craft]] them, except for the time they take, with some additional restrictions.
They must both be the same type of oil or potion, and their level must be 6 or more levels lower than your level.
Any items you create this way become inert bottles of liquid the next time you make your daily preparations, and any remaining effects of the temporary items end.
A temporary oil or potion has no value.
If you have master proficiency in your tradition’s spell DCs, you can create a batch of three temporary oils or potions during your daily preparations, and if you have legendary proficiency, you can create a batch of four.
{{||SpellSummaryTable}}
You conjure a temporary simple tool, such as a shovel or rope into your hands.
It lasts until it is used for a single activity or for 1 minute, whichever comes first, after which it disappears.
The tool is obviously temporarily conjured, and thus can’t be sold or passed off as a genuine item.
//The book lists no components for this spell, but it is unlikely to be used in encounter mode.//
{{||SpellSummaryTable}}
''Trigger'' You or an ally within range attempts a saving throw.
You twist the forces of fate to make a moment dire or uneventful, with no in-between.
The target gains a +1 status bonus to the triggering saving throw.
If the saving throw’s result is a success, it becomes a critical success.
If it’s a failure, it becomes a critical failure, and the critical failure can’t be reduced by abilities that usually reduce critical failure, such as improved evasion.
If the triggering ability did not have both a critical success and critical failure condition, tempt fate fails, but you don’t expend the Focus Point for Casting this Spell.
''Heightened (8th)'' The bonus on the saving throw is +2.
When your character would die, you can attempt a DC 17 flat check.
On a success, you’re instead reduced to 0 HP and a [[Dying]] value 1 less than would normally kill you (typically dying 3).
This doesn’t change the result for any other creature affected.
''Frequency'' once per minute
''Trigger'' You apply an effect from your blood magic that lasts for 1 round.
The triggering blood magic effect lasts for 1 minute instead of 1 round.
Your victims tend to expire long before your poisons, since the latter have been specifically formulated to last longer.
The maximum duration of any poison you create increases by an amount equal to the poison’s stage 1 interval, to a maximum of twice the poison’s maximum duration.
You’ve learned to bind some of your feathers together into a fan to focus your ancestral magic.
You gain a tengu feather fan: a magic item of light Bulk with a level equal to your level and the <<tag Evocation>> and <<tag Primal>> traits. You (and only you) can use the tengu feather fan to cast tengu magic. If your fan is lost or destroyed, you can create a replacement during your daily preparations; if you do so, your previous fan falls apart into mundane feathers.
Further feats might grant you additional activations of your tengu feather fan, but you can never have more than three activations per day, no matter how many such feats you have.
The DC for spells you cast with your tengu feather fan is your class DC or spell DC, whichever is higher.
You can cast the 1st-level [[Gust of Wind]] spell by activating your tengu feather fan.
''Activate'' [[Interact]]; ''Frequency'' once per day; ''Effect'' You cast one of the spells contained in your tengu feather fan. Activating the fan takes the spell’s normal number of actions. You can also Activate the fan to cast a cantrip you’ve gained from a heritage or ancestry feat; this activation doesn’t count against the fan’s uses per day.
You learned skills for surviving in the place where your people were dispersed.
You gain the trained proficiency rank in [[Society]] and [[Survival]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Tengu [[Lore]].
Study has made you an expert with tengu weapons.
Whenever you gain a class feature that grants you expert or greater proficiency in a given weapon or weapons, you also gain that proficiency for the weapons from your Tengu Weapon Familiarity.
You’ve trained with a blade and other tengu weapons ever since you hatched.
You gain access to [[Khakkara]]s.
Additionally, choose two weapons from the sword group. You can choose from among all common martial swords, plus the [[Katana]], [[Temple Sword]], and [[Wakizashi]].
For the purpose of determining your proficiency, that weapon is a simple weapon, and if the weapon isn’t common, you gain access to it.
If you are trained in all martial weapons, you add common advanced swords to the swords you can choose from.
You also gain access to all uncommon tengu weapons. For the purpose of determining your proficiency, martial tengu weapons are simple weapons, and advanced tengu weapons are martial weapons.
You’ve learned techniques for using blades and other tengu weapons.
Whenever you critically hit using one of the weapons from your [[Tengu Weapon Familiarity]], you apply the weapon’s [[Critical Specialization Effect]].
{{||SpellSummaryTable}}
Your arms turn into long, pliable tentacles, increasing your reach when you’re delivering touch range spells and making unarmed [[Strike]]s with your arms (such as fist and claw Strikes) to 10 feet.
This doesn’t change the reach of your melee weapon attacks.
During the duration, whenever you Cast a Spell, you can add an additional action to that spell’s casting to temporarily extend your reach to 20 feet to deliver that spell.
''Heightened (+2)'' When you add an additional action to a spell to temporarily extend your reach, your reach increases by an additional 10 feet to deliver that spell.
{{||RitualSummaryTable}}
''Cost'' a bodily sample from the target, and valuables belonging to the target worth a total value of 100 gp * the spell level * the target's level.
Mighty drow noble houses, including House Shraen, use this ritual to stamp out fledgling noble houses before they rise to power. At the ritual’s completion, you place a contagious wasting disease upon the target creature with the intention of ending their familial bloodline.
The ritual is easiest to cast on a subdued target, typically a low-ranking member of the targeted family bloodline who is kidnapped and has their memory wiped. If the target is conscious when the ritual is cast, the target attempts a [[Fortitude]] save against the ritual’s DC; on a success, the ritual fails. Otherwise, the target is automatically affected by the dying bloodline disease.
''Dying Bloodline'' <<tag Curse>> <<tag Disease>> Failing or critically failing this disease’s [[Fortitude]] save causes the disease to progress to the next stage as normal; however, succeeding or critically succeeding at the save has no effect. The disease can be removed only by first successfully [[Counteract]]ing the curse and then counteracting the disease; Level equal to twice the ritual’s level.
''Stage 1'' carrier with no effect (1 month); ''Stage 2'' [[Fatigued]] (1 week); ''Stage 3'' fatigued and [[Drained]] 1 (1 day); ''Stage 4'' fatigued and drained 3 (1 day); ''Stage 5'' death.
Every member of an infected creature’s immediate family (blood relationship or parent or child) that comes into physical contact with that infected creature must attempt a [[Fortitude]] save or contract the disease.
{{||ActionSuccessTable}}
You capture transformative fragments of magic and slam them into the ground, creating a shock wave that alters your surroundings.
If your next action is to Cast a non-cantrip transmutation Spell, either each space adjacent to you becomes [[Difficult Terrain]], or each space adjacent to you is no longer difficult terrain.
This doesn’t have any effect on greater difficult terrain and doesn’t remove the damaging effects of Hazardous Terrain.
You can take advantage of the terrain to bypass foes’ defenses.
Non-lizardfolk creatures in [[Difficult Terrain]] are [[Flat-Footed]] to you.
If you have a swim Speed, non-lizardfolk creatures that are in water and lack a swim Speed are also flat-footed to you.
''Prerequisites'' Trained in [[Survival]].
Your experience in navigating a certain type of terrain makes you supremely confident while doing so.
You gain a +1 circumstance bonus to Survival checks in one of the following types of terrain, chosen when you select this feat: aquatic, arctic, desert, forest, mountain, plains, sky, swamp,
or underground.
You can select this feat more than once, choosing a different type of terrain each time.
You adapt to your surroundings in any natural terrain.
You can spend 1 hour practicing in your current terrain in order to make it your favored terrain, replacing your current favored terrain temporarily.
If you spend a full day out of the new favored terrain, your favored terrain reverts back to your original choice when you took the Favored Terrain feat.
You gain the [[Terrain Stalker]] skill feat twice, choosing a different terrain each time.
If you [[Avoid Notice]] while exploring and any allies use [[Follow the Expert]] to follow you as you do so, you can choose one of those allies to gain the benefit of any one [[Terrain Stalker]] feat you have.
''Prerequisites'' Trained in [[Stealth]].
Select one type of difficult terrain from the following list: rubble, snow, or underbrush.
While [[Undetected]] by all non-allies in that type of terrain, you can [[Sneak]] without attempting a Stealth check as long as you move no more than 5 feet and do not move within 10 feet of an enemy at any point during your movement.
This also allows you to automatically approach creatures to within 15 feet while [[Avoiding Notice|Avoid Notice]] during exploration as long as they aren’t actively [[Search]]ing or on guard.
You can select this feat multiple times. Each time, choose a different type of terrain.
{{||SpellSummaryTable}}
You mystically transpose your current location with another.
While in a wilderness environment, you transport yourself and items you’re holding to a clear space you can see within range.
If you have [[Favored Terrain]] and both your starting and ending position are in your favored terrain, the range increases to 180 feet.
If you have an animal companion and it is adjacent to you, you can transport it along with you to an adjacent open space, but if this spell would bring any other creature with you, even in an extradimensional container, the spell is lost.
''Prerequisites'' Master in [[Intimidation]].
When you critically succeed at the [[Demoralize]] action, if the target’s level is lower than yours, the target is [[Fleeing]] for 1 round.
You unleash a terrifying howl.
Attempt //[[Intimidation]]// checks to [[Demoralize]] each __enemy__ within 30 feet.
Regardless of the results of your checks, each __enemy__ is then temporarily immune to Terrifying Howl for 1 minute.
The spells of those you have [[Demoralize]]d are less effective on you.
If you succeed in Demoralizing a creature, for the next 24 hours you gain a +1 circumstance bonus to saving throws against that creature’s spells.
{{||SpellSummaryTable}}
You use magical chains, vines, or other tethers to bind your target to you.
The creature can still try to [[Escape]], and it or others can break the tethers by attacking them (the tethers have AC 15 and 10 Hit Points).
You must stay within 30 feet of the target while it is tethered; moving more than 30 feet away from your target ends the spell.
The target must attempt a [[Reflex]] save.
//The original Duration text implies that you can [[Dismiss]] the spell.//
''Heightened (+1)'' The tethers’ AC increases by 3 and their Hit Points increase by 10.
{{||SaveSuccessTable}}
Your [[Elemental Assault]] cycles through all four elements.
When you use Elemental Assault, instead of choosing a single element, you can choose an element from the list when using the action, and then choose a different element at the beginning of each of your next 3 turns without spending an action.
Once you have chosen an element, you can’t choose it again during this Elemental Assault, meaning you must select all four elements over the course of 4 turns.
Each time you choose an element, until the beginning of your next turn, your Strikes deal an additional 1d6 damage of the indicated type and have the trait corresponding to that element.
You gain the [[Underwater Marauder]] skill feat, and your piercing ranged attacks don’t have their range increments halved when fighting underwater targets.
When you enter a new location, such as a room or corridor, you immediately notice one thing out of the ordinary. The GM determines what it is, or whether there’s nothing reasonable to pick up, skipping obvious clues that can be easily noticed without a check or specifically looking for them.
You learn only that an area or object is suspicious, but not why it’s suspicious. For example, if you entered a study with a large bloodstain on the ground, the bloodstain is so obviously suspicious it’s evident to you already, so the GM might note that there’s something suspicious about the desk drawer instead. You would then need to investigate the drawer further to find out what specifically is out of the ordinary.
That’s Odd doesn’t reveal whether creatures are suspicious.
You don’t typically get any benefit when you leave and come back to a place, though if a major change has happened there and time has passed, the GM might determine that you do.
You make your foes fall painfully when you trip them.
When you successfully [[Trip]] a [[Flat-Footed]] foe, your target takes 1d6 bludgeoning damage.
On a critical success, the target takes 1d6 bludgeoning damage plus your [[Sneak Attack]] damage.
''Frequency'' once per day
''Trigger'' You succeed at a skill check to [[Recall Knowledge]] to identify a creature.
You study a creature’s form and behavior to hypothesize likely means of overcoming its strengths.
Once before the end of your next turn, you can use the skill modifier from the triggering check in place of your saving throw modifier against one of the creature’s abilities, in place of your [[Perception]] modifier to [[Seek]] the creature, in place of your [[Deception]] modifier to [[Feint]] against the creature, or in place of your Intimidation modifier to [[Demoralize]] the creature.
Alternatively, against one of the creature’s attacks, you can use your DC for the skill used in the triggering check in place of your [[AC]].
You gain cold resistance equal to half your level (minimum 1), and you treat environmental cold effects as if they were one step less extreme (incredible cold becomes extreme, extreme cold becomes severe, and so on). You don’t need to succeed at a flat check to target a [[Concealed]] creature if that creature is concealed only by snow. Unless you wear protective gear or take shelter, environmental heat effects are one step more extreme for you.
Nothing beats the thrill of taking something that belongs to someone else, especially if you can do so completely unnoticed. You might be a pickpocket working the streets, a cat burglar sneaking through windows and escaping via rooftops, or a safecracker breaking into carefully guarded vaults. You might even work as a consultant, testing clients’ defenses by trying to steal something precious. When a fight breaks out, you prefer swift, lightweight weapons, and you strike where it hurts.
When you attack with a [[Finesse]] melee weapon, you can add your [[Dexterity]] modifier to damage rolls instead of your [[Strength]] modifier.
You are trained in [[Thievery]].
''Key Ability'' [[Dexterity]].
You are trained in a particular set of skills favored by thieves and miscreants.
{{||SkillActionList}}
{{||SkillFeatList}}
You have made great progress in your personal studies of enlightenment.
Choose one of the saving throws you selected for [[Path to Perfection]] or [[Second Path to Perfection]].
Your proficiency rank for the chosen type of save increases to legendary.
When you roll a critical failure on the chosen type of save, you get a failure instead.
When you __roll a failure on__ the chosen type of save against an effect that deals damage, you take half damage.
Typically characters eat and drink enough to survive comfortably.
When they can’t, they’re [[Fatigued]] until they do.
After 1 day + a creature’s [[Constitution]] modifier without water, it takes 1d4 damage each hour that can’t be healed until it quenches its thirst.
When your seedpods strike a felling blow, they burst into viciously thorny vines.
When you critically succeed at a seedpod Strike, vines twist and stab your foe, dealing 1d4 persistent piercing damage.
Your reports are thorough and informative, and putting your thoughts to paper helps you retain the information.
Keep track of each type of creature you successfully identify with [[Recall Knowledge]].
When attempting [[Recall Knowledge]] checks against creatures on your list in later encounters, you gain a +2 circumstance bonus, and you learn an additional fact about such creatures on a success.
When you succeed at a [[Recall Knowledge]] check, you learn an additional fact about the subject.
When you critically succeed at a Recall Knowledge check, you can gain even more additional information or context than normal, at the GM’s discretion.
You take your time searching to ensure you find everything.
When [[Search]]ing, you can take twice as long to search. Normally this means you Search at up to one quarter of your Speed, to a maximum of 150 feet per minute to check everything, or 75 feet per minute to check everything before you walk into it.
If you do, you gain a +2 circumstance bonus to your Perception checks to [[Seek]].
{{||SpellSummaryTable}}
You teleport one object of light or negligible Bulk held in your hand to the target.
The object appears instantly in the target’s hand, if they have a free hand, or at their feet if they don’t.
The target knows what object you are attempting to send them. If the target is unconscious or refuses to accept your gift, or if the spell would teleport a creature (even if the creature is inside an extradimensional container), the spell fails.
''Heightened (3rd)'' The spell’s range increases to 500 feet.
''Heightened (5th)'' As 3rd level, and the object’s maximum Bulk increases to 1. You can Cast the Spell with 3 actions instead of 1; doing so increases the range to 1 mile and you don’t need line of sight to the target, but you must be extremely familiar with the target.
Your form is as mutable as the weather, changing to meet your whim.
You add the forms listed in [[Humanoid Form]] to your [[Wild Shape]] list.
''Requirements'' You have a foe [[Grabbed]].
You thrash the grabbed foe around.
It takes bludgeoning damage equal to your [[Strength]] modifier plus your __[[Weapon Specialization]]__ damage plus your Rage damage.
The foe must attempt a basic [[Fortitude]] save against your class DC.
You [[Stride]] to be adjacent to a foe and [[Demoralize]] that foe.
If you succeed, the foe is [[Frightened]] 2 instead of [[Frightened]] 1.
<svg xmlns="http://www.w3.org/2000/svg" width="2em" height="1em" viewBox="0 0 200 100">
<polygon points="145,10 185,50 145,90 105,50" fill="black" stroke="white" stroke-width="7" />
<polygon points="100,5 145,50 100,95 55,50" fill="black" stroke="white" stroke-width="7" />
<polygon points="50,0 100,50 50,100 0,50" fill="black" stroke="white" stroke-width="7" />
<polyline points="0,50 25,25 50,50 25,75" stroke="white" fill="black" stroke-width="7" />
</svg>
{{||SpellSummaryTable}}
This spell allows you to change between three versions of yourself of different ages: a maiden (young adult), a mother (adult), or a matriarch (elderly).
Choose one when you Cast the Spell.
While the spell lasts, you can change the age to any of the three or to your natural age with a single action, which has the <<tag Concentrate>> trait.
Your form always looks like you regardless of the age, and creatures who know you still recognize you and can tell your age is different.
Threefold aspect alters your physical appearance and personality to present an authentic version of yourself at various ages.
This grants you a +4 status bonus to [[Deception]] checks to pass as the chosen age, and you can add your level as a proficiency bonus to these checks even if you’re untrained.
Furthermore, unless a creature specifically uses a [[Seek]] action or otherwise carefully examines you, it doesn’t get a chance to notice that you aren’t at your true age.
You can [[Dismiss]] this spell.
Spells you cast can transform briefly into vital essence, traveling harmlessly through living and undead creatures between you and your target, blocked only by solid objects.
If the next action you use is to [[Cast a Spell]] that requires a spell attack roll, your targets don’t benefit from [[Cover]] provided by living or undead creatures.
The monster picks up a rock within reach or retrieves a stowed rock and throws it, making a ranged [[Strike]].
//Throw Rock is a monster ability. Player characters who choose to throw rocks use the regular rules for thrown weapons.//
You can throw this weapon as a ranged attack.
A thrown weapon adds your [[Strength]] modifier to damage just like a melee weapon does.
When this trait appears on a melee weapon, it also includes the range increment.
Ranged weapons with this trait use the range increment specified in the weapon’s Range entry.
You’ve learned how to throw your voice through the winds, tricking others as to your location.
You can cast [[Ventriloquism]] as a primal innate spell once per day.
If you’re a [[Songbird Strix]], you can cast it twice per day instead.
A wave of your fan unleashes the fury of the storm.
You can Activate your tengu feather fan one additional time per day.
Add the 5th-level [[Lightning Bolt]] spell to the spells contained within your fan.
{{||SpellSummaryTable}}
You create a powerful blast of air and a loud peal of thunder, dealing 2d6 <<tag Bludgeoning>> damage and 2d6 <<tag Sonic>> damage, //with a basic [[Fortitude]] save.//
//Any creature who fails its save is also [[Deafened]] for 1 minute, or 1 hour on a critical failure.//
''Heightened (+2)'' Increase each type of damage by 2d6 and the area by 5 feet.
''Usage'' etched onto a weapon.
This weapon lets out a peal of thunder when it hits, dealing an extra 1d6 <<tag Sonic>> damage on a successful [[Strike]].
On a critical hit, the target has to succeed at a DC 24 [[Fortitude]] save or be deafened for 1 minute (or 1 hour on a critical failure).
''Greater Thundering:'' The save DC is 34, and the deafness is permanent. Sonic damage dealt by this weapon ignores the target’s sonic resistance.
When this stone hits a creature or a hard surface, it explodes with a deafening bang.
A thunderstone deals the listed sonic damage and sonic splash damage, and each creature within 10 feet of the space in which the stone exploded must succeed at a [[Fortitude]] saving throw with the listed DC or be [[Deafened]] until the end of its next turn. Many types of thunderstone grant an item bonus to attack rolls.
| !Type | !Level | !Price | !Sonic Damage | !Sonic Splash Damage | !Fortitude DC | !Item bonus to attack |
| Lesser | 1 | 30 | 1d4 | 1 | 17 | None |
| Moderate | 3 | 100 | 2d4 | 2 | 20 | +1 |
| Greater | 11 | 2500 | 3d4 | 3 | 28 | +2 |
| Major | 17 | 25000 | 4d4 | 4 | 36 | +3 |
This brass censer dangles on a length of chain. Most thuribles of revelation are adorned with swirling Celestial text, though some are iron and feature Infernal or Abyssal text.
''Activate'' {{TwoAction}} [[Interact]]; ''Cost'' incense worth at least 5 gp; ''Effect'' You light the incense inside the censer, and it burns for 1 hour. During that time, as long you are holding the thurible, you gain a +1 item bonus to [[Religion]] checks, and any critical failure you roll when you [[Decipher Writing]] of a religious nature is a failure instead.
A ''moderate'' thurible grants a +2 bonus. Once per day, when you activate a moderate thurible, you can increase its revelations. During that activation, you can hold the thurible up to your eyes with an [[Interact]] action to gain the effects of [[See Invisibility]] for 1 round by peering through the smoke.
A ''greater'' thurible grants a +3 bonus. The greater version shares the once-per-day enhanced revelations of the moderate version, except peering through the smoke also grants you the effects of [[True Seeing]].
''Frequency'' once per day
You conjure the force of the tides to gain a +4 circumstance bonus to AC until the end of your
next turn.
Any allies adjacent to you during the duration gain a +2 circumstance bonus to AC as long as they remain adjacent to you.
You can [[Sustain|Sustain a Spell]] the effect to a maximum duration of 5 rounds.
When a creature receiving a circumstance bonus to AC from Tidal Shield would take damage from an attack, as a reaction, you can reduce the damage to that creature by 40; after you do so, Tidal Shield ends.
{{||SpellSummaryTable}}
You call forth a tremendous wave to move the target either in a body of water or on the ground.
The target must attempt a Fortitude save.
{{||SaveSuccessTable}}
You’re at home in the unpredictable tides.
You gain a +1 circumstance bonus to saves against <<tag Cold>> and <<tag Water>> effects. If you roll a success on a save against a cold or water effect, you get a critical success instead.
You descend from fiends or bear the mark of the fiendish realms, manifesting as some unusual feature that belies your heritage, such as horns or a tail.
You gain the <<tag Tiefling>> trait, in addition to the traits from your ancestry.
You also gain [[Low-Light Vision]], or you gain [[Darkvision]] if your ancestry already has low-light vision.
You can choose from <<tag Tiefling>> feats and feats from your ancestry whenever you gain an ancestry feat.
{{||VHerFeatList}}
Affix to a weapon.
''Trigger'' You [[Strike]] with the affixed weapon.
This tiger formed of pewter snarls viciously from your weapon’s grip.
When you activate {{FreeAction}} the tiger, the affixed weapon gains the [[Sweep]] trait for the triggering attack and all other attacks for 1 minute.
''Requirements'' You are in [[Tiger Stance]].
You make a fierce swipe with both hands.
Make a tiger claw [[Strike]].
It deals two extra weapon damage dice (three extra dice if you’re 14th level or higher), and you can push the target 5 feet away as if you had successfully [[Shove]]d them.
If the attack is a critical success and deals damage, add your [[Strength]] modifier to the persistent bleed damage from your tiger claw.
''Requirements'' You are unarmored.
You enter the stance of a tiger and can make tiger claw attacks.
These deal 1d8 slashing damage; are in the brawling group; and have the [[Agile]], [[Finesse]], [[Nonlethal]], and [[Unarmed]] traits. On a critical success with your tiger claws, if you deal damage, the target takes 1d4 persistent bleed damage.
As long as your Speed is at least 20 feet while in Tiger Stance, you can [[Step]] 10 feet.
You can use the Aid reaction to help a member of your crop even if you haven’t prepared to do so.
Your Speed bonus from [[Bellflower Dedication]] increases to +10 feet.
Members of your crop receive a +5-foot circumstance bonus to Speed.
{{||SpellSummaryTable}}
You create a beacon in time, intending to return to it if things go wrong.
You can cast time beacon on only your turn.
Keep careful track of everything that happens this turn after you cast time beacon.
At the end of your turn, you can choose to rewind time back to just after you cast time beacon, removing all effects of your turn since then.
Curses, traps, and other harmful effects that happen during your turn might prevent you from returning to the beacon if they are powerful enough.
If you suffered any harmful effects during your turn after casting time beacon, to return to your beacon, time beacon attempts a [[Counteract]] check against each such effect. If it fails at any of these checks, you can’t return.
{{||SpellSummaryTable}}
You temporarily stop time for everything but yourself, allowing you to use several actions in what appears to others to be no time at all.
Immediately after casting time stop, you can use up to 9 actions in 3 sets of up to 3 actions each.
After each set of actions, 1 round passes, but only for you, effects specifically targeting or affecting you, and effects you create during the stoppage.
All other creatures and objects are invulnerable to your attacks, and you can’t target or affect them with anything.
Once you have finished your actions, time begins to flow again for the rest of the world.
If you created an effect with a duration that extends beyond the time stop’s duration, such as [[Wall of Fire]], it immediately affects others again, but it doesn’t have any of the effects that happen only when you first cast the spell.
You cease aging.
In addition, you gain a +2 status bonus to saving throws against poisons and diseases, and you gain resistance to poison damage equal to half your level.
With primal magic sustaining you, you cease aging.
The overflowing primal energy gives you a +2 status bonus to saves against diseases and primal magic.
An alchemical substance applied to one end of this tiny wooden stick ignites when struck against a rough surface. Creating a flame with a tindertwig is much faster than creating a flame with flint and steel.
You can ignite the tindertwig and touch it to a flammable object as part of the same [[Interact]] action.
You’re good with your hands and can quickly improvise a fix for broken or damaged equipment.
You’re trained in [[Crafting]]. If you would automatically become trained in Crafting (from your background or class, for example), you instead become trained in a skill of your choice.
You can [[Repair]] an item without using a [[Repair Kit]] without taking the –2 circumstance penalty, improvising tools from whatever you have at hand.
Your Tiny sprite can enter another creature’s space, which is important because your melee Strikes typically have no reach, meaning you must enter their space to attack them.
Like other Tiny creatures, you don’t automatically receive lesser cover from being in a larger creature’s space, but circumstances might allow you to [[Take Cover]].
You can purchase weapons, armor, and other items for your size with the same statistics as normal gear, except that melee weapons have a reach of 0 for you (or a reach 5 feet shorter than normal if they have the reach trait).
Remember to adjust the Bulk of items and your Bulk limit for Tiny size.
{{||SpellSummaryTable}}
You suppress your choice of one of the following conditions that’s affecting the target: [[Clumsy]], [[Encumbered]], [[Enfeebled]], or [[Fatigued]].
If you don’t remove the effect that caused the condition, the condition returns after the spell’s duration expires.
You have learned how to use your sling to fell enormous creatures.
When you hit on an attack with a sling against a Large or larger creature, increase the size of the weapon damage die by one step.
''Prerequisites'' Trained in [[Athletics]].
You can attempt to [[Disarm]], [[Grapple]], [[Shove]], or [[Trip]] creatures up to two sizes larger than you, or up to three sizes larger than you if you’re legendary in Athletics.
You grow to even greater size.
When using [[Giant's Stature]], you can instead become Huge (increasing your reach by 10 feet if you were Medium or smaller) while you are raging.
You have the [[Clumsy]] 1 condition as long as you are Huge.
With a resounding cry, you rally your ally to the offensive.
Choose one ally within your marshal’s aura who has a reaction available.
If you spend 1 action, that ally can use their reaction to immediately [[Stride]].
If you spend 2 actions, that ally can use their reaction to immediately [[Strike]].
Your ability to track your prey has surpassed explanation, allowing you to trace your prey’s movements and predict its location with ease.
When you use [[Hunt Prey]] on a creature within 100 feet, you can follow that creature’s movements, allowing you to know the creature’s exact location no matter how far away it becomes, as long as it remains your prey.
You must be legendary in Nature to track your prey’s location across teleportation or planar travel.
This feat gains the <<tag Detection>>, <<tag Divination>>, and <<tag Primal>> traits if you’re legendary in Nature.
From [[Animal Vision]]:
While tapping into the target's senses, you can't use your own body's senses, but you can change back and forth from your body's senses to the target's senses using a single action, which has the Concentrate trait.
//Implied by [[Diamond Dust]].//
While the spell persists, you can activate or deactivate this aura by using a single action, which has the Concentrate trait.
//Implied by [[Halo]].//
You can suppress or reestablish the halo with a single action, which has the Concentrate trait.
//Implied by [[Aura of Unbreakable Virtue]].//
You can choose to suppress or resume this aura as an action, which has the concentrate trait.
{{LOCGFeat}}
When you critically hit an <<tag Undead>> creature, or an undead creature critically fails a saving throw against one of your abilities, you drive your divine wrath home in your enemy’s heart.
The undead is [[Enfeebled]] 1 for 1 round.
You lash out with your tongue to disarm your foe.
You attempt to [[Disarm]] a creature within 10 feet, ignoring the requirement that you must have at least one hand free.
You have transcended the barriers between words and meaning.
You can speak and understand all spoken languages.
{{||SpellSummaryTable}}
The target can understand all words regardless of language and also speak the languages of other creatures.
When in a mixed group of creatures, each time the target speaks, it can choose a creature and speak in a language that creature understands, even if the target doesn’t know what language that is.
''Heightened (7th)'' The duration is 8 hours.
You’re well-versed in weapons that allow you to bring bounties in alive.
You are trained with the following weapons: bola, sap, and whip. You gain access to bolas.
Whenever you gain a class feature that grants you expert or greater proficiency in a given weapon or weapons, you also gain that proficiency in the weapons listed.
In addition, you take no penalty when making a nonlethal attack with a weapon without the nonlethal trait.
''Trigger'' An ally succeeds at a melee [[Strike]] against an opponent you are both adjacent to.
You take advantage of the opening created by your ally to tip your foe off their feet.
Attempt an [[Athletics]] check to [[Trip]] the target of the triggering attack.
While sharing a creature’s space using Dance Underfoot, your weapons and unarmed attacks gain the [[Trip]] trait, but only against the creature whose space you share.
You can be in the same space as a Large or larger [[Prone]] creature, even if it’s not your ally.
{{TorchLight}} It can be used as an improvised weapon that deals 1d4 bludgeoning damage plus 1 fire damage.
You’ve spent enough time on fire that you know how to use it to your advantage.
You can light yourself thoroughly on fire with a held torch, a bottle of alchemist’s fire, or a similar incendiary, dealing yourself 1d6 persistent fire damage.
As long as you are suffering persistent fire damage, all your melee attacks against adjacent creatures deal an additional 1 fire damage per weapon damage die.
Any creature that successfully [[Grapple]]s, [[Shove]]s, or [[Trip]]s you takes 1d6 fire damage; if it uses a weapon for that action, the weapon takes the damage instead.
You must still attempt the flat check to remove the persistent fire damage each round, as normal.
A torch sheds bright light in a 20-foot radius (and [[Dim Light]] to the next 20 feet).
A spell with a range of touch requires you to physically touch the target.
You use your unarmed reach to determine whether you can touch the creature.
You can usually touch the target automatically, though the spell might specify that the target can attempt a saving throw or that you must attempt a spell attack roll.
If an ability increases the range of a touch spell, start at 0 feet and increase from there.
{{||SpellSummaryTable}}
You infuse the target with negative energy.
If the target is living, this deals 1d6 negative damage (basic [[Fortitude]] save); on a failed save, the target also takes a –2 status penalty to AC for 1 round.
If the target is a willing undead creature, the target instead regains 6 Hit Points, and if you are the undead target, you also gain a +2 status bonus to damage rolls for 1 round.
''Heightened (+1)'' Increase the damage dealt to a living creature by 1d6 or increase the Hit Points regained by undead by 6.
{{||SpellSummaryTable}}
You dull the target's mind.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
Your imperious touch erodes the target’s willpower, making it easier to control.
The target attempts a [[Will]] save.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
When you touch the target, a symbol of the moon appears on its forehead, glowing with soft moonlight.
The target glows with [[Dim Light]] in a 20-foot radius.
It also gets a benefit based on a phase of the moon, starting with the new moon and changing to the next phase at the end of each of its turns.
* ''New Moon'' The target receives no benefit.
* ''Waxing Moon'' The target gains a +1 status bonus to attack rolls and a +4 status bonus to damage rolls.
* ''Full Moon'' The target gains a +1 status bonus to attack rolls, AC, and saving throws and a +4 status bonus to damage rolls.
* ''Waning Moon'' The target gains a +1 status bonus to AC and saving throws. After this phase, return to the new moon.
//The actual phase of the moon in the game world does not affect this spell.//
{{||SpellSummaryTable}}
You attack the target’s life force with undeath, dealing 1d6 <<tag Negative>>damage.
The target must attempt a [[Fortitude]] save.
{{||SaveSuccessTable}}
You’ve taken your share of licks while scurrying around the battlefield and know how to defend yourself against opportunistic attackers.
Your movement ends only when you critically fail an [[Acrobatics]] check to [[Tumble Through]] an enemy’s space (or when you don’t have enough Speed to move all the way through its space).
You still trigger reactions on a failure to [[Tumble Through]], but you gain a +1 circumstance bonus to AC against attacks that you trigger in this way.
You can withstand more punishment than most before succumbing.
Increase your maximum Hit Points by your level.
//This is recalculated whenever your level increases; ie, you gain 1 extra hit point per level.//
__The DC of your [[Recovery Check]]s is equal to 9 plus your [[Dying]] value.__
You specialize in toxins and venoms of all types.
''Level 1:'' You start with the formulas for two common 1st-level alchemical poisons in your formula book, in addition to your other formulas.
''Level 1:'' You can apply an injury poison you’re holding to a weapon you’re wielding as a single action, rather than as a 2-action activity, and you can change the DCs of your infused poisons to your class DC if it’s higher.
''Level 5:'' When using [[Advanced Alchemy]] to make poisons during your daily preparations, you can spend one batch of reagents to create three poisons in any combination, instead of just two of the same poison.
''Level 15'': You can apply two different injury poisons to the same weapon, though not to a piece of ammunition. The two poisons can be up to six levels lower than your level, and you can’t use the poisons made without spending a batch of infused reagents via [[Perpetual Infusions]].
Applying the two poisons requires a separate action to apply each poison. Once completed, you combine the two poisons on the weapon into a double poison with the lower of the two poisons’ DCs. This double poison is only virulent if both poisons were virulent, and if the poisons have a different number of stages, the double poison has a number of stages equal to the poison with the lower number of stages. The target takes the effects of both poisons for its current stage.
You follow tracks, moving at up to half your travel Speed.
After a successful check to Track, you can continue following the tracks at half your Speed without attempting additional checks for up to 1 hour.
In some cases, you might Track in an encounter. In this case, Track is a single action and doesn’t have the exploration trait, but you might need to roll more often because you’re in a tense situation.
The GM determines how often you must attempt this check. You attempt your [[Survival]] check when you start Tracking, once every hour you continue tracking, and any time something significant changes in the trail.
The GM determines the DCs for such checks, depending on the freshness of the trail, the weather, and the type of ground. //If whatever you are tracking used [[Cover Tracks]], their [[Survival]] DC is used instead if it is higher.//
{{||ActionSuccessTable}}
Your companion is an incredible tracker.
It can move at full Speed while [[following tracks|Track]].
Its proficiency rank in [[Survival]] increases to expert (or master if it was already an expert from its type), and its [[Wisdom]] modifier increases by 1.
When you move through natural terrains, you are difficult to track.
You always gain the benefits of the [[Cover Tracks]] action in such terrains, without moving at half your Speed.
You are used to moving through the wilderness.
While moving on land, you ignore the effects of non-magical [[Difficult Terrain]].
You spend time teaching an animal to do a certain action.
You can either select a basic action the animal already knows how to do (typically those listed in the [[Command an Animal]] action) or attempt to teach the animal a new basic action.
The GM determines the DC of any check required and the amount of time the training takes (usually at least a week).
It’s usually impossible to teach an animal a trick that uses critical thinking.
If you’re expert, master, or legendary in Nature, you might be able to train more unusual creatures, at the GM’s discretion.
{{||ActionSuccessTable}}
\define trainnodupe(skill:"")
You are trained in <$link to=<<__skill__>> />. If you would automatically become trained in <<__skill__>> (from your background or class, for example), you instead become trained in a skill of your choice.
\end
<$list filter="[all[current]tag[Action]]">
{{||ActionSummary}}
</$list>
<$list filter="[all[current]tag[Feat]]">
{{||FeatSummary}}
</$list>
<$list filter="[all[current]tag[Item]]">
{{||ItemSummary}}
</$list>
<table>
<$list filter="[all[current]tag[Additive]]">
<tr><th>[[Additive]]</th><td>One per alchemy item, increases item level by the given amount.</td></tr>
</$list>
<$list filter="[all[current]tag[Air]]">
<tr><th>[[Air]]</th><td>This may not work in vacuum or without air.</td></tr>
</$list>
<$list filter="[all[current]tag[Arcane]]">
<tr><th>[[Arcane]]</th><td>This spell can be identified using [[Arcana]].</td></tr>
</$list>
<$list filter="[all[current]tag[Attack]]">
<tr><th>[[Attack]]</th><td>This is affected by [[Multiple Attack Penalty]].</td></tr>
</$list>
<$list filter="[all[current]tag[Auditory]]">
<tr><th>[[Auditory]]</th><td>This works only against creatures that can hear it and are not [[Deafened]].</td></tr>
</$list>
<$list filter="[all[current]tag[Chaotic]]">
<tr><th>[[Chaotic]]</th><td>Chaotic damage harms only lawful creatures.</td></tr>
</$list>
<$list filter="[all[current]tag[Command]]">
<tr><th>[[Command]]</th><td>You must speak loudly to activate this item; <<tag Auditory>> and <<tag Concentrate>>.</td></tr>
</$list>
<$list filter="[all[current]tag[Composition]]">
<tr><th>[[Composition]]</th><td>Inherits traits from a [[Perform]] style, 1 per turn, only 1 active at once.</td></tr>
</$list>
<$list filter="[all[current]tag[Concentrate]]">
<tr><th>[[Concentrate]]</th><td>You can't use this while distracted, or while raging unless it also has Rage.</td></tr>
</$list>
<$list filter="[all[current]tag[Contact]]">
<tr><th>[[Contact]]</th><td>Poison delivered by touch to item. Can't apply via weapon attack.</td></tr>
</$list>
<$list filter="[all[current]tag[Curse]]">
<tr><th>[[Curse]]</th><td><u>Can only be removed by effects which specifically target curses.</u></td></tr>
</$list>
<$list filter="[all[current]tag[Cursebound]]">
<tr><th>[[Cursebound]]</th><td>Requires an [[Oracular Curse]], and increases its severity.</td></tr>
</$list>
<$list filter="[all[current]tag[Debilitation]]">
<tr><th>[[Debilitation]]</th><td>Only one debilitation can apply to an enemy at a time.</td></tr>
</$list>
<$list filter="[all[current]tag[Dedication]]">
<tr><th>[[Dedication]]</th><td>Must take two feats from the archetype before taking another dedication.</td></tr>
</$list>
<$list filter="[all[current]tag[Divine]]">
<tr><th>[[Divine]]</th><td>This spell can be identified using [[Religion]].</td></tr>
</$list>
<$list filter="[all[current]tag[Emotion]]">
<tr><th>[[Emotion]]</th><td>This won't work on creatures with mechanical or artificial intelligence.</td></tr>
</$list>
<$list filter="[all[current]tag[Envision]]">
<tr><th>[[Envision]]</th><td>You must <<tag Concentrate>> on imagining something to activate this item.</td></tr>
</$list>
<$list filter="[all[current]tag[Evil]]">
<tr><th>[[Evil]]</th><td>Evil damage harms only good creatures.</td></tr>
</$list>
<$list filter="[all[current]tag[Exploration]]">
<tr><th>[[Exploration]]</th><td>This can only be used in Exploration Mode, not Encounter Mode (ie, not combat).</td></tr>
</$list>
<$list filter="[all[current]tag[Finisher]]">
<tr><th>[[Finisher]]</th><td>Uses up [[Panache]] and must be last attack in turn.</td></tr>
</$list>
<$list filter="[all[current]tag[Fire]]">
<tr><th>[[Fire]]</th><td>You can't use this underwater.</td></tr>
</$list>
<$list filter="[all[current]tag[Flourish]]">
<tr><th>[[Flourish]]</th><td>You can only use 1 Flourish per turn.</td></tr>
</$list>
<$list filter="[all[current]tag[Focus Spell]]">
<tr><th>[[Focus Spell]]</th><td>You can't learn this from a spell list and it costs 1 Focus Point to cast.</td></tr>
</$list>
<$list filter="[all[current]tag[Fortune]]">
<tr><th>[[Fortune]]</th><td>Doesn't stack with other Fortune effects, and cancels with [[Misfortune.]]</td></tr>
</$list>
<$list filter="[all[current]tag[Good]]">
<tr><th>[[Good]]</th><td>Good damage harms only evil creatures.</td></tr>
</$list>
<$list filter="[all[current]tag[Hex]]">
<tr><th>[[Hex]]</th><td>Casting more than one hex a turn auto fails.</td></tr>
</$list>
<$list filter="[all[current]tag[Incapacitation]]">
<tr><th>[[Incapacitation]]</th><td>This has reduced effect against creatures of higher level.</td></tr>
</$list>
<$list filter="[all[current]tag[Ingested]]">
<tr><th>[[Ingested]]</th><td>Poison must be taken by mouth; save when consumed.</td></tr>
</$list>
<$list filter="[all[current]tag[Inhaled]]">
<tr><th>[[Inhaled]]</th><td>Creates 10 foot cube of poison gas for 1 minute. Hold breath for +2 circumstance for 1 round.</td></tr>
</$list>
<$list filter="[all[current]tag[Injury]]">
<tr><th>[[Injury]]</th><td>Affects target struck with piercing or slashing damage. Poison lost on fumble but not miss.</td></tr>
</$list>
<$list filter="[all[current]tag[Interact]]">
<tr><th>[[Interact]]</th><td>You must [[Interact]] with this item to activate it.</td></tr>
</$list>
<$list filter="[all[current]tag[Invested]]">
<tr><th>[[Invested]]</th><td>This consumes one of your magical investment slots.</td></tr>
</$list>
<$list filter="[all[current]tag[Illusion]]">
<tr><th>[[Illusion]]</th><td>It may be possible to disbelieve this with [[Perception]] vs its DC.</td></tr>
</$list>
<$list filter="[all[current]tag[Lawful]]">
<tr><th>[[Lawful]]</th><td>Lawful damage harms only chaotic creatures.</td></tr>
</$list>
<$list filter="[all[current]tag[Lineage]]">
<tr><th>[[Lineage]]</th><td>Only one, at 1st level and can never be retrained.</td></tr>
</$list>
<$list filter="[all[current]tag[Linguistic]]">
<tr><th>[[Linguistic]]</th><td>Your target must be able to understand your language.</td></tr>
</$list>
<$list filter="[all[current]tag[Manipulate]]">
<tr><th>[[Manipulate]]</th><td>This may provoke [[Attack of Opportunity]] and other reactions.</td></tr>
</$list>
<$list filter="[all[current]tag[Material]]">
<tr><th>[[Material]]</th><td>You must have a free hand to take out components to cast this spell.</td></tr>
</$list>
<$list filter="[all[current]tag[Mental]]">
<tr><th>[[Mental]]</th><td>This won't work on objects or [[Mindless]] creatures, and maybe not [[Swarm Mind]]s.</td></tr>
</$list>
<$list filter="[all[current]tag[Metamagic]]">
<tr><th>[[Metamagic]]</th><td>You must use this immediately before casting a spell.</td></tr>
</$list>
<$list filter="[all[current]tag[Misfortune]]">
<tr><th>[[Misfortune]]</th><td>Doesn't stack with other Misfortune effects, and cancels with [[Fortune]].</td></tr>
</$list>
<$list filter="[all[current]tag[Multiclass]]">
<tr><th>[[Multiclass]]</th><td>Can't take this if you are already a member of the class.</td></tr>
</$list>
<$list filter="[all[current]tag[Oath]]">
<tr><th>[[Oath]]</th><td>You may only take one Oath feat.</td></tr>
</$list>
<$list filter="[all[current]tag[Occult]]">
<tr><th>[[Occult]]</th><td>This spell can be identified using [[Occultism]].</td></tr>
</$list>
<$list filter="[all[current]tag[Oil]]">
<tr><th>[[Oil]]</th><td>Apply to an item or creature in reach that is willing, [[Paralyzed]], [[Petrified]] or [[Unconscious]].</td></tr>
</$list>
<$list filter="[all[current]tag[Olfactory]]">
<tr><th>[[Occult]]</th><td>This only affects creatures that can smell it.</td></tr>
</$list>
<$list filter="[all[current]tag[Open]]">
<tr><th>[[Open]]</th><td>Can't use this after an [[Attack]] or [[Open]] in the same turn.</td></tr>
</$list>
<$list filter="[all[current]tag[Potion]]">
<tr><th>[[Potion]]</th><td>Drink with [[Interact]] action, or feed to a willing or non-resisting creature.</td></tr>
</$list>
<$list filter="[all[current]tag[Press]]">
<tr><th>[[Press]]</th><td>Can only use this if you have a [[Multiple Attack Penalty]].</td></tr>
</$list>
<$list filter="[all[current]tag[Primal]]">
<tr><th>[[Primal]]</th><td>This spell can be identified using [[Nature]].</td></tr>
</$list>
<$list filter="[all[current]tag[Rage]]">
<tr><th>[[Rage]]</th><td>You have to be raging to use this.</td></tr>
</$list>
<$list filter="[all[current]tag[Rare]]">
<tr><th>[[Rare]]</th><td>You can't gain this unless a plot gives it to you.</td></tr>
</$list>
<$list filter="[all[current]tag[Secret]]">
<tr><th>[[Secret]]</th><td>The GM makes the roll for this in secret.</td></tr>
</$list>
<$list filter="[all[current]tag[Social]]">
<tr><th>[[Social]]</th><td>You must be in your social identity to use this.</td></tr>
</$list>
<$list filter="[all[current]tag[Somatic]]">
<tr><th>[[Somatic]]</th><td>You must normally be able to make gestures to cast this spell.</td></tr>
</$list>
<$list filter="[all[current]tag[Stance]]">
<tr><th>[[Stance]]</th><td>One stance at a time; one stance action per round. Can only use in combat.</td></tr>
</$list>
<$list filter="[all[current]tag[Talisman]]">
<tr><th>[[Talisman]]</th><td>[[Affix a Talisman]] to an item, then activate for one use.</td></tr>
</$list>
<$list filter="[all[current]tag[Trained]]">
<tr><th>[[Trained]]</th><td>You must be trained in the relevant skill to use this. //Having [[Untrained Improvisation]] is ''not'' sufficient.//</td></tr>
</$list>
<$list filter="[all[current]tag[Uncommon]]">
<tr><th>[[Uncommon]]</th><td>You can't normally gain this by character advancement.</td></tr>
</$list>
<$list filter="[all[current]tag[Verbal]]">
<tr><th>[[Verbal]]</th><td>You must normally be able to speak loudly to cast this spell, and you lose all your air if you use this while holding your breath.</td></tr>
</$list>
<$list filter="[all[current]tag[Vigilante]]">
<tr><th>[[Vigilante]]</th><td>You must be in your vigilante identity to use this.</td></tr>
</$list>
<$list filter="[all[current]tag[Virulent]]">
<tr><th>[[Virulent]]</th><td>Needs two save successes, or one crit, to lower stage by 1.</td></tr>
</$list>
<$list filter="[all[current]tag[Visual]]">
<tr><th>[[Visual]]</th><td>This works only against creatures that can see it and are not [[Blinded]].</td></tr>
</$list>
</table>
<!-- Remove this line temporarily if mod- recursion breaks a page -->
<$macrocall $name="ModifierBlock" for=<<currentTiddler>> />
<$list filter="[[HelloThereMissing]is[missing]then[yes]]" />
[tag[Recipe]]
The monster [[Stride]]s up to double its Speed and can move through the spaces of creatures of the listed size, trampling each creature whose space it enters.
The monster can attempt to Trample the same creature only once in a single use of Trample.
The monster deals the damage of the listed [[Strike]], but trampled creatures can attempt a basic [[Reflex]] save at the listed DC.
''Requirements'' You are riding a mount that has a melee Strike using its legs (claw, talons, hoof, etc.).
You urge your mount forward, trampling enemies in your path.
You command your mount to [[Stride]] up to its Speed (or to Burrow, Climb, Fly, or Swim, if it has the corresponding movement type), moving through the spaces of any foes in your path up to one size smaller than your mount.
Your mount deals damage equal to the melee [[Strike]] using its legs to each creature whose space you move through, subject to a basic [[Reflex]] save against your mount’s [[Athletics]] DC.
On a critical failure, the creature also becomes [[Flat-Footed]] until the end of your next
turn.
You can damage a given creature only once during this movement.
Whenever possible, you follow the serene path and encourage others to do the same.
You can cast [[Sanctuary]] once per day as a 1st-level divine innate spell.
Your body is translucent while underwater.
Whenever you are fully submerged in water, you can [[Hide]] from other creatures even if you don’t have cover against them and aren’t concealed from them.
Transmutation spells make alterations to or transform the physical form of a creature or object.
The <<tag Morph>>and <<tag Polymorph>>traits appear primarily in transmutation spells.
{{||SpellSummaryTable}}
You warp the structure of earthen material, turning rock into mud or mud into rock.
Choose one of these two options when you Cast the Spell.
''Rock to Mud'' You transform non-magical, unworked, and unattended stone in the area into an equal volume of mud.
If you Cast this Spell on a stone floor, it becomes [[Difficult Terrain]]; if the resulting mud is at least 3 feet deep, it is greater difficult terrain, or the creature can try to [[Swim]] through it (DC 10 [[Athletics]]). If the mud is deep enough that a creature can’t reach the bottom, the creature must [[Swim]] to move through it.
If you Cast this Spell on a ceiling, the falling mud deals 8d6 bludgeoning damage (basic [[Reflex]] save) and spreads out, creating difficult terrain in an area 10 feet larger in radius than the original spell’s area.
Once the rock is transformed into mud, the mud is non-magical and remains until natural conditions cause it to dry out or otherwise disperse.
''Mud to Rock'' Mud in the area turns into unworked stone.
If creatures are in the mud when it is transformed to stone, they must attempt a Reflex saving throw.
{{||SaveSuccessTable}}
''Heightened (+2)'' Add an additional 10-foot cube to the area, adjacent to at least one of the other cubes.
You have an intuitive sense that alerts you to the dangers and presence of traps.
You gain a +1 circumstance bonus to [[Perception]] checks to find traps, to [[AC]] against attacks made by traps, and to saves against traps.
Even if you aren’t [[Search]]ing, you get a check to find traps that normally require you to be Searching. You still need to meet any other requirements to find the trap.
You can disable traps that require a proficiency rank of master in [[Thievery]]. If you have master proficiency in Thievery, you can disable traps that require a proficiency rank of legendary instead, and your circumstance bonuses against traps increases to +2.
Before it’s activated, this item appears to be an ash rod capped with steel on either end.
''Activate'' {{TwoAction}} envision, [[Interact]]; ''Effect'' You imagine a specific simple tool, and the any-tool transforms into it. This transforms the wooden portion into any haft and the metal caps into spades, hammer heads, or the like, allowing for most basic tools but nothing more complex. You can return the item to its rod form with an [[Interact]] action.
{{||SpellSummaryTable}}
You add power to your muscles, allowing you to swim or climb walls with ease.
When you cast this spell, you gain either a climb Speed or a swim Speed.
The Speed is equal to your land Speed.
''Heightened (5th)'' You can choose to gain a fly Speed.
''Frequency'' once every 10 minutes
You have the power to shatter the earth into a shape of your devising.
You crack the ground beneath you, creating [[Difficult Terrain]] in a 5-foot [[Burst]] centered on one corner of your space..
''Requirements'' You are holding [[Healer’s Tools]], or you are wearing them and have a hand free.
You treat an adjacent creature in an attempt to reduce the [[Clumsy]], [[Enfeebled]], or [[Sickened]] condition.
If a creature has multiple conditions from this list, choose one.
Attempt a [[Counteract]] check against the condition, using your [[Medicine]] modifier as your counteract modifier and the condition’s source to determine the DC.
You can’t treat a condition that came from an artifact or effect above 20th level unless you have [[Legendary Medic]]; even if you do, the counteract DC increases by 10.
Treating a Condition that is continually applied under certain circumstances (for instance, the enfeebled condition a good character gains from carrying an unholy weapon) has no effect as long as the circumstances continue.
{{||ActionSuccessTable}}
''Requirements'' You have [[Healer’s Tools]].
You spend at least 8 hours caring for a diseased creature.
Attempt a [[Medicine]] check against the disease’s DC.
After you attempt to Treat a Disease for a creature, you can’t try again until after that creature’s next save against the disease.
//If you have [[Ward Medic]], you can treat several targets at the same time.//
{{||ActionSuccessTable}}
''Requirements'' You have [[Healer's Tools]].
You treat a patient to prevent the spread of poison.
Attempt a [[Medicine]] check against the poison’s DC.
After you attempt to Treat a Poison for a creature, you can’t try again until after the next time that creature attempts a save against the poison.
{{||ActionSuccessTable}}
You spend 10 minutes treating one injured living creature (targeting yourself, if you so choose).
The target is then temporarily immune to Treat Wounds actions for 1 hour, but this interval overlaps with the time you spent treating (so a patient can be treated once per hour, not once per 70 minutes). //[[Continual Recovery]] reduces this to only 10 minutes.//
The [[Medicine]] check DC is usually 15, though the GM might adjust it based on the circumstances, such as treating a patient outside in a storm, or treating magically cursed wounds.
If you’re an expert in Medicine, you can instead attempt a DC 20 check to increase the Hit Points regained by 10; if you’re a master of Medicine, you can instead attempt a DC 30 check to increase the Hit Points regained by 30; and if you’re legendary, you can instead attempt a DC 40 check to increase the Hit Points regained by 50. The damage dealt on a critical failure remains the same.
If you succeed at your check, you can continue treating the target to grant additional healing. If you treat them for a total of 1 hour, double the Hit Points they regain from Treat Wounds.
The result of your Medicine check determines how many Hit Points the target regains.
{{||ActionSuccessTable}}
You’ve spent much of your life among the treetops and have become an expert at quickly and safely climbing them.
You gain a climb Speed of 10 feet.
Your time in forest or jungle canopies has taught you how to scramble across branches with sure feet.
You gain a climb Speed of 10 feet.
If you also have the [[Cave Climber]] ancestry feat, your total climb Speed increases to your land Speed when climbing trees.
{{||SpellSummaryTable}}
You transform into a Large tree.
[[Perception]] checks don’t reveal your true nature, but a successful [[Nature]] or [[Survival]] check against your spell DC reveals that you appear to be a tree that is strangely new to the area.
While in tree form, you can observe everything around you, but you can’t act other than to end the spell, and your turn, by using a single action, which has the <<tag Concentrate>> trait.
As a tree, your AC is 20, and only status bonuses, status penalties, circumstance bonuses, and circumstance penalties affect you.
Any successes and critical successes you roll on [[Reflex]] saves are failures.
{{||SpellSummaryTable}}
You step into a living tree with a trunk big enough for you to fit inside it and instantly teleport to any tree of the same species within 5 miles that also has a sufficiently large trunk.
Once you enter the first tree, you instantly know the rough locations of other sufficiently large trees of the same species within range and can exit from the original tree, if you prefer.
You can’t carry extradimensional spaces with you; if you attempt to do so, the spell fails.
''Heightened (6th)'' The tree you exit can be up to 50 miles away.
''Heightened (8th)'' The tree you exit can be up to 500 miles away.
''Heightened (9th)'' The tree you exit can be anywhere on the same planet.
As long as you are in a forest or jungle, you gain a +2 circumstance bonus to [[Stealth]] checks to [[Hide]] and [[Sneak]], [[Survival]] checks to [[Subsist]], and your Survival DC to [[Cover Tracks]].
Tremorsense allows a monster to feel the vibrations through a solid surface caused by movement.
It is an [[Imprecise]] sense with a limited range (listed in the ability).
Tremorsense functions only if the monster is on the same surface as the subject, and only if the subject is moving along (or burrowing through) the surface.
''Requirements'' You are in [[Monastic Archer Stance]] and wielding a bow usable with that stance.
You string three arrows to your bow and fire them all at once.
Make three ranged [[Strike]]s against a single target with the required weapon, each using your current multiple attack penalty, and you take an additional –2 penalty.
This counts as two attacks when calculating your multiple attack penalty, and you combine the attacks’ damage for the purpose of resistances and weaknesses.
Your [[Stunning Fist]] benefit applies to Triangle Shot, even though it isn’t a Flurry of Blows.
If all three Strikes hit, the target takes 3d6 persistent bleed damage.
''Prerequisites'' Trained in [[Arcana]], [[Nature]], [[Occultism]], or [[Religion]].
You examine a magic item you normally couldn’t use in an effort to fool it and activate it temporarily. For example, this might allow a fighter to cast a spell from a wand or allow a wizard to cast a spell that’s not on the arcane list using a scroll.
You must know what activating the item does, or you can’t attempt to trick it.
Attempt a check using the skill matching the item’s magic tradition, or matching a tradition that has the spell on its list, if you’re trying to cast a spell from the item. The relevant skills are [[Arcana]] for arcane, [[Nature]] for primal, [[Occultism]] for occult, [[Religion]] for divine, or any of the four for an item that has the magical trait and not a tradition trait.
The GM determines the DC based on the item’s level (possibly adjusted depending on the item or situation).
If you activate a magic item that requires a spell attack roll or spell DC and you don’t have the ability to cast spells of the relevant tradition, use your level as your proficiency bonus and the highest of your [[Intelligence]], [[Wisdom]], or [[Charisma]] modifiers. If you’re a master in the appropriate skill for the item’s tradition, you instead use the trained proficiency bonus, and if you’re legendary, you instead use the expert proficiency bonus.
{{||ActionSuccessTable}}
You can transform yourself or the bodies of others to express your displeasure.
Once per day, you can cast either [[Aerial Form]] or [[Baleful Polymorph]] as a 7th-level primal innate spell. You must take the form of a bird when using this aerial form.
''Trigger'' You specify the trigger when you make your daily preparations.
''Requirements'' When you make your daily preparations, you must specify a trigger for this reaction using the same restrictions as the triggers for the [[Ready]] action. You also choose a single spell from the arcane, divine, occult, or primal list of 4th level or lower. The spell can’t have a cost, nor can its casting time be more than 10 minutes. The spell must be able to target a single creature, and you must be a valid target for it.
Whether from jury-rigged magic items, deduction from the study of magical interactions, or other means, you have a contingency in your back pocket for desperate situations.
When the trigger occurs, you cause the spell to come into effect. The spell targets only you, no matter how many creatures it would affect normally.
If you define particularly complicated conditions, as determined by the GM, the trigger might fail.
Once the contingency is triggered, the spell is expended until your next daily preparations.
{{||SpellSummaryTable}}
You rarely settle for being in just one place.
Choose a location within 100 feet of the target that the target can see.
You create an illusion of yourself there that only it can see and that mimics all your actions.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
If a spell is meant to respond only to certain events or under certain conditions—such as magic mouth—it might require you to set a trigger. This is a simple sensory cue that causes the spell to activate.
The spell activates as a [[Reaction]] when the spell’s sensor observes something that fits its trigger. Depending on the spell, the trigger might be the presence of a type of creature, such as “red-haired dwarven women,” or it could be an observed action, such as “whenever someone enters the spell’s area.”
Disguises and illusions fool the spell as long as they appear to match its parameters.
For a spell to detect something visually, the spell’s origin point must have line of sight.
Darkness doesn’t prevent this, but invisibility does, as does a successful [[Stealth]] check to [[Hide]] (against the spell’s DC).
For auditory detection, line of sight isn’t necessary, though the sound must be audible at the spell’s origin point. A [[Stealth]] check to [[Sneak]] can fool the sensor.
''Requirements'' You have at least one hand free. Your target can’t be more than one size larger than you //unless you have [[Titan Wrestler]], in which case it can be two or three sizes larger depending on your proficiency in Athletics.//
You try to knock an opponent to the ground.
Attempt an [[Athletics]] check against the target’s [[Reflex]] DC.
{{||ActionSuccessTable}}
You can use this weapon to [[Trip]] with the [[Athletics]] skill even if you don’t have a free hand.
This uses the weapon’s reach (if different from your own) and adds the weapon’s item bonus to attack rolls as an item bonus to the Athletics check.
If you critically fail a check to Trip using the weapon, you can drop the weapon to take the effects of a failure instead of a critical failure.
You can quickly fire multiple shots with greater control.
When you use [[Double Shot]], you can make the attacks against the same target.
You can add an additional action to Double Shot to make three ranged Strikes instead of two. If you do, the penalty is –4.
All attacks count toward your multiple attack penalty, but the penalty doesn’t increase until after you’ve made all of them.
You can divide your attention three ways when hunting.
When you use Hunt Prey, you can designate three creatures as prey, designate two creatures as prey and share the effect with one ally (as [[Shared Prey]]), or designate one creature as prey and share the effect with two allies.
{{||SpellSummaryTable}}
You dance at a lively tempo, speeding your allies’ movement.
You and all allies in the area gain a +10-foot status bonus to all Speeds for 1 round.
If you put this large opalescent conch shell to your ear, you can hear the sound of the roaring sea crashing against the shore.
''Activate'' {{OneAction}} [[Interact]] <<tag Auditory>>; ''Effect'' You can raise the conch to your lips and blow into it, letting out a long, rumbling note. For the next minute, you and all allies who were within 30 feet of you when you activated the conch gain a +2 item bonus to [[Athletics]] checks to [[Swim]] and can breathe under water.
''Trigger'' You critically hit a foe with a melee weapon Strike or a melee unarmed attack.
With a triumphant shout, you inspire your allies.
You cast a composition cantrip you know that normally takes a single action to cast.
A troop is an organized collection of component creatures, typically Small or Medium in size, working as a cohesive whole.
A troop is 16 squares in size and has two Hit Point thresholds in their HP entry, under which it reduces in size to 12 squares and then 8 squares.
A troop has the [[Troop Defenses]], [[Form Up]], and Troop Movement abilities. //(Troop Movement varies depending on the type of Troop.)//
Most troops have a weakness to area damage.
Because they consist of multiple discrete creatures, they can’t be summoned.
Troops are composed of many individuals, and over the course of enough attacks and downed comrades, troops shrink in size.
Most troops start with 16 squares (4 by 4), and their Hit Points have two listed thresholds, typically the first is at 2/3 their maximum Hit Points and the second is at 1/3 their maximum Hit Points. Once the troop drops below the first threshold, it loses 4 squares, leaving 12 squares remaining, and the first threshold becomes the troop’s new maximum Hit Points. Once the troop falls below the second threshold, it loses another 4 squares, leaving 8 squares remaining, and the second threshold becomes the troop’s new maximum Hit Points.
In order to restore its size and maximum Hit Points, a troop needs to spend downtime to use long-term treatment on casualties or recruit new members to replace the fallen. At 0 Hit Points, the troop is reduced down to 4 squares, which is too few to sustain the troop, so it disperses entirely, with the few remaining members surrendering, fleeing, or easily dispatched, depending on their nature.
A damaging single-target effect, such as a [[Strike]], can’t force a troop to pass through more than one threshold at once. For instance, if a troop had 60 Hit Points, with thresholds at 40 and 20, a Strike for 50 damage would leave the troop at 21 Hit Points, just above the second threshold.
A damaging area effect or multi-target effect can cross multiple thresholds at once and could potentially destroy the entire troop in one shot.
Non-damaging effects with an area or that target all creatures in a certain proximity affect a troop normally if they affect the entire area occupied by the troop. If an effect has a smaller area or numbers of targets, it typically has no effect on the troop.
However, if the effect can target at least four creatures or cover at least four squares in the troop, and if it would prevent its targets from acting, cause them to flee, or otherwise make them unable to function as part of the troop for a round or more, the troop loses loses a number of Hit Points equal to the amount required to bring it to the next threshold, removing 4 squares.
If an effect would both deal damage and automatically cross a threshold due to incapacitating some of the creatures in the troop, apply the damage first. If the damage wasn’t enough to cross a threshold on its own, then reduce the Hit Points to cross the threshold for the incapacitating effect.
''Prerequisites'' Greater Debilitating Bomb
Ever inventive, you have discovered increasingly devastating ways for your bombs to impede and hamper your foes.
When you use [[Debilitating Bomb]], add the following to the list of effects you can choose from: [[Enfeebled]] 2, [[Stupefied]] 2, or a –15-foot status penalty to Speeds.
If you instead apply one of the effects listed in Debilitating Bomb, the target avoids the effect only if the result of its saving throw is a critical success.
Your mind works at an incredible pace.
You instantly use up to five [[Recall Knowledge]] actions.
If you have any special abilities or free actions that would normally be triggered when you Recall Knowledge, you can’t use them for these actions.
Your perceptive abilities and ability to process sensory information are so far beyond the pale that you notice minute discrepancies in all sorts of illusions and transmutations.
You are constantly under the effects of a 6th-level [[True Seeing]] spell, using your Perception modifier for the [[Counteract]] check.
{{||SpellSummaryTable}}
You see things within 60 feet as they actually are.
The GM rolls a <<tag Secret>> [[Counteract]] check against any <<tag Illusion>> or <<tag Transmutation>> in the area, but only for the purpose of determining whether you see through it (for instance, if the check succeeds against a <<tag Polymorph>> spell, you can see the creature’s true form, but you don’t end the polymorph spell).
You transcend the limitations of form.
While under the effects of [[Wild Shape]], you can change into any other form on your wild shape list; if the durations of the forms would vary, use the shorter of the two durations.
Once per day, you can transform into a kaiju, with the effects of [[Nature Incarnate]]; if you have Plant Shape, you can instead transform into a green man.
{{||SpellSummaryTable}}
A glimpse into the future ensures your next blow strikes true.
The next time you make an attack roll before the end of your turn, roll the attack twice and use the better result.
The attack ignores circumstance penalties to the attack roll and any flat check required due to the target being [[Concealed]] or [[Hidden]].
{{||SpellSummaryTable}}
You delve into the possible futures of the next few seconds to understand all the ways your target might avoid harm, then cast out a vision of that future to those around you.
On the first attack roll made against the target during true target’s duration, the attacker rolls twice and uses the better result.
The attacker also ignores circumstance penalties to the attack roll and any flat check required due to the target being [[Concealed]] or [[Hidden]].
Upon drinking this clear, refreshing potion, you can see things as they actually are.
You gain the benefits of a 7th-level [[True Seeing]] spell that has a counteract modifier of +25.
It is paramount that you are understood and you understand others; language need not impede your message.
You can cast [[Tongues]] as a 5th-level divine innate spell once per day on yourself only.
You gain a +1 status bonus to [[Diplomacy]] checks for the duration of the spell when speaking to creatures with whom you already shared a language before casting.
For 10 minutes after drinking this astringent potion, you can’t intentionally lie and may be compelled to tell the truth.
Upon drinking the potion, attempt a DC 19 [[Will]] save. You can voluntarily fail or critically fail.
{{||SaveSuccessTable}}
You tumble under and behind your foe to catch them off guard.
When you successfully [[Tumble Through]], the foe whose space you passed through is [[Flat-Footed]] against the next attack you make before the end of your turn.
You [[Stride]] up to your Speed.
During this movement, you can try to move through the space of one enemy. Attempt an [[Acrobatics]] check against the enemy’s [[Reflex]] DC as soon as you try to enter its space. You can Tumble Through using [[Climb]], [[Fly]], [[Swim]], or another action instead of Stride in the appropriate environment.
{{||ActionSuccessTable}}
''Frequency'' once per minute.
''Requirements'' Your most recent action was to [[Tumble Through]] or [[Tumbling Strike]], and you successfully moved through an enemy’s space.
You use a burst of stamina to perform a breathtaking feat of Acrobatics as you speed through a foe’s space, leaving your foe lying flat on their back.
You attempt to [[Trip]] the enemy whose space you moved through. You can use [[Acrobatics]] instead of Athletics for this check.
''Requirements'' You are adjacent to an enemy.
Attempt an [[Acrobatics]] check against the [[Reflex]] DC of an enemy adjacent to you.
{{||ActionSuccessTable}}
You gain the [[Quick Squeeze]] feat as a bonus feat, even if you aren’t trained in [[Acrobatics]]. Tight spaces not tight enough to require the [[Squeeze]] action aren’t [[Difficult Terrain]] for you.
You grew up in a warren crisscrossed by underwater passages, whether natural or excavated. You gain a [[Swim]] Speed of 15 feet.
{{LOCGFeat}}
''Prerequisites'' You have a spellcasting class feature with the [[Divine]] or [[Primal]] tradition.
Add the [[Summon Construct]] spell to your spell list. The constructs you summon have a distinct ivory scrimshaw appearance, and if you include a drop of blood, lock of hair, or other portion of a creature’s body as part of the spell’s material component, the summoned construct gains a +4 status bonus to [[Perception]] checks to sense or locate that creature.
!! Step 1: Start Your Turn
Many things happen automatically at the start of your turn— it’s a common point for tracking the passage of time for effects that last multiple rounds.
At the start of each of your turns, take these steps in any order you choose:
* If you created an effect lasting for a certain number of rounds, reduce the number of rounds remaining by 1. The effect ends if the duration is reduced to 0. For example, if you cast a spell that lasts 3 rounds on yourself during your first turn of a fight, it would affect you during that turn, decrease to 2 rounds of duration at the start of your second turn, decrease to 1 round of duration at the start of your third turn, and expire at the start of your fourth turn.
* You can use 1 free action or reaction with a trigger of “Your turn begins” or something similar.
* If you’re [[Dying]], roll a [[Recovery Check]] (page 459).
* Do anything else that is specified to happen at the start of your turn.
The last step of starting your turn is always the same: Regain your 3 actions and 1 reaction.
If you haven’t spent your reaction from your last turn, you lose it—you can’t “save” actions or reactions from one turn to use during the next turn.
If a condition prevents you from being able to act, you don’t regain any actions or your reaction.
Some abilities or conditions (such as quickened and slowed) can change how many actions you regain and whether you regain your reaction.
If you lose actions and gain additional actions (such as if you’re both quickened and slowed), you choose which actions to lose.
// If you're [[Petrified]] or [[Unconscious]], you can't act. //
// If you're [[Quickened]], you gain one extra action at the start of your turn. There may be restrictions on what this action can be used for. //
// If you're [[Stunned]], for each action you would otherwise gain, reduce your Stunned value by 1 and do not gain that action. When your Stunned value reaches 0, gain actions as normal. //
// If you're [[Slowed]], reduce the number of actions you gain by your slowed value. Do this ''after'' counting off actions lost to being stunned. In the turn when your Stunned value reaches 0, count any actions lost to being Stunned as also lost to being Slowed. //
!! Step 2: Act
You can use actions in any order you wish during your turn, but you have to complete one action or activity before beginning another; for example, you can’t use a single action in the middle of performing a 2-action activity.
What actions you can use often depend on your class features, skills, feats, and items, but there are default actions anyone can use, described in Basic Actions.
Some effects might prevent you from acting. If you can’t act, you can’t use any actions, including reactions and free actions.
If you begin a 2-action or 3-action activity on your turn, you must be able to complete it on your turn. You can’t, for example, begin to High Jump using your final action on one turn and then complete it as your first action on your next turn.
Once you have spent all 3 of your actions, your turn ends (as described in Step 3) and the next creature’s turn begins.
You can, however, use only some of your actions and end your turn early. As soon as your turn ends, you lose all your remaining actions, but not your reaction or your ability to use free actions.
// If you're [[Confused]], then you use all of your actions to attack random targets. //
// If you're [[Fleeing]], then you use all your actions to run away from what you're fleeing from. //
// If you're [[Controlled]], then you controller chooses how you act. //
// If you're [[Paralyzed]], you can't take any actions other than mental ones. //
!! Step 3: End Your Turn
Once you’ve done all the things you want to do with the actions you have available, you reach the end of your turn.
Take the following steps in any order you choose. Play then proceeds to the next creature in the initiative order.
* End any effects that last until the end of your turn. For example, spells with a sustained duration end at the end of your turn unless you used the [[Sustain a Spell]] action during your turn to extend them. Some effects caused by enemies might also last through a certain number of your turns, and you decrease the remaining duration by 1 during this step, ending the effect if its duration is reduced to 0.
* If you have a [[Persistent Damage]] condition, you take the damage at this point. After you take the damage, you can attempt the flat check to end the persistent damage. // (This is usually a DC 15 flat check.) // You then attempt any saving throws for ongoing [[Affliction]]s. Many other conditions change at the end of your turn, such as the [[Frightened]] condition decreasing in severity. These take place after you’ve taken any persistent damage, attempted flat checks to end the persistent damage, and attempted saves against any afflictions.
* You can use 1 [[Free]] action or [[Reaction]] with a trigger of “Your turn ends” or something similar.
* Resolve anything else specified to happen at the end of your turn.
''The following things have effects at the __start__ of the __user__'s __next__ turn after they are used:''
<table>
<$list filter="[has[turn-sun]sort[]]">
<tr><th><$link/></th><td>{{!!turn-sun}}</td></tr>
</$list>
</table>
''The following things have effects at the __start__ of the __target__'s __next__ turn after they are used:''
<table>
<$list filter="[has[turn-stn]sort[]]">
<tr><th><$link/></th><td>{{!!turn-stn}}</td></tr>
</$list>
</table>
''The following things have effects at the __end__ of the __user__'s __current__ turn:''
<table>
<$list filter="[has[turn-euc]sort[]]">
<tr><th><$link/></th><td>{{!!turn-euc}}</td></tr>
</$list>
</table>
''The following things have effects at the __end__ of the __user__'s __next__ turn:''
<table>
<$list filter="[has[turn-eun]sort[]]">
<tr><th><$link/></th><td>{{!!turn-eun}}</td></tr>
</$list>
</table>
''The following things have effects at the __end__ of their __target__'s __current__ turn:''
<table>
<$list filter="[has[turn-etc]sort[]]">
<tr><th><$link/></th><td>{{!!turn-etc}}</td></tr>
</$list>
</table>
''The following things have effects at the __end__ of their __target__'s __next__ turn:''
<table>
<$list filter="[has[turn-etn]sort[]]">
<tr><th><$link/></th><td>{{!!turn-etn}}</td></tr>
</$list>
</table>
//Implied by [[Spell Turning]].//
When a spell targets you, //while under the effect of Spell Turning//, you can spend a reaction to attempt to reflect it.
Undead harmed by your positive energy might flee, compelled by an innate aversion to the
force opposite undeath.
When you use a [[Heal]] spell to damage undead, each undead of your level or lower that critically fails its save gains the [[Fleeing]] condition for 1 round.
''Access'' You must befriend at least one Turpin Rowe logger.
Your logging training has made you intimately familiar with all aspects of forestry, and you have trained extensively to reach around trees and utilize their bulk to your advantage.
You become trained in Milling [[Lore]] and Forest Lore, or an expert if you were already trained.
You can always [[Take Cover]] when you are within forest terrain to gain cover, even if you’re not next to an obstacle you can Take Cover behind.
In addition, any enemy who gains standard cover from a tree gains only lesser cover against your attacks (or only standard cover, if the enemy otherwise gains greater cover).
<<archetypefeatlist "4 6 10" "[[Turpin Rowe Lumberjack]]">>
Most half-orcs have visible tusks, but yours are particularly large and sharp, capable of gouging deep wounds.
You gain a jaws unarmed attack that deals 1d6 piercing damage.
''Special'' You can take this feat only at 1st level, and you can’t retrain out of this feat or into this feat.
//This feat is probably a misprint, since a Half-Orc can take the [[Tusks (Orc)]] feat which gives a similar effect but more precisely specified.//
You have particularly long, jagged tusks perfect for tearing meat from bone.
You gain a tusks unarmed attack that deals 1d6 piercing damage. Your tusks are in the brawling group and have the [[Finesse]] and [[Unarmed]] traits.
''Special'' You can take this feat only at 1st level, and you can’t retrain into this feat. You can retrain out of this feat only through drastic measures such as breaking or filing your tusks.
{{AoA3Feat}}
You spend 1 minute making quick adjustments to someone’s clothing and appearance, causing their words to carry more weight with an audience of your choice.
While speaking to that audience, the target gains a +1 item bonus to [[Diplomacy]] and [[Performance]] checks.
If you have master proficiency in [[Crafting]], the bonus increases to +2; if you have legendary proficiency in Crafting, the bonus increases to +3.
This bonus lasts until this ability is used on the target again, the situation they were prepared for ends, or they next change their outfit.
You gain [[Low-Light Vision]].
These weapons are used as a pair, complementing each other.
When you attack with a twin weapon, you add a circumstance bonus to the damage roll equal to the weapon’s number of damage dice if you have previously attacked with a different weapon of the same type this turn.
The weapons must be of the same type to benefit from this trait, but they don’t need to have the same [[Rune]]s.
''Requirements'' You are wielding two melee weapons, each in a different hand.
Your movements with two weapons are so swift and disorienting that they befuddle your opponent.
When using [[Twin Feint]], if both your [[Strike]]s deal damage to a targeted creature, the target must succeed at a [[Will]] saving throw against your class DC or become [[Stupefied]] 1 until the end of your next turn.
''Requirements'' You are wielding two melee weapons, each in a different hand.
You make a dazzling series of attacks with both weapons, using the first attack to throw your foe off guard against a second attack at a different angle.
Make one [[Strike]] with each of your two melee weapons, both against the same target.
The target is automatically [[Flat‑Footed]] against the second attack.
Apply your multiple attack penalty to the Strikes normally.
''Requirements'' You are wielding two melee weapons, one in each hand.
You use your two weapons to parry attacks.
You gain a +1 circumstance bonus to AC until the start of your next turn, or a +2 circumstance bonus if either weapon has the [[Parry]] trait.
You lose this circumstance bonus if you no longer meet this feat’s requirement.
''Trigger'' A creature within your reach critically fails a Strike against you.
''Requirements'' You are benefiting from [[Twin Parry]].
A clever parry with one weapon leaves your opponent open to an attack with the other weapon.
Make a melee [[Strike]] or use a [[Disarm]] action against the triggering opponent.
''Frequency'' once per round.
''Requirement'' You are wielding two melee weapons, each in a different hand.
You swiftly attack your hunted prey with both weapons.
Make two [[Strike]]s against your hunted prey, one with each of the required weapons.
If both hit the same hunted prey, combine their damage for the purpose of its resistances and weaknesses. Apply your [[Multiple Attack Penalty]] to each [[Strike]] normally.
''Requirements'' You are wielding two melee weapons, one in each hand.
You’re always ready to use your off-hand weapon to interfere with attacks against you.
While you are in this stance, you constantly gain the benefits of the [[Twin Parry]] action.
''Prerequisites'' ability to cast [[Heal]] and [[Harm]]
Your connection to both life and undeath lets you twist the healing power of magic items to suit your own needs and aims.
Whenever you Activate an Item to cast a [[Heal]] spell, you can invert its energy to produce the effects of an equivalent [[Harm]] spell instead.
''Requirements'' Your last action was a melee [[Strike]] that dealt sneak attack damage to a [[Flat-Footed]] target.
After stabbing your opponent in a weak spot, you tear the wound open.
You deal persistent bleed damage to the target equal to your number of sneak attack damage dice.
You are naturally suspicious and wary of danger, especially when you suspect someone might be leading you into an ambush.
You gain a +1 circumstance bonus to AC and saves against hazards, and to all of your [[Initiative]] rolls. If at least one of your opponents is using [[Deception]] or [[Diplomacy]] to determine their initiative, your bonus to initiative from this feat increases to +4.
This weapon can be wielded with two hands.
Doing so changes its weapon damage die to the indicated value.
This change applies to all the weapon’s damage dice, such as those from [[Striking]] runes.
''Requirements'' You are wielding two weapons, each in a different hand.
You lash out with both your weapons in a sudden frenzy.
[[Strike]] twice, once with each weapon.
<svg xmlns="http://www.w3.org/2000/svg" width="1.5em" height="1em" viewBox="0 0 150 100">
<polygon points="100,5 145,50 100,95 55,50" fill="black" stroke="white" stroke-width="7" />
<polygon points="50,0 100,50 50,100 0,50" fill="black" stroke="white" stroke-width="7" />
<polyline points="0,50 25,25 50,50 25,75" stroke="white" fill="black" stroke-width="7" />
</svg>
Might makes right, and you subjugate the weak to keep them in their proper place.
* You must never perform acts anathema to your deity or willingly commit a purely good act, such as giving something solely out of charity, casting a good spell, or using a good item.
* You must never put another person’s needs before your own, and you must never put your own needs before those of your deity. Though you can perform acts others might consider helpful, it must be done with the expectation that it ultimately furthers your own goals or those of your master.
* Let no one who is lesser than you wield power over you or lead you.
* Mercilessly enforce established hierarchies of masters and servants. Topple or seize control of illegitimate hierarchies, such as democratic governments or the arrogant echelons of the celestial planes, and fill power vacuums by taking that power for yourself.
* Bind the weak to serve you. (This tenet doesn’t require you to spare foes’ lives if you think they would be disloyal if pressed into servitude, nor does it require you to keep more servants than you find practical or useful.)
You gain the [[Touch of Corruption]] devotion spell. Your champion's reaction is [[Iron Command]].
You can prepare a seemingly impossible number of snares in advance, and you’re ready to spring them on unsuspecting foes.
Double the number of prepared snares from [[Snare Specialist]].
//This feat was originally Uncommon, but was presented as a regular feat in the Advanced Player's Guide.//
Your experience keeps you on your toes, allowing you to adapt to even the most dangerous challenges.
When you gain a fighter feat using [[Combat Flexibility]], you gain three fighter feats instead of one.
The first feat must still be 8th level or lower, the second feat can be up to 14th level, and the third feat can be up to 18th level.
You can use the first feat to meet the prerequisites of the second or third feats and the second feat to meet the prerequisites of the third feat. You must meet all feats’ prerequisites.
In addition, you can adapt to the battlefield’s challenges by spending 1 hour to train. If you do, you can reselect the feats chosen with combat flexibility as if you had made your daily preparations.
Your mercy transcends the bounds of life and death.
When you use [[Mercy]], you can cast [[Lay on Hands]] on a creature that died since your last turn to return it to life.
The target returns to life with 1 hit point and becomes [[Wounded]] 1.
You can’t use Ultimate Mercy if the triggering effect was [[Disintegrate]] or a <<tag Death>> effect.
//(Since Mercy isn't a reaction, presumably "the triggering effect" here actually means "the effect that killed the creature".)//
You can flexibly cast all of your spells, granting a dizzying array of possible options.
All of the spells in your repertoire are [[Signature Spells]] for you.
You are so skilled at navigating the wild, your movement is completely unaffected by terrain.
You ignore the effects of all [[Difficult Terrain]], greater difficult terrain, and hazardous terrain, and you don’t trigger traps and hazards that are triggered by moving into an area (such as trip wires and pressure plates), unless you want to.
An unarmed attack uses your body rather than a manufactured weapon.
An unarmed attack isn’t a weapon, though it’s categorized with weapons for weapon groups, and it might have weapon traits.
Since it’s part of your body, an unarmed attack can’t be [[Disarm]]ed.
It also doesn’t take up a hand, though a fist or other grasping appendage follows the same rules as a [[Free-Hand]] weapon. //(You can’t attack with a free-hand weapon if you’re wielding anything in that hand or otherwise using that hand.)//
{{LOCGFeat}}
Your family instilled the values of care and patience into you from a young age.
You gain a +1 circumstance bonus to checks to perform a <<tag Downtime>> activity.
You find it difficult to understand and express complex emotions.
You take a –1 circumstance penalty to [[Diplomacy]] and [[Performance]] checks, and on [[Perception]] checks to [[Sense Motive]].
Interweaving your most powerful attacks in a graceful flow, you temporarily unbalance your foes.
Whenever your [[Strike]] is a critical hit and deals damage, the target is [[Flat‑Footed]] against your attacks until the end of your next turn.
You make a great sweep about yourself, knocking creatures off their feet and away from you.
Choose up to three adjacent foes and choose whether to [[Shove]] or [[Trip]] all three of them.
Whichever of the two options you choose, roll a separate [[Athletics]] check against each foe, performing the same action against each foe.
Each attempt counts toward your [[Multiple Attack Penalty]], but don’t increase your penalty until you have made all the attempts.
{{||SpellSummaryTable}}
''Requirements'' Your previous action was a successful unarmed Strike.
You light your foe with revealing flame.
The GM attempts a secret [[Counteract]] check against each illusion affecting the creature; on a success, you suppress the illusion for the duration, rather than end the effect.
//Implied by [[Bottle the Storm]].//
If you successfully prevent damage in this way, at any time during the spell’s duration, you can spend a single action, which has the Attack trait, to expend the charge and make a melee spell attack at an adjacent target or a ranged spell attack at a target within 60 feet.
This attack deals electricity damage equal to the damage prevented by bottle the storm.
You gain 10 Hit Points from your ancestry instead of 6. When you fall, reduce the [[Falling]] damage you take as though you had fallen half the distance.
As hard as most unbreakable goblins are to break, you are that much harder to break.
You gain 20 Hit Points from your ancestry instead of 10.
When you fall, you take no falling damage.
If you have the [[Bouncy Goblin]] feat, after falling or jumping from a height of at least 20 feet, you can bounce back into the air, up to half the distance you fell (and half as far forward if you jumped).
These bounces continue until you bounce less than 20 feet.
{{||SpellSummaryTable}}
You unleash a mighty wave from your hand that buffets back your foes.
Each creature in the area must attempt a [[Fortitude]] saving throw.
If a creature pushed by unbreaking wave advance would be pushed into a solid barrier or another creature, it stops at that point and takes 3d6 damage.
''Heightened (+1)'' The damage for pushing a creature into a solid barrier increases by 1d6.
{{||SaveSuccessTable}}
Ignore the reduction to your Speed from any armor you wear.
In addition, any time you’re taking a penalty to your Speed from some other reason (such as from the [[Encumbered]] condition or from a spell), deduct 5 feet from the penalty. For example, the encumbered condition normally gives a –10-foot penalty to Speed, but it gives you only a –5-foot penalty.
If your Speed is taking multiple penalties, pick only one penalty to reduce.
You have near-supernatural poise that lets you move swiftly across the most unsteady surfaces.
You gain the [[Steady Balance]] skill feat.
You can [[Step]] into [[Difficult Terrain]] caused by uneven ground, such as a rocky field or hilly incline.
You have a keen sense of movement around you.
You gain [[Motion Sense]] as an [[Imprecise]] sense out to 30 feet. Motion sense allows you to detect nearby motion through vibration and air movement.
''Prerequisite'' [[Far Lobber]].
You lob bombs unerringly, despite obstructions or distance.
When you throw an alchemical item with the <<tag Bomb>> trait, its [[Range Increment]] increases to 60 feet, you reduce any circumstance bonus to the target’s [[AC]] from cover by 1, and you automatically succeed at the flat check when targeting a [[Concealed]] creature.
You squirrel away useful objects and seem to retrieve them at just the right time.
You gain the [[Prescient Consumable]] and [[Prescient Planner]] feats, except that you always withdraw the objects from your cheek pouches.
This means the object you retrieve must fit in your cheek pouches; this is generally an item of negligible Bulk unless you also have the [[Cheek Pouches]] feat.
You gain the [[Deny Advantage]] class feature.
You’re sleeping, or you’ve been knocked out.
You can’t act.
You take a –4 status penalty to [[AC]], [[Perception]], and [[Reflex]] saves, and you have the [[Blinded]] and [[Flat-Footed]] conditions.
When you gain this condition, you fall [[Prone]] and drop items you are wielding or holding unless the effect states otherwise or the GM determines you’re in a position in which you wouldn’t.
If you’re unconscious because you’re [[Dying]], you can’t wake up while you have 0 Hit Points. If you are restored to 1 Hit Point or more via healing, you lose the dying and unconscious conditions and can act normally on your next turn.
If you are unconscious and at 0 Hit Points, but not dying, you naturally return to 1 Hit Point and awaken after sufficient time passes. The GM determines how long you remain unconscious, from a minimum of 10 minutes to several hours. If you receive healing during this time,you lose the unconscious condition and can act normally on your next turn.
If you’re unconscious and have more than 1 Hit Point (typically because you are asleep or unconscious due to an effect), you wake up in one of the following ways. Each causes you to lose the unconscious condition.
* You take damage, provided the damage doesn’t reduce you to 0 Hit Points. If the damage reduces you to 0 Hit Points, you remain unconscious and gain the dying condition as normal.
* You receive healing, other than the natural healing you get from resting.
* Someone shakes you awake with an [[Interact]] action.
* There’s loud noise going on around you—though this isn’t automatic. At the start of your turn, you automatically attempt a [[Perception]] check against the noise’s DC (or the lowest DC if there is more than one noise), waking up if you succeed. If creatures are attempting to stay quiet around you, this Perception check uses their [[Stealth]] DCs. Some magical effects make you sleep so deeply that they don’t allow you to attempt this Perception check.
* If you are simply asleep, the GM decides you wake up either because you have had a restful night’s sleep or something disrupted that rest.
//You lose all [[Cover|Take Cover]] when you are knocked Unconscious.//
{{||SpellSummaryTable}}
The target is overcome with an all-consuming urge to dance.
For the duration of the spell, the target is [[Flat-Footed]] and can’t use [[Reaction]]s.
While affected, the creature can’t use actions with the <<tag Move>> trait except to dance, using the [[Stride]] action to move up to half its Speed.
{{||SaveSuccessTable}}
//You must be trained in the weapon you chose for [[Unconventional Weaponry]] to take this.//
You’ve continued to advance your powers using your unconventional weapon. Whenever you gain a class feature that grants you expert or greater proficiency in certain weapons, you also gain that proficiency in the weapon you chose for Unconventional Weaponry.
You’ve familiarized yourself with a particular weapon, potentially from another ancestry or culture.
Choose an uncommon simple or martial weapon with a trait corresponding to an ancestry (such as <<tag Dwarf>>, <<tag Goblin>>, or <<tag Orc>>) or that is common in another culture.
You gain access to that weapon, and for the purpose of determining your proficiency, that weapon is a simple weapon.
If you are trained in all martial weapons, you can choose an uncommon advanced weapon with such a trait. You gain access to that weapon, and for the purpose of determining your proficiency, that weapon is a martial weapon.
Your spirit has endured many challenges over its long existence, and you are certain you can overcome whatever hardships life throws your way.
You gain a +1 circumstance bonus to saves against <<tag Emotion>> effects. If you roll a success on a saving throw against an emotion effect, you get a critical success instead.
''Prerequisites'' an [[Animal Companion|Animal Companions]] or a [[Familiar|Familiar (Rule)]]
Your companion is also touched by undeath, a mix of a traditional companion and a skeleton, zombie, or stranger form of unlife.
Your companion gains the <<tag Undead>> trait instead of the <<tag Animal>> trait and gains [[Negative Healing]].
It otherwise uses the normal rules for an animal companion or familiar; that means it can still be affected by many conditions or effects to which most undead are immune.
Your knowledge of your own not-quite-living anatomy, combined with your experience in combat, helps you take down undead foes with ease.
Against <<tag Undead>> creatures, you gain a circumstance bonus to damage with weapons and unarmed attacks equal to the number of weapon damage dice for the [[Strike]].
This bonus increases to double the number of weapon damage dice if your target has the <<tag Vampire>> trait.
{{||SpellSummaryTable}}
You instill within a creature the touch of the grave.
If the target wishes to avoid the spell, it can attempt a [[Will]] save to reduce the effects. //If it doesn't want to save, it gets the failure effect.//
''Heightened (+1)'' The status bonus to the Hit Points restored increases by 2.
{{||SaveSuccessTable}}
You’re connected to groups that know what’s going on in the streets, and you can get information out of them quickly.
When you use [[Society]] to [[Gather Information]] in an area where you have a network (typically a settlement where you’ve spent at least a week or spent a day of downtime to build a network faster), you can contact a member of these groups to get information directly from them.
This usually takes about an hour, and it doesn’t draw as much attention as Gathering Information in public might. The check and information gained otherwise follow the normal rules for Gather Information.
In addition, if you have successfully consulted the underground network, you get a +1 circumstance bonus to the next check to [[Recall Knowledge]] you attempt about the subject you were Gathering Information on, or a +2 circumstance bonus if you’re using [[Underworld Lore]] for the check.
The GM might change the Lore skill related to the network depending on your location or the specifics of the network you’re tapping into.
You capitalize on the distraction provided by an ally.
You [[Sneak]] up to a foe adjacent to one of your allies.
You can roll against the foe you’re Sneaking up on, even if it’s currently observing you, as though you were [[Hidden]].
You take a –2 penalty on your Stealth check.
If your Stealth check against the chosen foe succeeds, you can make a melee [[Strike]] against that foe at the end of your Sneak.
{{||SpellSummaryTable}}
You lash a target with tendrils of shadow that steal some of its substance, making it quasi-real.
As long as it is quasireal, its [[Strike]]s deal half damage, it can’t critically succeed at any skill check, and creatures attempting saving throws against its spells and effects get a result one degree of success better than they rolled.
The target must attempt a [[Will]] saving throw.
{{||SaveSuccessTable}}
''Prerequisites'' Trained in [[Athletics]].
You’ve learned to fight underwater.
You are not [[Flat-Footed]] while in water.
You don’t take the usual penalties for using a [[Bludgeoning]] or [[Slashing]] melee weapon in water.
You can cast [[Volcanic Eruption]] as a 7th-level primal innate spell once per day, except that you can only evoke the volcano on the floor of a body of water, and the effects that normally happen to flying creatures happen to swimming creatures instead.
Your work as an investigator makes you familiar with the criminal element. You might be a criminal yourself, or you might have gained an understanding of how they operate from the outside.
You become trained in Underworld [[Lore]], and you gain your [[Pursue a Lead]] circumstance bonus to [[Thievery]] checks to investigate the subject of your lead (such as checks to [[Steal]] a clue from a suspect or [[Pick a Lock]] to open a safe with damning documents).
{{||SpellSummaryTable}}
You shroud a creature in wards that hide its alignment.
The target appears to be neutral to all effects that would detect its alignment.
If a creature is Undetected, you don’t know what space it occupies, you’re [[Flat-Footed]] to it, and you can’t easily target it.
Using the [[Seek]] basic action can help you find an undetected creature, usually making it [[Hidden]] from you instead of undetected.
If a creature is undetected, that doesn’t necessarily mean you’re unaware of its presence—you might suspect an undetected creature is in the room with you, even though you’re unable to find its space. The [[Unnoticed]] condition covers creatures you’re entirely unaware of.
Targeting an undetected creature is difficult. If you suspect there’s a creature around, you can pick a square and attempt an attack. This works like targeting a hidden creature, but the flat check //(against DC 11)// and attack roll are both rolled in secret by the GM. The GM won’t tell you why you missed—whether it was due to failing the flat check, rolling an insufficient attack roll, or choosing the wrong square.
The GM might allow you to try targeting an undetected creature with some spells or other abilities in a similar fashion. Undetected creatures are subject to area effects normally.
For instance, suppose an enemy elf wizard cast [[Invisibility]] and then [[Sneak]]ed away. You suspect that with the elf’s Speed of 30 feet, they probably moved 15 feet toward an open door. You move up and attack a space 15 feet from where the elf started and directly on the path to the door. The GM secretly rolls an attack roll and flat check, but they know that you were not quite correct— the elf was actually in the adjacent space! The GM tells you that you missed, so you decide to make your next attack on the adjacent space, just in case. This time, it’s the right space, and the GM’s secret attack roll and flat check both succeed, so you hit!
//You are Undetected to everyone when [[Invisible]].//
A water elemental ancestor influences your bloodline.
You gain the <<tag Undine>> trait, in addition to the traits from your ancestry.
You gain a swim Speed of 10 feet and the <<tag Amphibious>> trait. Like all creatures with the amphibious trait, you can breathe both water and air.
You can choose from undine feats and feats from your ancestry whenever you gain an ancestry feat.
{{||VHerFeatList}}
You resist death’s clutches with supernatural vigor.
When you use [[Orc Ferocity]], you gain temporary Hit Points equal to your level.
Uneven ground is an area unsteady enough that you need to [[Balance]] or risk falling [[Prone]] and possibly injuring yourself, depending on the specifics of the uneven ground.
You are [[Flat-Footed]] on uneven ground.
Each time you are hit by an attack or fail a save on uneven ground, you must succeed at a [[Reflex]] save (with the same DC as the Acrobatics check to [[Balance]]) or fall prone.
''Trigger'' You would take damage from an attack, spell, or other effect.
Your supernatural connection sometimes causes you to phase from reality when under threat, disappearing for split seconds before reappearing—often surprising you as much as your enemies.
Roll a DC 16 flat check. On a success, you gain resistance to all damage equal to your level against the triggering effect, you gain a +2 circumstance bonus to saving throws against that effect until the start of your turn, and you gain the [[Dazzled]] condition for 1 round.
{{||SpellSummaryTable}}
Fleeting notes of a strange and unnatural song fill the air, overtaking the mind.
Each target must attempt a [[Will]] save when you cast the spell, and again each time you [[Sustain the Spell|Sustain a Spell]].
A creature needs to attempt only one save against the song each round, and you have to keep the same targets when you Sustain the Spell.
{{||SaveSuccessTable}}
| !Result | !Effect |
| 1 |The target is [[Frightened]] 2. |
| 2 |The target is [[Confused]] for 1 round. |
| 3 |The target is [[Stupefied]] 4 for 1 round. |
| 4 |The target is [[Blinded]] for 1 round. |
| 5 |The target is [[Stunned]] for 1 round and [[Stupefied]] 1 for an unlimited duration. |
You were forced into service as a laborer, either pressed into indentured servitude or shackled by the evils of slavery, but you’ve since escaped and have trained to ensure you’ll never be caught again.
Whenever you roll a success on a check to [[Escape]] or a saving throw against an effect that would impose the [[Grabbed]] or [[Restrained]] condition on you, you get a critical success instead.
Whenever a creature rolls a failure on a check to [[Grapple]] you, they get a critical failure instead. If a creature uses the [[Grab]] ability on you, it must succeed at an [[Athletics]] check to grab you instead of automatically grabbing you.
{{||SpellSummaryTable}}
You free those who travel alongside you from environmental hindrances.
Targets don’t take circumstance penalties to Speed from vegetation, rubble, winds, or other properties of the environment, whether or not the environment is magical, and they ignore [[Difficult Terrain]] from such environmental properties.
''Heightened (9th)'' The targets also ignore greater difficult terrain from environmental properties.
{{||SpellSummaryTable}}
You travel on a rushing wind.
Move two times: two [[Stride]]s, two [[Step]]s, or one Stride and one Step (in either order).
You can Stride or Step into the air during this movement, moving upward at a 45-degree angle at most; if you end your movement in the air, you fall after taking one action or when your turn ends, whichever comes first.
A [[Wall of Wind]] appears in all the spaces you left during this movement, lasting for 1 round.
''Heightened (5th)'' The wall of wind lasts 3 rounds.
__This condition reflects a creature’s disposition toward a particular character, and only supernatural effects (like a spell) can impose these conditions on player characters.__
A creature that is unfriendly to a character dislikes and specifically distrusts that character.
The unfriendly creature won’t accept [[Request]]s from the character.
You won’t allow others to restrain you.
You can cast [[Freedom of Movement]] on yourself as a primal innate spell once per day.
''Usage'' etched onto a weapon without a [[Holy]] rune.
''Craft Requirements'' You are evil.
An unholy rune instills fiendish power into the etched weapon.
A weapon with this rune deals an additional 1d6 <<tag Evil>> damage when it hits a good target.
If you are good, you are [[Enfeebled]] 2 while carrying or wielding this weapon.
''Activate'' {{ReactionIcon}} Command; ''Frequency'' once per day; ''Trigger'' You critically succeed at an attack roll against a good creature with the weapon; ''Effect'' The target takes [[persistent bleed damage|Persistent Damage]] equal to 1d8 per weapon damage die of the etched weapon.
An evil deity’s malice lies within this vial of water.
You activate a vial of unholy water by throwing it as a [[Strike]]. It’s a simple thrown weapon with a range increment of 20 feet. Unlike an alchemical bomb, it doesn’t add the manipulate trait to the attack made with it.
Unholy water deals 1d6 evil damage and 1 evil splash damage. It damages only celestials and creatures that have a weakness to evil damage.
''Prerequisites'' Legendary in [[Arcana]].
You’ve started to make a meaningful connection about the common underpinnings of the four traditions of magic and magical essences, allowing you to understand them all through an arcane lens.
Whenever you use __a skill action__ or a skill feat that requires a [[Nature]], [[Occultism]], or [[Religion]] check, depending on the magic tradition, you can use [[Arcana]] instead.
If you would normally take a penalty or have a higher DC for using Arcana on other magic (such as when using [[Identify Magic]]), you no longer do so.
With a burst of divine liberation, your ally’s movement from your [[Liberating Step]] is unaffected by [[Difficult Terrain]], greater difficult terrain, narrow surfaces, and uneven ground.
{{||SpellSummaryTable}}
Nothing can hold you in place.
You immediately escape from every magical effect that has you [[Immobilized]] or [[Grabbed]] unless the effect is of a higher level than your unimpeded stride spell.
You then [[Stride]]. During this movement, you ignore [[Difficult Terrain]] and any circumstance or status penalties to your Speed.
{{||SpellSummaryTable}}
''Trigger'' You and 1 or more allies within range are targeted by a spell or ability that allows a saving throw.
You put up a united defense.
Each ally can use your saving throw modifier instead of its own against the triggering spell.
Each ally decides individually which modifier to use.
''Frequency'' once per day
You’ve perfected your ability to keep up with all the skills you’ve learned over your long life, so you’re almost never truly untrained at a skill.
You reflect on your life experiences, changing the skills you selected with __[[Ancestral Longevity]]__ and [[Expert Longevity]].
''Prerequisites'' Universalist Wizard.
You can access the fundamental abilities of any school of magic.
During your daily preparations, choose one of the eight school spells gained by 1st-level specialist wizards.
You can use that school spell until your next daily preparations.
When you [[Refocus]], you can choose a different school spell from among those eight school spells, replacing the previous one.
Increase the number of Focus Points in your focus pool by 1.
''Prerequisites'' Expert in [[Lore]].
You never get information about your areas of expertise wrong.
When you [[Recall Knowledge]] using any Lore subcategory in which you’re trained, if you roll a critical failure, you get a failure instead.
If you’re a master in a Lore subcategory, on a critical success, you gain even more information or context than usual.
''Trigger'' You critically succeed at a [[Strike]] or [[Disarm]] with your Aldori dueling sword.
Your incredible skill with your blade unnerves your foes.
You attempt to [[Demoralize]] the target of your Strike or Disarm.
This Demoralize attempt does not have the auditory trait, nor do you take a penalty to the check if the target doesn’t understand your language.
If you are unnoticed by a creature, that creature has no idea you are present at all.
When you’re unnoticed, you’re also [[Undetected]] by the creature.
This condition matters for abilities that can be used only against targets totally unaware of your presence.
''Prerequisites'' master in a [[Decipher Writing]] skill
You can understand the true meaning of texts quickly, and even when you get lost or hit a dead end, you aren’t discouraged from making further attempts to get to the bottom of things.
When you [[Decipher Writing]], you need only half as long as usual (reducing the time from about 1 minute to about half a minute per page), and if you fail, you don’t take the usual –2 circumstance penalty to further checks to decipher that text.
{{||SpellSummaryTable}}
This spell grants perfect sight based on scrying, allowing several willing targets to track the exact movements or position of one creature or object.
Choose one target creature or object in the area to be tracked. It becomes the sensor for
the spell.
Up to five [[Willing]] creatures of your choice in the area can see a ghostly image of this creature or object when it’s out of their sight. They can perceive the creature or object perfectly, allowing them to ignore the [[Concealed]] or [[Invisible]] condition, though physical barriers still provide cover.
The tracking creatures can see the tracked creature or object through all barriers other than lead or running water, which block their vision.
Distance doesn’t matter, though the creature or object might move so far away it becomes too small to perceive.
The tracking creatures don’t see any of the environment around the target, though they do see any gear a creature is wearing or holding, and they can tell if it removes objects from its person.
If the target to be tracked is willing, the duration is 1 hour. If you try to track an unwilling creature, the target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
Building things is like solving a puzzle, and you know how to use anything at your disposal to get the job done.
You gain [[Creation (Spell)]] as a 5th-level innate primal spell.
You must have an equivalent [[Bulk]] of material to create an item, such as wood or scrap metal to make a wheelbarrow.
You can cast this spell once each day.
{{||SpellSummaryTable}}
You issue a blast of sudden wind that ripples outward from the center of the burst.
The wind extinguishes small non-magical fires, disperses fog and mist, scatters objects of light Bulk or less, and pushes unsecured objects of 1 Bulk or less 5 feet away from the spell’s origin point.
Each Medium or smaller creature in the area when you Cast the Spell or that moves into spell’s area must attempt a Fortitude saving throw.
{{||SaveSuccessTable}}
''Requirements'' You are riding your mount and wielding a [[Jousting]] weapon.
You attempt to knock an opponent off their mount.
Make a melee [[Strike]] against a mounted opponent.
If your attack hits, attempt an [[Athletics]] check against the opponent’s [[Fortitude]] DC.
If you succeed, the foe is knocked off its mount into a space of its choice adjacent to its mount.
If you critically succeed, it lands [[Prone]].
{{||RitualSummaryTable}}
''Cost'' rare oils, salts, and herbs worth a total value of 15 gp;
//Secondary casters can't use the same skill as the primary caster.//
You create a site-bound, long-lasting [[Unseen Servant]] spell effect, forming entities of pure force to carry out basic tasks at a fixed location.
''Heightened (6th)'' If destroyed, the unseen servants reform the next morning. The cost increases to 30 gp.
{{||ActionSuccessTable}}
When you’re in an area where your coloration is roughly similar to the environment (for instance, forest green in a forest), you can use the minor, single action application of this ability to make localized changes that help you blend into your surroundings, gaining a +2 circumstance bonus to [[Stealth]] checks until your surroundings change in coloration or pattern.
{{||SpellSummaryTable}}
You summon an unseen servant, which you can command as part of [[Sustaining the Spell|Sustain a Spell]].
It serves you until its Hit Points are reduced to 0, at which point the spell ends, or until you stop Sustaining the Spell.
The unseen servant gains the <<tag Summoned>> trait.
''Unseen Servant'': <<tag Medium>> <<tag Mindless>>
''Level'' -1
''Perception'' +0; [[Darkvision]]
Languages — (understands its creator)
''Skills'' [[Stealth]] +8
[[Strength]] –4, [[Dexterity]] +2, [[Constitution]] +0, [[Intelligence]] –5, [[Wisdom]] +0, [[Charisma]] +0
''Invisible'' An unseen servant is [[Invisible]], though it normally doesn’t Sneak, so it is usually only [[Hidden]].
''AC'' 13; [[Fortitude]] +0, [[Reflex]] +4, [[Will]] +0
HP 4; Immunities [[Disease]], <<tag Mental>>, non-magical attacks, <<tag Paralysis>>, [[Poison]], precision, [[Unconscious]]; Resistances all damage 5 (except <<tag Force>> or [[Ghost Touch]]
Speed fly 30 feet
''Force Body'' An unseen servant’s physical body is made of force. It can’t use attack actions. It can move and use [[Interact]] actions to do things such as fetch objects, open unstuck or unlocked doors, hold chairs, and clean. It can’t pass through solid objects.
{{LOCGFeat}}
''Prerequisites'' Expert in [[Will]] saves.
Your faith and hope can’t be shaken, and you won’t flee when lives are at stake.
You gain a +1 circumstance bonus on saves against fear effects and emotion effects that inflict despair.
When you would gain the [[Fleeing]] condition, you can choose to stand your ground and be [[Stunned]] for the effect’s duration as well, preventing you from running and allowing you to re-enter the fight more quickly when the effect ends.
You can create extraordinary—albeit volatile—alchemical wonders, though they have an unfortunate tendency to violently explode when you use them.
When you use [[Quick Alchemy]], you can create an alchemical item from your formula book whose level is up to 2 higher than your advanced alchemy level.
You can spend up to 3 additional batches of infused reagents when creating this item to stabilize it.
Upon activating the item, attempt a DC 10 flat check; for every additional batch of infused reagents you spent to create the item, reduce this DC by 2.
On a success, the item functions normally.
On a failure, the item explodes, dealing force damage to the user equal to twice the item’s level (doubled on a critical failure).
//This feat from the Advanced Player's Guide is a reprint of [[Invulnerable Juggernaut]] from Age of Ashes 6, but without the Uncommon tag.//
{{Invulnerable Juggernaut}}
You’ve learned how to handle situations when you’re out of your depth.
Your proficiency bonus to untrained skill checks is equal to half your level instead of +0.
If you’re 7th level or higher, the bonus increases to your full level instead.
This doesn’t allow you to use the skill’s trained actions.
{{||SpellSummaryTable}}
You send currents of protective ki to the surface of your body that protect you from harm, at least until your enemies dissipate them.
You gain 15 temporary Hit Points, which last for up to 3 rounds.
''Heightened (+1)'' The temporary Hit Points increase by 5.
{{||SpellSummaryTable}}
You transform your flesh and organs into a bizarre amalgam of glistening skin, rough scales, tufts of hair, and tumorous protuberances. This has three effects:
* You gain resistance 10 to precision damage and resistance 10 to extra damage from critical hits. If the resistance is greater than the extra damage, it reduces the extra damage to 0 but doesn’t reduce the attack’s normal damage.
* You gain [[Darkvision]].
* Acid oozes from your skin. Any creature that hits you with an unarmed attack or with a non-reach melee weapon takes 2d6 <<tag Acid>>damage.
''Heightened (+2)'' The resistances increase by 5, and the acid damage increases by 1d6.
You can translate the emotion and power of a composition to other mediums.
If your next action is to cast a composition spell, you can use a different kind of performance than usual for the composition to change any of its somatic components to verbal components or vice versa.
As usual for composition spells, this changes whether the composition is <<tag Auditory>> or <<tag Visual>>.
Your mystic control and meditations allow you to resist external influences upon your consciousness.
Whenever you are affected by a <<tag Mental>> effect that lasts at least 2 rounds, you can reduce the duration by 1 round.
You still require natural sleep, but you treat your saving throws against effects that would cause you to fall asleep as one degree of success better. This protects only against <<tag Sleep>> effects, not against other forms of falling [[Unconscious]].
{{||SpellSummaryTable}}
The ground in the area shudders and crumbles as huge pillars of stone erupt into the air, rending the terrain around them.
The GM might add additional effects in certain areas. Cliffs might collapse, causing creatures to fall, or a river might be blocked and flood the surrounding area.
* ''Stone Debris'' The area becomes [[Difficult Terrain]].
* ''Rising Pillars'' Pillars of smooth stone rise from your chosen number of 10-foot squares on a surface in the area, ascending up to 60 feet in height. Each pillar stops when it hits a structure or ceiling unless that structure collapses (see below). The DC to [[Climb]] or [[Grab an Edge]] on a pillar is 30. Each creature on a pillar after it rises must succeed at a [[Reflex]] saving throw or fall off the nearest edge (the creature can choose which edge, if several are equally close). A creature on a pillar that is stopped by a structure [[fall|Falling]]s without attempting a save.
* ''Structural Collapse'' Structures and ceilings might collapse. The GM rolls a flat check for each (DC 14 for a sturdy structure, DC 9 for an average structure and most natural formations, all adjusted higher or lower as the GM sees fit). In general, [[Shoddy]] structures automatically collapse. A collapse deals 11d6 bludgeoning damage to creatures beneath it; each creature caught in a collapse must attempt a [[Reflex]] save to avoid it. If the creature is forced to attempt a Reflex save because it was on a rising pillar, it uses the same result.
{{||SaveSuccessTable}}
''Trigger'' A foe attempts a skill check and doesn’t get a critical success.
After your foe has tried their best, you show everyone how it’s really done.
Attempt a check using the same skill that triggered this reaction.
{{||ActionSuccessTable}}
You tell a story spontaneously from nearly forgotten facts, delving into your memory and entertaining your audience in the process.
[[Recall Knowledge]] with a skill in which you have master proficiency, then use [[Uzunjati Storytelling]] with the same skill.
You gain a +1 circumstance bonus to your skill check for Uzunjati Storytelling from the added details.
''Prerequisite'' Master in a Recall Knowledge skill.
You tell a quick story or begin telling a longer tale. This is most useful when you want to prove
your scholarly credibility or impress someone quickly.
Roll a check with a skill that can be used to [[Recall Knowledge]] in which you have expert proficiency, using the result entry for the [[Perform]] action.
Like Performing, Storytelling rarely has an effect on its own, but it might influence the DCs of subsequent [[Diplomacy]] checks against the observers—or even change their attitudes—if the GM sees fit.
This action is not a Performance and cannot be used in place of anything that requires you to Perform.
A character also has many vague senses—ones that can alert you that something is there but aren’t useful for zeroing in on it to determine exactly what it is.
The most useful of these for a typical character is the sense of smell //([[Scent]])//.
At best, a vague sense can be used to detect the presence of an [[Unnoticed]] creature, making it [[Undetected]].
Even then, the vague sense isn’t sufficient to make the creature [[Hidden]] or [[Observed]].
You were raised by your vampiric parent, or you’ve invested substantial time and energy researching the secrets of your undead progenitors.
You gain the trained proficiency rank in [[Religion]] and [[Society]]. If you would automatically become trained in one of those skills (from your background or class, for example), you instead become trained in a skill of your choice.
You also become trained in Vampire [[Lore]].
{{||SpellSummaryTable}}
You draw in the blood and life force of other creatures through your outstretched arms. You deal 12d6 negative damage to living creatures in the area //with a basic [[Fortitude]] save//.
You gain temporary Hit Points equal to half the damage a single creature takes from this spell; calculate these temporary Hit Points using the creature that took the most damage.
You lose any remaining temporary Hit Points after 1 minute.
''Heightened (+1) The damage increases by 2d6.''
{{||SpellSummaryTable}}
A ghostly iron maiden snaps shut on the target and drains its vitality for your gain.
This deals 4d4 piercing damage and 4d4 negative damage, and the target must attempt a [[Fortitude]] save.
You gain temporary HP equal to the negative damage the target takes (after applying resistances, weaknesses, and the like).
You lose any remaining temporary HP after 1 minute.
''Heightened (+1)'' The piercing and negative damage increase by 1d4 each.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
Your touch leeches the lifeblood out of a target to empower yourself.
You deal 6d6 negative damage to the target.
You gain temporary Hit Points equal to half the negative damage the target takes (after applying resistances and the like).
You lose any remaining temporary Hit Points after 1 minute.
''Heightened (+1)'' The damage increases by 2d6.
You have a knack for breaking and dismantling things. Putting them back together is the boring part, so you largely don’t bother with that.
You become trained in [[Thievery]]. If you would automatically become trained in Thievery (from your background or class, for example), you instead become trained in a skill of your choice.
In addition, whenever you hit with a [[Strike]] against a trap or an unattended object, you ignore the first 5 points of the object’s Hardness.
Affix to armor.
''Requirements'' You are a master in [[Stealth]].
''Trigger'' You attempt a [[Stealth]] check for initiative but you haven't rolled yet.
This copper coin dangles from a leather strip strung through a hole drilled in the center. Until activated, the coin becomes invisible for a few seconds at random intervals every few minutes.
When you activate {{FreeAction}} the coin, it casts a 2nd-level [[Invisibility]] spell on you, lasting until the end of your next turn.
You’ve trained in the finer points of dealing death.
Whenever you critically hit using a Bo staff, longbow, composite longbow, scythe, or staff, you apply the weapon’s critical specialization effect.
Vanths themselves recognize you as an honorary reaper.
Whenever you gain a class feature that grants you expert or greater proficiency in a given weapon or weapons, you also gain that proficiency in bo staves, longbows, composite longbows, scythes, and staves.
You seek to emulate vanth reapers’ fighting styles.
You are trained with [[bo staves|Bo Staff]], [[Longbow]]s, [[Composite Longbow]]s, [[Scythe]]s, and [[staves|Staff]].
{{||SpellSummaryTable}}
You disguise the targets as other creatures of the same body shape and roughly similar height (within 6 inches) and weight (within 50 pounds).
The disguise can hide the targets’ identities or let them appear to be of another ancestry, but it’s not precise enough to impersonate specific individuals.
The spell doesn’t change voice, scent, or mannerisms.
You choose the disguise for each target; for example, you could make one target appear to be a dwarf and another an elf.
Casting veil counts as setting up a disguise for the purpose of the [[Impersonate]] action. It allows the target to ignore any circumstance penalties they might take for being disguised as dissimilar creatures, and it gives the targets a +4 status bonus to [[Deception]] checks to prevent others from seeing through their disguises, and add their level even if untrained.
You can [[Dismiss]] any or all of these disguises.
''Heightened (5th)'' The spell also disguises the targets’ voices and scents; it gains the <<tag Auditory>> trait.
''Heightened (7th)'' The targets can appear as any creature of the same size, even specific individuals. You must have seen an individual to reproduce their appearance. The spell also disguises the targets’ voices and scents; it gains the <<tag Auditory>> trait.
Born of a blood hag, a fiery blood drinker hidden behind a false skin, you have one blood-red eye and the ability to slough off your appearance in an instant.
You gain the [[Lie to Me]] skill feat, and you can shed a disguise quickly by peeling off the outer layer of your skin.
Changing from a disguise used to [[Impersonate]] back to your true appearance is a 3-action
activity for you; if you’re an expert in [[Deception]], it’s a 2-action activity, and if you’re legendary in [[Deception]], it takes only a single action.
This doesn’t allow you to don or remove armor or other equipment any faster, but your physical appearance otherwise returns to its normal state.
{{||SpellSummaryTable}}
You surround yourself in a veil of confidence.
You reduce your current [[Frightened]] condition by 1, and whenever you would become frightened during the duration, reduce the amount by 1.
If you critically fail a save against <<tag Fear>>, veil of confidence ends immediately, and you increase any [[Frightened]] condition you gain from the critical failure by 1 instead of decreasing it.
{{||SpellSummaryTable}}
You draw the target into a drowsy state, causing daydreams and sluggishness.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
You know there’s so much more to sensation than whips and chains—but whips and chains also have their place.
You can cast [[Telekinetic Maneuver]] and [[Web]] once per day each as 2nd-level divine innate spells; in both cases, the spells manifest shadowy chains rather than their usual visual signifiers.
You heart aches for vengeance against those who have wronged your people.
Choose one of the following dwarven ancestral foes when you gain Vengeful Hatred: drow, duergar, giant, or orc.
You gain a +1 circumstance bonus to damage with weapons and unarmed attacks against creatures with that trait.
If your attack would deal more than one weapon die of damage (as is common at higher levels than 1st), the bonus is equal to the number of weapon dice or unarmed attack dice.
In addition, if a creature critically succeeds at an attack against you and deals damage to you, you gain your bonus to damage against that creature for 1 minute regardless of whether it has the chosen trait.
''Special'' Your GM can add appropriate creature traits to the ancestral foes list if your character is from a community that commonly fights other types of enemies.
You’ve sworn an oath to hunt down wicked evildoers and bring them to judgment.
Add the following tenet to your code after the others: “You must hunt down and exterminate evil creatures that have committed heinous atrocities as long as you have a reasonable chance of success and aren’t engaged in a mission that would prevent your doing so.”
You can use [[Lay on Hands]] to damage a creature you witness harming an innocent or a good ally as if it were undead; in this case, lay on hands deals <<tag Good>> damage instead of positive damage and gains the <<tag Good>> trait.
This good damage can affect non-evil creatures.
This doesn’t prevent you from healing such a creature with lay on hands; you choose whether to heal or harm.
''Trigger'' A creature within your reach succeeds or critically succeeds at an attack against you.
''Requirements'' You’re under the effect of [[Come and Get Me]].
When struck by an enemy, you respond in turn.
Make a melee [[Strike]] against the triggering creature.
This Strike doesn’t count toward your [[Multiple Attack Penalty]], and your multiple attack penalty doesn’t apply to this Strike.
You gain the [[Tail Toxin]] action.
{{||SpellSummaryTable}}
Whenever you speak or make any other sound vocally, you can make your vocalization seem to originate from somewhere else within 60 feet, and you can change that apparent location freely as you vocalize.
Any creature that hears the sound can attempt to disbelieve your illusion.
''Heightened (2nd)'' The spell’s duration increases to 1 hour, and you can also change the tone, quality, and other aspects of your voice. Before a creature can attempt to disbelieve your illusion, it must actively attempt a [[Perception]] check or otherwise use actions to interact with the sound.
A verbal component is a vocalization of words of power.
Shouting out verbal components forces magic out into the world via a word laden with magical power. Spells that require only a verbal component tend to be direct and forceful, such as power word kill or power word stun. Verbal components are especially unsubtle, so spells that benefit from stealth, such as invisibility, might not have any verbal components in favor of having somatic components, material components, or both.
You must speak them in a strong voice, so it’s hard to conceal that you’re Casting a Spell.
The spell gains the [[Concentrate]] trait.
You must be able to speak to provide this component.
//The target does not have to be able to understand or hear you.//
{{BardConSub}}
You transform into a plant version of yourself.
You gain the <<tag Plant>> trait and lose any trait that’s inappropriate for your new form (typically humanoid for a PC, but also possibly animal or fungus).
You can change from a form that looks mostly like your old self into a tree or any other non-creature plant as a single action, which has the <<tag Concentrate>> trait. This has the same effect as [[Tree Shape]], except you can turn into any kind of non-creature plant and your AC is 30.
If you rest for 10 minutes while transformed into a noncreature plant during daylight hours under direct sunlight, you recover half your maximum Hit Points.
If you take your daily rest in this way, the rest restores you to maximum Hit Points and removes all non-permanent [[Drained]], [[Enfeebled]], [[Clumsy]], and [[Stupefied]] conditions, as well as all poisons and diseases of 19th level or lower.
''Frequency'' once per hour
''Trigger'' You take damage or cast a <<tag Primal>> spell.
Small plants or fungi magically appear on all surfaces in a 60-foot [[Emanation]] around you. This life withers after 1 day unless the environment can support it.
You can choose one of the following options each time you use this feat.
* You can cause any number of 5-foot squares in the area to be light undergrowth, which is [[Difficult Terrain]] and provides lesser [[Cover]].
* You can cause a tree or giant mushroom to appear in any unoccupied location in the area; it occupies an entire 5-foot square and provides standard [[Cover]]. The tree or mushroom has 5 Hardness and 50 Hit Points.
{{||SpellSummaryTable}}
You imbue a single ordinary, inexpensive plant seed with primal energy and throw it onto a surface, where it gradually sprouts into a Medium plant.
After 10 minutes, the plant is sturdy enough to provide standard [[Cover]], and its space is [[Difficult Terrain]].
The plant is laden with nutritious nuts or fruit sufficient to feed one Medium creature for a day.
The plant has AC 10, Hardness 5, and 20 Hit Points.
''Heightened (+1)'' You throw an additional seed, which grows into an additional plant within range.
This oak branch grows leaves in spring that change color in autumn and shed in winter. While wielding it, you gain a +2 circumstance bonus to [[Nature]] checks to identify plants.
''Craft Requirements'' Supply one casting of all listed levels of all listed spells.
| !Type | !Level | !Price | !Spell Level | !Spells |
| Standard | 6 | 2250 | Cantrip |[[Tanglefoot]] |
|~|~|~| 1st |[[Shillelagh]] (can target the verdant staff) |
|~|~|~| 2nd |[[Barkskin]], [[Entangle]], [[Shape Wood]], [[Tree Shape]] |
| Greater | 10 | 9000 | 3rd |[[Wall of Thorns]] |
|~|~|~| 4rd |[[Barkskin]], [[Speak with Plants]] |
|~|~|~| 5th |[[Plant Form]], [[Wall of Thorns]] |
You cultivate a seed that can sprout into a wooden staff, vine whip, or another weapon.
You spend 10 minutes focusing primal energy into a seed, imprinting it with the potential of a single level 0 weapon you are trained with and that has no mechanical parts or metal components.
When holding the imprinted seed, you can spend a single [[Interact]] action to cause it to immediately grow into that weapon; a second Interact action returns it to seed form.
Your verdant weapon functions as the imprinted weapon and can be etched with runes or affixed with talismans as normal, which are suppressed when the weapon is in seed form.
It also becomes a primal focus.
You can have only one verdant seed at a time. If you prepare a second, your first verdant seed immediately becomes a mundane specimen; any runes on the previous seed that are valid for the new seed transfer between them at no cost, but you lose any inapplicable runes unless you transfer them to a runestone or another weapon.
A versatile weapon can be used to deal a different type of damage than that listed in the Damage entry. This trait indicates the alternate damage type.
For instance, a piercing weapon that is versatile S can be used to deal piercing or slashing damage. You choose the damage type each time you make an attack.
''Prerequisites'' harmful font or healing font, deity that allows clerics to have both fonts.
As you explore your deity’s aspects, you move beyond restrictions on healing or harming.
You can prepare either [[Harm]] or [[Heal]] in the spell slots gained from the harmful font or healing font.
Select a general feat of your choice for which you meet the prerequisites (as with your ancestry feat, you can select this general feat at any point during character creation).
Versatile Heritages are special heritages that can be taken with multiple Ancestries. They usually add extra options for Ancestry feats.
<<bulletlist "[tag[Heritage]tag[Versatile]sort[]]">>
You are nigh-unmatched with any weapon.
Your proficiency ranks for simple weapons, martial weapons, and unarmed attacks increase to legendary, and your proficiency rank for advanced weapons increases to master.
Your proficiency rank for your fighter class DC increases to master.
''Prerequisites'' polymath muse
You can rely on the grandeur of your performances rather than ordinary social skills.
You can use [[Performance]] instead of [[Diplomacy]] to [[Make an Impression]] and instead of
[[Intimidation]] to [[Demoralize]].
You can also use an acting [[Performance]] instead of [[Deception]] to [[Impersonate]].
You can use your proficiency rank in Performance to meet the requirements of skill feats that require a particular rank in Deception, Diplomacy, or Intimidation.
While most bards are known for certain signature performances and spells, you’re always tweaking your available repertoire.
When you make your daily preparations, you can change one of your [[Signature Spells]] to a different spell of that level from your repertoire.
Taller folk rarely pay attention to the shadows at their feet, and you take full advantage of
this.
You can move 5 feet farther when you take the [[Sneak]] action, up to your Speed.
In addition, as long as you continue to use Sneak actions and succeed at your Stealth check, you don’t become [[Observed]] if you don’t have [[Cover]] or greater cover and aren’t [[Concealed]] at the end of the Sneak action, as long as you have cover or greater cover or are concealed at the end of your turn.
You can move up to your Speed when you use the [[Sneak]] action, and you no longer need to have cover or greater cover or be concealed to [[Hide]] or [[Sneak]].
You possess small, weak wings that aid in balance.
You gain the [[Steady Balance]] and [[Cat Fall]] skill feats as bonus feats, even if you aren’t trained in [[Acrobatics]].
<$set name="inner" value={{!!title}}>
<$macrocall $name="levelfeatlist" levels="1 5 9 13 17" filter="[tag[Feat]contains:feat-vher<inner>]"/>
</$set>
''Frequency'' once every 10 minutes
Whereas most gnomes’ coloration is static or changes slowly, you can cause your hair, eye, and skin color to scintillate in brief and disorienting bursts.
Once every 10 minutes, when you use the [[Feint]] action, you can compare your [[Deception]] check result to the [[Perception]] DCs of all adjacent creatures rather than just one creature within melee reach.
It’s possible to get a different degree of success for each target.
These changes are imprecise and usually short-lived, so while they allow you to periodically change your appearance in unpredictable ways, they are of little use in providing camouflage or aiding a disguise.
{{||SpellSummaryTable}}
You create a pattern of lights that pulses with intensity.
Creatures are [[Dazzled]] while inside the pattern.
In addition, a creature must attempt a [[Will]] saving throw if it’s inside the pattern when you cast it, enters the pattern, ends its turn within the pattern, or uses a [[Seek]] or [[Interact]] action on the pattern.
A creature currently [[Blinded]] by the pattern doesn’t need to attempt new saving throws.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
Your body sprouts a coat of brambly thorns that harm those that strike you and thrive on life magic.
Adjacent creatures that hit you with a melee attack, as well as creatures that hit you with unarmed attacks, take 1 piercing damage each time they do.
Anytime you cast a <<tag Positive>>spell, the damage from your thorns increases to 1d6 until the start of your next turn.
''Heightened (+1)'' The damage increases by 1, or 1d6 after you cast a positive spell.
The debilitations you dish out seriously impair your foes.
Add the following debilitations to the list you can choose from when you use [[Debilitating Strike]].
* ''Debilitation'' The target gains [[Weakness]] 5 to your choice of bludgeoning, piercing, or slashing damage.
* ''Debilitation'' The target becomes [[Clumsy]] 1.
You make a vicious attack that maims your enemy.
Make a melee [[Strike]].
If the Strike hits and deals damage, the target is [[Drained]] 1, or [[Drained]] 2 on a critical success.
You’ve let your incisors grow long enough to serve as formidable weapons.
You gain a jaws unarmed attack that deals 1d6 piercing damage. Your jaws are in the brawling
group and have the [[Finesse]] and [[Unarmed]] traits.
Unlike most creatures, you can file down your teeth and regrow them later on, enabling you to select this feat at any level, and to retrain into and out of this feat.
You’ve learned how to create traps that cause greater injuries.
You deal an additional 1d6 precision damage with damaging snares you craft.
This increases to 2d6 additional precision damage if you’re legendary in [[Crafting]].
While your vengeance is painful for both you and your foe, none can doubt that your enemies suffer more.
You gain a circumstance bonus to the damage you deal from [[Destructive Vengeance]] equal to the number of damage dice from the reaction.
This only applies to the damage the enemy takes, not the damage to yourself or the extra damage you gain after using the reaction.
Your victories in battle fill you with pride and imbue you with the energy to fight a bit longer despite your wounds.
You gain temporary Hit Points equal to your [[Constitution]] modifier until the end of your next turn.
{{||SpellSummaryTable}}
You create an invisible eye sensor, as [[Clairvoyance]].
When created, this eye must be in your line of sight.
When the spell’s duration ends, you can spend 1 Focus Point as a free action to extend the duration for another hour, though as normal, it ends immediately during your next [[daily preparations|Rest]].
Through your adventures, you’ve developed keen awareness and attention to detail.
Your proficiency rank for [[Perception]] increases to master.
You have two identities, each with its own name, alignment, and abilities. Your social identity is an upstanding member of society, while your vigilante identity is a skilled and cunning warrior.
Neither of these identities is a false front; you really are both of these people, and as such, your two identities can be at most one alignment step from each other (for instance, you could be neutral in one identity and neutral evil in the other, but not chaotic evil in the other).
If someone attempts to discern your other identity, they must use a [[Seek]] action to attempt a [[Perception]] check against your [[Deception]] DC, as if you were using the [[Impersonate]] action. Your Deception DC against such attempts is 20 + your proficiency modifier instead of the normal DC.
Unlike with Impersonate, you don’t have to attempt a Deception check to interact with someone to conceal your other identity—a check happens only if someone else specifically tries to uncover your other identity.
Changing from one identity to the other takes 1 minute and must be done out of sight from other creatures. As this process involves both physical changes such as clothing and makeup along with an altered state of mind, other effects that change your appearance don’t reduce the time required to change identities.
Your two identities are completely distinct. You have your current identity’s alignment for effects that rely on alignment, though you are eligible for abilities that require a certain alignment (such as a cleric’s deity) only if both of your identities qualify.
Checks to [[Recall Knowledge]] about one of your identities don’t reveal information about the other unless the person attempting the check knows both identities are the same person.
Effects that detect you based on your identity, such as the [[Detect Alignment]] spell, work
only if you are currently in the identity the effect is trying to detect; otherwise, the effect fails as if the target didn’t exist.
To maintain the separation between your identities, some of your abilities have one of two traits: social or vigilante. You can use social feats only while in your social identity. Your class feats and vigilante feats are associated with your vigilante identity, and using them while in your social identity risks exposing you as a vigilante. This means that if you were particularly meek or inconspicuous before you took this feat, your identity could be at greater risk of exposure.
If your identity is exposed to the public, you lose the benefits of Vigilante Dedication to disguising yourself, but you can otherwise use both social and vigilante abilities in either identity unless they rely on your identity being a secret.
You can use feats that don’t have either trait regardless of your current identity.
<<archetypefeatlist "4 6 7 8 12 16" "Vigilante">>
Your physique is robust and can withstand blood loss startlingly well.
Whenever you would gain the [[Drained]] condition, you can attempt a DC 17 flat check. On a
success, you don’t gain the [[Drained]] condition.
You instill magical vigor in your allies when you inspire them to attack.
If your next action is to cast the [[Inspire Courage]] composition cantrip, you and all affected allies gain temporary Hit Points equal to 3 + your Charisma modifier that last for 1 minute.
Vikings spend long periods of time at sea, only to leap from their boats at a moment’s notice, charge through the surf, and take their enemies by storm.
You’re trained in Sailing [[Lore]].
When moving through water using your land Speed, you ignore difficult terrain resulting from shallow water, such as in bogs or on beaches.
In addition, if you roll a success for your [[Athletics]] check to [[Swim]], you get a critical success instead.
<<archetypefeatlist "4 6 10" "Viking">>
{{LOCGFeat}}
You trained with shields and weapons as soon as you were old enough to hold them, eager to win honor and glory for yourself.
You gain the [[Shield Block]] reaction and are trained in your choice of the [[Battle Axe]] or [[Longsword]].
From childhood, you have been exposed to traditional viking weapons, and you soon learned to handle them in battle. Now, you can raid proudly alongside your fellows.
You are trained with the [[Battle Axe]], [[Hatchet]], [[Longsword]], and [[Shortsword]].
In addition, you gain the [[Shield Block]] reaction.
You are even more skilled in the weapons of your people.
You gain the critical specialization effects of the [[Battle Axe]], [[Hatchet]], [[Longsword]], and [[Shortsword]].
Whenever you gain a class feature that grants you expert or greater proficiency in certain weapons, you also gain that proficiency rank in the above four weapons.
''Prerequisites'' evil alignment
You combine unholy might with negative energy to damage angels, archons, and other self righteous denizens of the Outer Planes.
When you cast a [[Harm]] spell, you can change the damage you deal to celestial creatures to <<tag Evil>> damage instead of <<tag Negative>> damage.
Arrow ammunition.
Leafy stalks protrude from the shaft of this rustic arrow.
When an activated ({{OneAction}} Command) vine arrow hits a target, the arrow’s shaft splits and grows, wrapping the target in vines.
The target takes a –10-foot circumstance penalty to its Speeds for 2d4 rounds, or until it [[Escape]]s against a DC of 19.
On a critical hit, the target is also [[Immobilized]] until it [[Escape]]s.
You do not need to have any hands free to [[Climb]]. Additionally, if you roll a success on an [[Athletics]] check to Climb, you get a critical success instead.
Arrow ammunition.
The shaft of this arrow is covered in fine green scales, and its iron head comes to a pair of points almost like fangs.
After an activated ({{OneAction}} [[Interact]]) viper arrow hits a target, the arrow transforms into a viper (Pathfinder Bestiary).
The target is affected by the viper’s poison, as if it had been bitten.
The viper then lands in an open space adjacent to the target.
The viper has the summoned trait and acts at the end of your turn, even though you didn’t use the [[Sustain a Spell]] action.
It is under the GM’s control, but it generally attacks the creature the arrow struck.
The viper vanishes after 1 minute or when slain.
''Craft Requirements'' Supply one casting of [[Summon Animal]].
Affix to a weapon.
''Requirements'' You are a master with the affixed weapon.
''Trigger'' A creature within your reach uses a <<tag Manipulate>> or <<tag Move>> action, makes a ranged attack, or leaves a square during a move action it's using.
When you activate {{ReactionIcon}} this resin-strengthened viper skull, you make an [[Attack of Opportunity]] against the triggering creature.
If you have Attack of Opportunity, you can activate the viper’s fang as a free action.
Born of a storm hag, you have one crystal-blue or rain-gray eye. You share your mother’s power over wind and storm.
You can cast [[Electric Arc]] as an occult innate cantrip. As normal, a cantrip is heightened to a spell level equal to half your level rounded up.
{{LOCGFeat}}
Choose a 3rd-level arcane spell from the same school as your [[Arcane Tattoos]], either a common spell or another to which you have access, including a lower-level spell heightened to 3rd level if you wish.
You can cast that spell once per day as an innate arcane spell.
''Prerequisites'' Trained in [[Performance]].
You have exceptional talent with one type of performance.
You gain a +1 circumstance bonus when making a certain type of performance. If you are a master in Performance, this bonus increases to +2.
Select one of the following specialties and apply the bonus when attempting Performance checks of that type. If it’s unclear whether the specialty applies, the GM decides.
|!Specialty|!Examples|
|Acting|Drama, pantomime, puppetry|
|Comedy|Buffoonery, joke telling, limericks|
|Dance|Ballet, huara, jig, macru|
|Keyboards|Harpsichord, organ, piano|
|Oratory|Epic, ode, poetry, storytelling|
|Percussion|Chimes, drum, gong, xylophone|
|Singing|Ballad, chant, melody, rhyming|
|Strings|Fiddle, harp, lute, viol|
|Winds|Bagpipe, flute, recorder, trumpet|
Afflictions with the virulent trait are harder to remove. You must succeed at two consecutive saves to reduce a virulent affliction’s stage by 1. //These saves are made over the course of two intervals, not both at once.// A critical success reduces a virulent affliction’s stage by only 1 instead of by 2.
If the affliction’s stage is ever reduced below stage 1, the affliction ends and you don’t need to attempt further saves unless you’re exposed to the affliction again.
{{||SpellSummaryTable}}
You focus your gaze on a creature and gain a flash of divine insight into its nature.
If the creature has any weaknesses, you learn them, as well as which of its three saving throw modifiers is lowest.
You also learn an inherent understanding of its movements and gain a +2 status bonus to your next attack roll (or skill check made as part of an attack action) against that foe before the end of your turn.
The target is then temporarily immune to vision of weakness for 1 day.
{{||SpellSummaryTable}}
An illusion of horrific creatures fills the spell’s area.
The creatures look like Tiny swarming monsters with a specific appearance of your choice, such as Hellish flies or animated saw blades.
The burst deals 8d8 <<tag Mental>>damage to each creature that’s inside the burst when it’s created, enters the burst, or starts its turn inside the burst.
A creature that critically succeeds at its [[Will]] save can immediately attempt to disbelieve the illusion.
A creature that tries to Interact with the monsters or observes one with a Seek action can attempt to disbelieve the illusion.
Creatures that disbelieve the illusion take no damage from the illusion thereafter.
''Heightened (+1)'' The mental damage increases by 1d8.
A visual spell can affect only creatures that can see it.
//Being [[Blinded]] gives immunity to Visual effects.//
//You can [[Avert Gaze]] to increase saves against Visual effects.//
{{||SpellSummaryTable}}
Vitality radiates outward from you, allowing others to supplicate and receive healing.
Once per round, either you or an ally can use an [[Interact]] action to supplicate and lay hands upon you to regain Hit Points.
Each time the beacon heals someone, it decreases in strength. It restores 4d10 Hit Points to the first creature, 4d8 Hit Points to the second, 4d6 Hit Points to the third, and 4d4 Hit Points to the fourth, after which the spell ends.
You can have only one vital beacon active at a time.
''Heightened (+1)'' The beacon restores one additional die of Hit Points each time it heals, using the same die size as the others for that step.
Your connection to the First World has grown, and its positive energy flows into you rapidly.
If you rest for 10 minutes, you gain Hit Points equal to your Constitution modifier × half your level. This is cumulative with any healing you receive from [[Treat Wounds]].
You gain <<tag Negative>> resistance equal to half your level (minimum 1). When you have the [[Doomed]] condition, the condition affects you as if its value was 1 lower than it actually is (doomed 1 has no effect, doomed 2 causes you to die at dying 3, and so on).
When you’ve made an impression, you move even faster than normal, darting about
the battlefield with incredible speed.
Increase the status bonus to your Speeds when you have [[Panache]] to a +10-foot status bonus; this bonus increases by 5 feet at 7th, 11th, 15th, and 19th levels.
When you don’t have panache, you still get half this status bonus to your Speed, rounded down to the nearest 5-foot increment.
You hear and understand the words of creatures you share the darkness with.
You can ask questions of, receive answers from, and use [[Diplomacy]] with bats, rats, and wolves.
You also gain a +1 circumstance bonus to [[Make an Impression]] on such animals.
{{||SpellSummaryTable}}
The ground opens up, spraying a column of lava high into the air in a vertical cylinder, dealing 14d6 <<tag Fire>> damage to creatures in the area //with a basic [[Reflex]] save//.
The lava rapidly cools and encases creatures in the area.
//A creature that fails or critically fails their basic Reflex save against the damage is also encased.//
A creature encased in rock is [[Clumsy]] 1 and takes a –10‑foot status penalty to its Speeds.
All normal terrain is [[Difficult Terrain]] to an //encased// flying creature, and such creatures immediately descend 20 feet the moment they’re encased, but they don’t take damage from this fall.
A creature encased in rock can attempt to [[Escape]] against your spell DC to end the effect.
Otherwise, the creature remains encased until it takes a total of 50 damage, freeing it from the rock.
Additionally, creatures in the area and those within 5 feet of the lava column automatically take 3d6 <<tag Fire>>damage from the intense heat, regardless of the results of their saving throws.
''Heightened (+1)'' The damage in the area increases by 2d6, and the damage from the intense heat increases by 1d6.
This ranged weapon is less effective at close distances.
Your attacks against targets that are at a distance within the range listed take a –2 penalty.
{{||SpellSummaryTable}}
You belch forth a swarm of magical vermin. You evoke and shape the creatures from your own imagination, allowing you to change the appearance of the creatures (typically a mix of centipedes, roaches, wasps, and worms), but this doesn’t change the effect of the spell.
The vermin swarm over anyone in the area, their bites and stings dealing 2d8 piercing damage (basic [[Reflex]] save).
A creature that fails its saving throw also becomes [[Sickened]] 1.
Once the spell ends, the swarm disappears.
''Heightened (+1)'' Increase the damage by 1d8.
''Usage'' etched onto a slashing melee weapon.
Originally created as a means of slaying the legendary jabberwock, vorpal weapons prove equally effective against nearly any foe with a head.
''Activate'' {{ReactionIcon}} envision (death, incapacitation); ''Trigger'' You roll a natural 20 on a Strike with the weapon, critically succeed, and deal slashing damage. The target must have a head; ''Effect'' The target must succeed at a DC 37 Fortitude save or be decapitated. //(Because this is an incapacitation effect, a creature of higher level is decapitated only on a critical failure.)// This kills any creature except ones that don’t require a head to live. For creatures with multiple heads, this usually kills the creature only if you sever its last head.
{{||SpellSummaryTable}}
Your scream chills the souls of enemies that hear it.
Each living enemy in the area takes 8d10 <<tag Negative>>damage and must attempt a Fortitude save.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You fill the creature’s mind with a terrifying vision out of its nightmares.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
If the target is [[Unconscious]] when you Cast this Spell on it, it immediately wakes up before attempting its save, and if it fails its save, it gains the [[Fleeing]] condition for 1 round in addition to the effects noted above.
//Common sense suggests that a creature that is unconscious because it is at 0 hit points cannot be woken up by a nightmare.//
You frighten a foe into moving where you want them, traditionally demanding they walk the plank.
Attempt to [[Demoralize]] an opponent; this check gains the incapacitation trait //(so to succeed against an opponent of higher level you must roll a critical success)//.
On a success, in addition to the normal effects, you can also force the target to [[Stride]] up to its Speed.
You choose the path the target takes, and it does so as part of your Walk the Plank action.
You can’t force the target to move into a harmful space (one where it will take damage, fall, provoke reactions, or similar) unless the result of your check to Demoralize was a critical success. //(Which it cannot be if the opponent is of higher level.)//
The target then becomes temporarily immune to Walk the Plank for 24 hours.
Spells that create walls list the depth, length, and height of the wall, also specifying how it can be positioned.
Some walls can be shaped; you can manipulate the wall into a form other than a straight line, choosing its contiguous path square by square.
The path of a shaped wall can’t enter the same space more than once, but it can double back so one section is adjacent to another section of the wall.
''Prerequisites'' Master in [[Athletics]].
You can use your momentum from a jump to propel yourself off a wall.
If you’re adjacent to a wall at the end of a jump (whether performing a [[High Jump]], [[Long Jump]], or [[Leap]]), you don’t fall as long as your next action is another jump.
Furthermore, since your previous jump gives you momentum, you can use High Jump or Long Jump as a single action, but you don’t get to [[Stride]] as part of the activity.
You can use Wall Jump only once in a turn, unless you’re legendary in Athletics, in which case you can use Wall Jump as many times as you can use consecutive jump actions in that turn.
{{||SpellSummaryTable}}
You raise a blazing wall that burns creatures passing through it.
You create either a 5-foot-thick [[Wall]] of flame in a straight line up to 60 feet long and 10 feet high, or a 5-foot-thick, 10-foot-radius ring of flame with the same height.
The wall stands vertically in either form; if you wish, the wall can be of a shorter length or height.
Everything on each side of the wall is [[Concealed]] from creatures on the opposite side.
Any creature that crosses the wall or is occupying the wall’s area at the start of its turn takes 4d6 <<tag Fire>>damage.
''Heightened (+1)'' The fire damage increases by 1d6.
{{||SpellSummaryTable}}
You craft a 20-foot-tall wall of living flesh in a straight line up to 30 feet long. The wall is 3 feet thick, and each 5-foot-long section has AC 10 and 75 HP. If you wish, the wall can be of a smaller length or height.
You must create the wall in an unbroken open space so its edges don’t pass through any creatures or objects, or the spell is lost.
The wall can’t be Repaired but can be healed by <<tag Positive>> energy and <<tag Healing>> spells and abilities.
When you Cast the Spell, choose one of the following features for your wall.
* ''Mouths'' The wall has countless toothy mouths along its surface. The mouths [[Strike]] any creature that ends its turn within 5 feet of the wall, using your spell attack roll for these [[Strike]]s and dealing piercing damage equal to 1d6 + your spellcasting ability modifier. The mouths are capable of consuming potions; since the wall is alive, it can recover Hit Points from a potion of healing, but it can’t benefit from any effect that would give it the ability to move. Otherwise, the GM determines which potions can affect the wall.
* ''Eyes'' The wall sprouts hundreds of unblinking eyes. You can see through these eyes, gaining a +2 circumstance bonus to visual [[Perception]] checks within the wall’s line of sight. You can also use the eyes for determining line of sight for ranged attacks and spells, but you don’t have line of effect through the wall.
* ''Arms'' The wall is a mass of grasping arms. Any creature that ends its turn within 5 feet of the wall must attempt a [[Reflex]] save.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You form an invisible [[Wall]] of pure magical force up to 50 feet long and up to 20 feet high.
The wall has no discernible thickness.
You must create the wall in an unbroken open space so its edges don’t pass through any creatures or objects, or the spell is lost.
The wall has AC 10, Hardness 30, and 60 Hit Points, and it’s immune to critical hits and precision damage.
The wall blocks physical effects from passing through it, and because it’s made of force, it blocks incorporeal and ethereal creatures as well.
<<tag Teleportation>>effects can pass through the barrier, as can <<tag Visual>> effects (since the wall is invisible).
Wall of force is immune to counteracting effects of its level or lower, but the wall is automatically destroyed by a [[Disintegrate]] spell of any level or by contact with a [[Rod of Cancellation]] or [[Sphere of Annihilation]].
''Heightened (+2)'' The Hit Points of the wall increases by 20.
{{||SpellSummaryTable}}
You sculpt a barrier of ice that blocks sight and, once shattered, freezes foes.
You create either a 1-foot-thick wall of ice in a straight line up to 60 feet long and 10 feet high (the wall doesn’t have to be vertical, but it must be anchored on both sides to a solid surface) or a 1-foot-thick, 10-foot radius hemisphere of ice. If you wish, the wall can be of a smaller length, height, or radius.
You must create the wall in an unbroken open space so its edges don’t pass through any creatures or objects, or the spell is lost.
The ice that makes up the wall is opaque.
Each 10-foot-by-10-foot section of the wall has AC 10, Hardness 10, and 40 Hit Points, and it’s immune to critical hits, <<tag Cold>> damage, and precision damage.
A section destroyed by means other than fire leaves behind a chilling mass of ice that is [[Difficult Terrain]] and deals 2d6 cold damage to any creature passing through it.
A section also has weakness to <<tag Fire>> 15; a section of the wall destroyed by fire melts, evaporating into water and steam.
''Heightened (+2)'' The Hit Points of each section of the wall increase by 10, and the cold damage dealt to creatures crossing a destroyed section increases by 1d6.
{{||SpellSummaryTable}}
You shape a [[Wall]] of solid stone.
You create a 1-inch-thick wall of stone up to 120 feet long, and 20 feet high.
You can shape the wall’s path, placing each 5 feet of the wall on the border between squares.
The wall doesn’t need to stand vertically, so you can use it to form a bridge or set of stairs, for example.
You must conjure the wall in an unbroken open space so its edges don’t pass through any creatures or objects, or the spell is lost.
Each 5-foot-by-5-foot section of the wall has AC 10, Hardness 14, and 50 Hit Points, and it’s immune to critical hits and precision damage.
A destroyed section of the wall can be moved through, but the rubble created from it is [[Difficult Terrain]].
''Heightened (+2)'' The Hit Points of each section of the wall increase by 15.
{{||SpellSummaryTable}}
Over the course of a minute, you cause a thick wall of thorny brambles to grow from the ground.
You create a 5 foot thick wall of brambles and thorns in a straight line up to 60 feet long and 10 feet high. If you wish, the wall can be of a shorter length or height.
You must create the wall in an unbroken open space so its edges don’t pass through any creatures or objects, or the spell is lost.
The wall stands vertically.
Everything on each side of the wall has [[Cover]] from creatures on the opposite side, and the wall’s spaces are [[Difficult Terrain]].
For every <<tag Move>> action a creature uses to enter at least one of the wall’s spaces, that creature takes 3d4 piercing damage.
Each 5-foot-by-5-foot section of the wall has AC 10, Hardness 10, and 20 Hit Points. It’s immune to critical hits and precision damage.
A destroyed section can be moved through freely.
''Heightened (+1)'' The Hit Points of each section of the wall increase by 5, and the piercing damage increases by 1d4.
{{||SpellSummaryTable}}
You create a barrier of gusting winds that hinders anything moving through it.
The wall of swirling winds is 5 feet thick, 60 feet long, and 30 feet high.
The wall stands vertically, but you can shape its path.
Though the wall of wind distorts the air, it does not hamper sight.
The wall has the following effects.
* Ammunition from physical ranged attacks—such as arrows, bolts, sling bullets, and other objects of similar size—can’t pass through the wall. Attacks with bigger ranged weapons, such as javelins, take a –2 circumstance penalty to their attack rolls if their paths pass through the wall. Massive ranged weapons and spell effects that don’t create physical objects pass through the wall with no penalty.
* The wall is [[Difficult Terrain]] to creatures attempting to move overland through it. Gases, including creatures in gaseous form, can’t pass through the wall.
* A creature that attempts to fly through the wall using a <<tag Move>>action must attempt a [[Fortitude]] save.
{{||SaveSuccessTable}}
You defy gravity, traversing vertical planes as easily as the ground.
[[Stride]] up to your Speed. You must start your movement on a horizontal surface.
During this movement, you can run up vertical surfaces, like walls, at your full Speed.
If you end the Stride off the ground, you fall after taking your next action or when your turn ends, whichever comes first (though you can [[Grab an Edge]], if applicable).
If you have [[Water Step]] or a similar ability, Wall Run lets you run along flimsy vertical surfaces, as well as vertical liquids, such as a waterfall.
This wand increases a spell’s duration. Yellow embers spiral over its surface until the spell ends.
A wand contains a spell that can be cast once per day.
Casting a spell from a wand requires holding the wand in one hand and activating the item with a [[Cast a Spell]] activity.
''When using a Wand of Continuation, the activation takes {{TwoAction}} if the spell normally takes {{OneAction}} to cast, or {{ThreeAction}} if the spell normally takes {{TwoAction}}.''
''The duration of the spell is increased by half.''
To cast a spell from a wand, it must be on your spell list. Because you’re the one casting the spell, use your spell attack roll and spell DC. The spell is of your tradition.
A spell cast from a wand doesn’t require physical material components, but you must replace any material component normally required to cast the spell with a somatic component.
If the spell requires a focus, you must still have that focus to cast the spell from a wand, and if the spell has a cost, you must still pay that cost to cast the spell from a wand.
After the spell is cast from the wand for the day, you can cast it one more time—overcharging the wand at the risk of destroying it. [[Cast the Spell|Cast a Spell]] again, then roll a DC 10 flat check. On a success, the wand is broken. On a failure, the wand is destroyed.
If anyone tries to overcharge a wand when it’s already been overcharged that day, the wand is automatically destroyed (even if it had been repaired) and no spell is cast.
A wand’s base statistics are the same unless noted otherwise in a special wand. It has light Bulk, and must be held in one hand to be activated. Each wand contains a specific level of the spell, but you can craft a wand with a heightened version of a spell.
Each type of wand has a Level and Price determined by the spell’s level. The wand’s rarity matches the spell’s rarity, and it has its spell’s traits. A wand has the normal Hardness, BT, and HP of a thin item of its material.
''Craft Requirements'' Supply a listed-level casting of the spell. The spell must have a casting time of {{OneAction}} or {{TwoAction}} and a duration no less than 10 minutes and no greater than 1 hour.
| !Spell Level | !Wand Level | !Wand Price |
| 1st | 5 | 1600 |
| 2nd | 7 | 3600 |
| 3rd | 9 | 7000 |
| 4th | 11 | 14000 |
| 5th | 13 | 30000 |
| 6th | 15 | 65000 |
| 7th | 17 | 150000 |
| 8th | 19 | 400000 |
This wand features a carved dragon’s head at its top and a polished metal sphere set in its midsection.
''Activate'' [[Cast a Spell]]; ''Frequency'' once per day, plus overcharge; ''Effect'' You cast [[Magic Missile]] of the indicated level.
[[Magic Missile]] must be on your spell list. Because you’re the one casting the spell, use your spell attack roll and spell DC. The spell is of your tradition.
After the spell is cast from the wand for the day, you can cast it one more time—overcharging the wand at the risk of destroying it. [[Cast the Spell|Cast a Spell]] again, then roll a DC 10 flat check. On a success, the wand is broken. On a failure, the wand is destroyed.
If anyone tries to overcharge a wand when it’s already been overcharged that day, the wand is automatically destroyed (even if it had been repaired) and no spell is cast.
After you cast the spell, an additional missile or missiles are released from the wand at the start of each of your turns, as though you cast the 1-action version of magic missile. Choose targets each time.
This lasts for 1 minute, until you’re no longer wielding the wand, or until you try to activate the wand again.
''Craft Requirements'' Supply a listed-level casting of [[Magic Missile]].
| !Spell Level | !Wand Level | !Wand Price |
| 1st | 5 | 1600 |
| 3rd | 9 | 7000 |
| 5th | 13 | 30000 |
| 7th | 17 | 150000 |
This polished black wand has a green gem at the tip, and anyone who looks into it sees a reflection of a grinning skull instead of their face.
''Activate'' [[Cast a Spell]]; ''Frequency'' once per day, plus overcharge; ''Effect'' You cast [[Finger of Death]] of the indicated level.
[[Finger of Death]] must be on your spell list. Because you’re the one casting the spell, use your spell attack roll and spell DC. The spell is of your tradition.
After the spell is cast from the wand for the day, you can cast it one more time—overcharging the wand at the risk of destroying it. [[Cast the Spell|Cast a Spell]] again, then roll a DC 10 flat check. On a success, the wand is broken. On a failure, the wand is destroyed.
If anyone tries to overcharge a wand when it’s already been overcharged that day, the wand is automatically destroyed (even if it had been repaired) and no spell is cast.
If the spell slays its target, the corpse releases negative energy in a 20-foot emanation, dealing negative damage equal to double the spell’s level.
''Craft Requirements'' Supply a listed-level casting of [[Finger of Death]].
| !Spell Level | !Wand Level | !Wand Price |
| 7th | 16 | 100000 |
| 8th | 18 | 240000 |
| 9th | 20 | 700000 |
This blackened, heavily burned stick smells faintly of bat guano.
''Activate'' [[Cast a Spell]]; ''Frequency'' once per day, plus overcharge; ''Effect'' You cast [[Fireball]] of the indicated level.
[[Fireball]] must be on your spell list. Because you’re the one casting the spell, use your spell attack roll and spell DC. The spell is of your tradition.
After the spell is cast from the wand for the day, you can cast it one more time—overcharging the wand at the risk of destroying it. [[Cast the Spell|Cast a Spell]] again, then roll a DC 10 flat check. On a success, the wand is broken. On a failure, the wand is destroyed.
If anyone tries to overcharge a wand when it’s already been overcharged that day, the wand is automatically destroyed (even if it had been repaired) and no spell is cast.
Each creature that fails its save takes persistent fire damage.
''Craft Requirements'' Supply a listed-level casting of [[Fireball]].
| !Spell Level | !Wand Level | !Wand Price | !Persistent Damage |
| 3rd | 8 | 5000 | 1d6 |
| 5th | 12 | 20000 | 2d6 |
| 7th | 16 | 100000 | 3d6 |
| 9th | 20 | 700000 | 4d6 |
The end of this wand is forked instead of tapered.
A wand contains a spell that can be cast once per day.
Casting a spell from a wand requires holding the wand in one hand and activating the item with a [[Cast a Spell]] activity.
''When using a Wand of Widening, the activation takes {{TwoAction}} if the spell normally takes {{OneAction}} to cast, or {{ThreeAction}} if the spell normally takes {{TwoAction}}.''
''Add 5 feet to the radius of a burst that normally has a radius of at least 10 feet; add 5 feet to the length of a cone or line that is normally 15 feet long or smaller; or add 10 feet to the length of a larger cone or line.''
To cast a spell from a wand, it must be on your spell list. Because you’re the one casting the spell, use your spell attack roll and spell DC. The spell is of your tradition.
A spell cast from a wand doesn’t require physical material components, but you must replace any material component normally required to cast the spell with a somatic component.
If the spell requires a focus, you must still have that focus to cast the spell from a wand, and if the spell has a cost, you must still pay that cost to cast the spell from a wand.
After the spell is cast from the wand for the day, you can cast it one more time—overcharging the wand at the risk of destroying it. [[Cast the Spell|Cast a Spell]] again, then roll a DC 10 flat check. On a success, the wand is broken. On a failure, the wand is destroyed.
If anyone tries to overcharge a wand when it’s already been overcharged that day, the wand is automatically destroyed (even if it had been repaired) and no spell is cast.
A wand’s base statistics are the same unless noted otherwise in a special wand. It has light Bulk, and must be held in one hand to be activated. Each wand contains a specific level of the spell, but you can craft a wand with a heightened version of a spell.
Each type of wand has a Level and Price determined by the spell’s level. The wand’s rarity matches the spell’s rarity, and it has its spell’s traits. A wand has the normal Hardness, BT, and HP of a thin item of its material.
''Craft Requirements'' Supply a listed-level casting of the spell. The spell must have a casting time of {{OneAction}} or {{TwoAction}}, can't have a duration, and must have an area of burst (10 feet or more), cone, or line.
| !Spell Level | !Wand Level | !Wand Price |
| 1st | 4 | 1000 |
| 2nd | 6 | 2500 |
| 3rd | 8 | 5000 |
| 4th | 10 | 10000 |
| 5th | 12 | 20000 |
| 6th | 14 | 45000 |
| 7th | 16 | 100000 |
| 8th | 18 | 240000 |
| 9th | 20 | 700000 |
//You must be a member of an Elf heritage that is related to an environment, such as [[Cavern Elf]] or [[Arctic Elf]].//
While all elves adapt to their environments over time, you have traveled so widely and become attuned to so many environs that your body now changes more rapidly than other elves.
After spending a week in an environment associated with an elf heritage (such as snow for [[Arctic Elf]], or a forest or jungle for [[Woodland Elf]]) your heritage automatically changes to become that heritage.
This never causes you to change to an elf heritage that isn’t related to an environment, such as ancient elf, seer elf, or whisper elf.
You’re surrounded by soothing energy.
You and allies within 60 feet of you are protected from [[severe environmental heat and cold|Temperature Effects]].
If you’re legendary in [[Survival]], you and those allies are also protected from extreme environmental heat and cold..
You have extensive training in remote environments, allowing you to move through these areas easily.
When you gain this feat, you can choose to gain either a climb Speed of 20 feet or a swim Speed of 20 feet.
Your soul is warded against the power of undeath and plague, as well as that of the evil former psychopomps known as sahkils.
You gain a +1 circumstance bonus to saving throws against <<tag Death>> effects, <<tag Disease>>, and all effects from undead or sahkils.
This bonus increases to +2 against an undead or sahkil’s death effect or disease.
''Trigger'' You attempt a flat check for [[Steady Spellcasting]], but you haven’t rolled yet.
You carefully ward your spell by drawing from a mantle of magical energy you prepared to protect your casting, increasing your chance of retaining the spell.
You reduce the DC of the flat check for Steady Spellcasting from 15 to 10.
{{||RitualSummaryTable}}
''Cost'' rare incenses, oils, and powdered silver, worth 150 gp total
This ritual has long been used to guard the private sanctums of powerful rulers, spellcasters, and other figures of import. You and the other casters spend the casting time burning incense, anointing doorframes, and drawing lines of powered silver across entryways.
The ritual creates the following magical effects within the area; these effects are heightened to the level of ward domain and remain throughout the duration.
* All gates, doors, windows, and similar apertures in the area (if any) are locked, with the effects of [[Lock]].
* You can obscure up to six doors, doorways, or similar entrances within the area with the effects of [[Illusory Object]] to appear as plain walls.
* <<tag Scrying>> spells can’t perceive any stimuli from the area, and ward domain attempts to [[Counteract]] <<tag Teleportation>> effects into or out of the area, including attempts to summon creatures into the area, using a modifier equal to the ritual’s save DC – 10.
A successful [[Dispel Magic]] used on a specific effect removes only that effect (such as the lock effect on one window). A successful [[Disjunction]] ends the entire ritual.
''Heightened (+1)'' The ward covers an additional area 100 feet × 100 feet, up to 50 feet high, which must be contiguous with the original area.
{{||ActionSuccessTable}}
''Prerequisites'' Expert in [[Medicine]].
You’ve studied in large medical wards, treating several patients at once and tending to all their needs.
When you use [[Treat Disease]] or [[Treat Wounds]], you can treat up to two targets. If you’re a master in Medicine, you can treat up to four targets, and if you’re legendary, you can treat up to eight targets.
You must have existing warden spells to take this feat.
By pointing out vulnerabilities, you grant the benefits listed in [[Hunt Prey]] and your hunter’s edge benefit to an ally until the end of their next turn.
Depending on whether you call out or use gestures, this action gains either the <<tag Auditory>> or <<tag Visual>> trait.
Your connection with your surroundings grows deeper as you focus.
If you have spent at least 2 Focus Points since the last time you Refocused, you recover 2 Focus Points when you [[Refocus]] instead of 1.
You can convey your prey’s location to your allies, no matter how well hidden it is.
As long as your hunted prey is observed by you, all your allies who roll failures and critical failures when [[Seek]]ing it get a success instead.
Your allies need to be able to see or hear you to gain this benefit.
You have to be able to call out or use gestures for your allies to get this benefit.
You can guide your allies to move quietly through the wilderness.
When you [[Sneak]] during exploration in natural terrain //(probably while using [[Avoid Notice]])//, you can designate any number of your allies to gain the benefits as if they were using that activity during that exploration.
This requires no action on their part.
You command unparalleled focus when you commune with the world around you.
If you have spent at least 3 Focus Points since the last time you Refocused, you recover 3 Focus Points when you [[Refocus]] instead of 1.
{{LOWGFeat}}
Your runes provide a warding effect that protects you against a specific school of magic.
Choose a school of magic other than divination. You gain a rune on your body corresponding to that school, and you gain a +2 circumstance bonus to all saving throws against effects of that school.
If you fail, but not critically fail, to [[Subsist]] in the wilderness, you can still keep yourself fed with poor meals.
When exploring, you can [[Hustle]] twice as long before you have to stop.
{{||SpellSummaryTable}}
You scramble a creature’s mental faculties and sensory input.
The target must attempt a [[Will]] saving throw.
Regardless of the result of that save, the target is then temporarily immune for 10 minutes.
Warp mind’s effects happen instantly, so [[Dispel Magic]] and other effects that counteract spells can’t counteract them. However, [[Alter Reality]], [[Miracle]], [[Primal Phenomenon]],
[[Restoration]], or [[Wish]] can still counteract the effects.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You create illusory hazards that cover all surfaces in the area (typically the ground).
Any creature moving through the illusion treats the squares as [[Difficult Terrain]].
A creature can attempt to disbelieve the effect as normal after using a [[Seek]] action or otherwise spending actions interacting with the illusion. If it successfully disbelieves, it ignores the effect for the remaining duration.
For each additional action you use casting the spell, the burst’s radius increases by 5 feet, to a maximum of 10 extra feet for 3 actions.
''Heightened (4th)'' You can make the illusion appear in the air rather than on a surface, causing it to function as difficult terrain for flying creatures.
You have trained in the more militant doctrine of your church, focusing on both spells and battle.
''First Doctrine'' (1st): You’re trained in light and medium armor, and you have expert proficiency in [[Fortitude]] saves. You gain the [[Shield Block]] general feat, a reaction to reduce damage with a shield. If your deity’s weapon is simple, you gain the [[Deadly Simplicity]] cleric feat.
At 13th level, if you gain the [[Divine Defense]] class feature, you also gain expert proficiency in light and medium armor.
''Second Doctrine'' (3rd): You’re trained in martial weapons.
''Third Doctrine'' (7th): You gain expert proficiency with your deity’s favored weapon. When you critically succeed at an attack roll using that weapon, you apply the weapon’s [[Critical Specialization Effect]]; use your divine spell DC if necessary.
''Fourth Doctrine'' (11th Level): Your proficiency ranks for divine spell attack rolls and spell DCs increase to expert.
''Fifth Doctrine'' (15th Level): Your proficiency rank for [[Fortitude]] saves increases to master. When you roll a success at a Fortitude save, you get a critical success instead.
''Final Doctrine'' (19th Level): Your proficiency ranks for divine spell attack rolls and spell DCs increase to master.
You’ve learned to put your sturdy claws to work digging through the earth.
You gain a burrow Speed of 15 feet.
You’re adept at making contact with other ysoki.
When you arrive at a new settlement, you automatically find the nearest ratfolk enclave by spending 1 day of downtime [[Search]]ing, provided one exists and its members aren’t actively hiding from you.
Once you’ve made contact, you gain a +1 circumstance bonus to [[Gather Information]] and [[Earn Income]] in the settlement.
You’re particularly good at solving mazes and navigating twists and turns.
You gain the trained proficiency rank in [[Survival]]. If you would automatically become trained in Survival (from your background or class, for example), you become trained in another skill of your choice.
When you [[Sense Direction]] or attempt a roll against a [[Maze]] spell, you get a result one degree of success better than you rolled.
You don’t take a penalty to Sense Direction when you lack a compass.
When you are underground, you can use the [[Seek]] action to sense undetected creatures within a 30-foot burst instead of a 15-foot burst.
In addition, if you roll a success on an Acrobatics check to [[Squeeze]], you get a critical success instead.
You’re trained in all simple and martial weapons.
The battlefield is your stage, the clang of steel, your song. Your muse engages in countless battles, whether reveling in combat or resigned to its necessity. If your muse is a creature, it might be an otherworldly soldier, such as a planetar, archon, cornugon, or purrodaemon. If it’s a deity, it might //a god of war//. As a bard with a warrior muse, you train for battle in addition to performance, and you prepare your allies for the dangers of battle. You might even wade into the thick of things with them.
You gain the [[Martial Performance]] feat and add [[Fear]] to your spell repertoire.
This ring is utilitarian in design—indicating its martial use. Its band is decorated only with a simple, sharp-edged sculpture on the band’s center.
While wearing this ring, you add your level to your attack rolls with all weapons with which you are untrained.
''Activate'' {{FreeAction}} (envision); ''Frequency'' once per day; ''Trigger'' You make an attack with a weapon in which you’re untrained; ''Effect'' You gain a +2 circumstance bonus to the attack roll. If you are an expert in any weapon, you instead gain a +4 circumstance bonus to the attack roll.
''Prerequisites'' Expert in [[Thievery]].
If you trigger a device or set off a trap while [[disarming|Disable a Device]] it, you gain a +2 circumstance bonus to your AC or saving throw against the device or trap.
This applies only to attacks or effects triggered by your failed attempt, not to any later ones, such as additional attacks from a complex trap.
Ever alert, you scout for danger even when you are trying to stay hidden.
You can perform the [[Scout]] exploration activity at the same time as the [[Avoid Notice]] exploration activity.
You menace the target, stoking their fears and drawing their attention.
Attempt an [[Intimidation]] check against the [[Will]] DC of a target within 30 feet.
If you succeed, for 1 minute, that target gains a +2 status bonus to [[Perception]] checks against you, but they take a –2 status penalty to [[Will]] saves against fear effects.
Your communal lifestyle causes you to pay close attention to the people around you, allowing you to more easily notice when they act out of character.
You gain a +2 circumstance bonus to [[Perception]] checks when using the [[Sense Motive]] basic action to notice enchanted or possessed characters.
If you aren’t actively using Sense Motive on an enchanted or possessed character, the GM rolls a secret check, without the usual circumstance and with a –2 circumstance penalty, for you to potentially notice the enchantment or possession anyway.
In addition to using it for skill checks, you can use the [[Aid]] basic action to grant a bonus to another creature’s saving throw or other check to overcome enchantment or possession. As usual for Aid, you need to prepare by using an action on your turn to encourage the
creature to fight against the effect.
{{||SpellSummaryTable}}
The targets can breathe underwater.
''Heightened (3rd)'' The duration increases to 8 hours.
''Heightened (4th)'' The duration increases to until your next [[daily preparations|Rest]].
You carry the ocean with you wherever you go.
You can cast [[Create Water]] as a primal innate spell once per day.
Each time you cast create water, you choose if you create fresh water or salt water.
You glide through the water with graceful ease.
When in an aquatic or swamp environment, you ignore the effects of non-magical difficult terrain.
In addition, swimming up or down isn’t difficult terrain for you.
Experience and training have taught you that water has just enough surface tension for a master sprinter to traverse the surface.
When you [[Stride]] in a straight line, if you move at least half your Speed over ground, you can move any amount of the remaining distance across a level body of water.
If you don’t end your Stride on solid ground, you fall into the water.
If you’re legendary in [[Athletics]], as long as you start on solid ground, any part of your Stride can cross the water’s surface, even if you aren’t moving a straight line, though you still fall into the water if you don’t end your movement on solid ground.
You can Stride across liquid and surfaces that don’t support your weight.
This benefit lasts only during your movement. If you end your movement on a surface that can’t support you, you fall in or it collapses as normal.
Water cradles your every step, allowing you to walk on its surface.
[[Stride]] up to your Speed.
During your movement, you can move across liquids that don’t support your weight.
If you end your movement on a surface that can’t support you, you fall into the liquid at the end of your movement.
You can increase the number of actions to 3 to Stride up to three times your Speed.
{{||SpellSummaryTable}}
The target can walk on the surface of water and other liquids without falling through.
It can go underwater if it wishes, but in that case it must [[Swim]] normally.
This spell doesn’t grant the ability to breathe underwater.
''Heightened (4th)'' The spell’s range increases to 30 feet, the duration increases to 1 hour, and you can target up to 10 creatures.
You gain a swim Speed of 15 feet.
This sense allows a monster to feel vibrations caused by movement through a liquid.
It’s an [[Imprecise]] sense with a limited range (listed in the ability).
Wavesense functions only if monster and the subject are in the same body of liquid, and only if the subject is moving through the liquid.
{{LOCGFeat}}
You have been blessed by the sea, granting you the ability to swim like a fish.
You gain a 15-foot swim Speed.
''Special'' If you have the [[Bonuwat Wavetouched]] background, you can take this feat at 1st level instead of 5th.
Your feathers are coated in a waxy substance that repels water.
You gain a +1 circumstance bonus to saving throws against effects that have the <<tag Water>> trait.
So long as you’re in a dry place, you can spend one action to shake off any water that clings to your clothing and feathers to instantly become dry.
You can use the unusual resonance of your wayfinder to grant it additional effects.
Choose one cantrip from the arcane, divine, occult, or primal list. You can activate your wayfinder to cast that cantrip at will.
Additionally, you can Activate your wayfinder with a {{OneAction}} (envision) activation to transform it into a nondescript pin or brooch to hide your affiliation with the Pathfinder Society. This transformation lasts for 1 hour.
You make sure that your allies push themselves while traveling.
You gain the [[Caravan Leader]] and [[Pick Up the Pace]] general feats, even if you don’t meet the prerequisites.
You’ve dedicated yourself to learning the intricacies of your weapons.
Your proficiency ranks for simple weapons, martial weapons, and unarmed attacks increase to expert.
You may also gain access to the [[Critical Specialization Effect]]s of weapons, under the following conditions based on your class (not counting Dedication feats):
* If you're a [[Champion]], an [[Investigator]], an [[Oracle]] or a [[Witch]], never.
* If you're a [[Ranger]], with all simple and martial weapons when attacking your hunted prey.
* If you're a [[Swashbuckler]], with all weapons with which you have expert proficiency.
Your rage makes you even more effective with the weapons you wield.
Your proficiency ranks for simple weapons, martial weapons, and unarmed attacks increase to master.
''Prerequisites'' trained in all martial weapons
You don’t take the normal –2 penalty to attack rolls with improvised weapons.
Additionally, whenever you gain a class feature that grants you expert or greater proficiency with any weapon, you also gain that proficiency with improvised weapons.
<<archetypefeatlist "4 6 8 10" "[[Weapon Improviser]]">>
You’ve learned fighting techniques that apply to all armaments, and you’ve developed unparalleled skill with your favorite weapons.
Your proficiency ranks for simple and martial weapons increase to master.
Your proficiency rank for advanced weapons increases to expert.
You can select one weapon group and increase your proficiency ranks to legendary for all simple and martial weapons in that weapon group, and to master for all advanced weapons in that weapon group.
You fully understand your weapons.
Your proficiency ranks for simple and martial weapons and unarmed attacks increase to master.
{{||SpellSummaryTable}}
''Requirements'' You have a deity.
An immense weapon of force appears, hovering in the air above the target.
The weapon has the ghostly visual appearance of your deity’s favored weapon.
Name "war" or "peace" when you cast this spell.
If you name “war,” mentally choose one creature. This must be a creature both you and the target can see. The target instinctively knows which creature this is. At the end of each of the target’s turns, if the target did not use a hostile action against the creature you chose during that turn, the weapon [[Strike]]s the target.
If you name “peace,” mentally choose up to five allies. The target instinctively knows who those allies are. The weapon [[Strike]]s the target each time the target uses a [[Hostile Action]] against you or one of your allies. The weapon Strikes only once per action, even if the action targets multiple allies (such as for a [[Fireball]] or a [[Whirlwind Strike]]).
Strikes with the weapon are melee weapon attacks, but they use your spell attack modifier.
Regardless of its appearance, the weapon deals force damage equal to 3d10 plus your spellcasting ability modifier. When the weapon Strikes, you can deal damage of the normal damage type of the weapon instead of force damage (or any of the available damage types, for a versatile weapon).
The weapon takes a multiple attack penalty, which increases throughout the target’s turn, but its penalty is separate from yours.
No other statistics or attributes of the weapon apply, and even a ranged weapon attacks adjacent creatures only.
A weapon of judgment is a weapon for the purposes of triggers, resistances, and so forth.
The weapon doesn’t take up space, grant flanking, or have any other attributes a creature would.
The weapon can’t make any attack other than its Strike, and feats or spells that affect weapons do not apply to this weapon.
''Heightened (10th)'' The force damage increases by 1d10.
''Usage'' etched onto a weapon.
Magical enhancements make this weapon strike true.
You can upgrade the weapon potency rune already etched on a weapon to a stronger version, increasing the values of the existing rune to those of the new rune. You must have the formula of the stronger rune to do so, and the Price of the upgrade is the difference between the two runes’ Prices.
| !Type | !Level | !Price | !Craft Requirement | !Item bonus to hit | !Property Runes Allowed |
| +1 | 2 | 350 | Expert [[Crafting]] | +1 | 1 |
| +2 | 10 | 9350 | Master [[Crafting]] | +2 | 2 |
| +3 | 16 | 89350 | Legendary [[Crafting]] | +3 | 3 |
You become trained in all simple weapons.
If you were already trained in all [[Simple]] weapons, you become trained in all [[Martial]] weapons.
If you were already trained in all [[Martial]] weapons, you become trained in one [[Advanced]] weapon of your choice.
You can select this feat more than once. Each time you do, you become trained in additional weapons as appropriate, following the above progression.
You learn how to alter the magic of weapon runes by using a crystal as a focusing component.
Once per day during your daily preparations, you can focus on a rune’s magical energies through a crystal’s facets to alter a single property rune on one weapon in your possession to suppress its normal effects and make it function as a different property rune.
You can temporarily alter the rune to function as one of the following runes: [[Corrosive]], [[Flaming]], [[Frost]], [[Ghost Touch]], [[Grievous]], [[Returning]], [[Shock]], [[Thundering]], or [[Wounding]].
The property rune remains altered until you make your next daily preparations.
The weapon must meet the prerequisites for the temporary rune, and any other runes that required the suppressed rune are also suppressed while the rune is transformed.
The rune is obviously altered, and thus the weapon can’t be sold as though it had the temporary rune.
You’ve learned how to inflict greater injuries with the weapons you know best.
You deal 2 additional damage with weapons and unarmed attacks in which you are an expert.
This damage increases to 3 if you’re a master, and to 4 if you’re legendary.
//If you are a [[Barbarian]], you also gain your instinct's specialization ability. This does not apply if you have Barbarian Dedication.//
{{||SpellSummaryTable}}
You swing a weapon you’re holding, and the weapon magically multiplies into duplicates that swipe at all creatures in either a cone or an emanation.
This flurry deals four dice of damage to creatures in the area //with a basic [[Reflex]] save//. This damage has the same type as the weapon and uses the same die size.
Determine the die size as if you were attacking with the weapon; for instance, if you were wielding a two-hand weapon in both hands, you’d use its two-hand damage die.
//If the creature rolls a critical failure on the basic Reflex save, they are also subject to the weapon's [[Critical Specialization Effect]].//
''Heightened (+1)'' Add another damage die.
Your skill with weapons lets you attack swiftly at all times.
You’re permanently [[Quickened]].
You can use your extra action only to [[Strike]].
{{||SpellSummaryTable}}
Holding your weapon aloft, you fill it with divine energy.
On your next [[Strike]] with that weapon before the start of your next turn, you gain a +1 status bonus to the attack roll and the weapon deals an additional die of damage.
If the weapon has a [[Striking]] rune, this instead increases the number of dice from the striking rune by 1 (to a maximum of 3 extra weapon dice).
If the target weapon leaves your possession, weapon surge immediately ends.
You have become thoroughly familiar with the tools of your trade.
You gain expert proficiency in simple weapons, as well as the rapier, sap, shortbow, and shortsword.
When you critically succeed at an attack roll against a [[Flat-Footed]] creature while using an [[Agile]] or [[Finesse]] simple weapon or any of the listed weapons, you apply the [[Critical Specialization Effect]] for the weapon you’re wielding.
{{||SpellSummaryTable}}
You create a sticky web in the area that impedes creatures’ movement each time they try to move through it.
Squares filled with the web are [[Difficult Terrain]].
Each square can be cleared of the web by a single attack or effect that deals at least 5 slashing damage or 1 fire damage. A square has AC 5, and it automatically fails its saving throws.
Each time a creature in the web begins to use a move action or enters the web during a move action, it must attempt an [[Athletics]] check or [[Reflex]] save against your spell DC to avoid taking a circumstance penalty to its Speeds or becoming immobilized.
A creature that gets out of the web ceases to take a circumstance penalty to its Speed from the web.
{{||SaveSuccessTable}}
''Heightened (4th)'' The spell’s area increases to a 20-foot [[Burst]], and its range increases to 60 feet.
Guilt clouds the minds of those who ignore your [[Glimpse of Redemption]].
Instead of making the triggering creature [[Enfeebled]] 2, you can make it [[Stupefied]] 2 for the same duration.
{{||SpellSummaryTable}}
You fill the targets’ minds with terrifying images of fearsome creatures, each drawn from the targets’ worst fears.
Only the targets can see their assailants.
Each target takes 16d6 mental damage and must attempt a [[Will]] save.
{{||SaveSuccessTable}}
You are fastidious about keeping yourself clean, whether licking your fur or carefully using traditional catfolk hygiene products, to salubrious effect.
You gain a +1 circumstance bonus to saving throws against <<tag Disease>>s. If you roll a success on a saving throw against a disease, you get a critical success instead.
You have seen people from so many walks of life in your travels that you naturally adopt a pleasant and affable demeanor when meeting others.
<<trainnodupe "Diplomacy">>
In addition, you gain the [[Hobnobber]] skill feat.
You’re resilient to performative influences that aren’t your own.
You gain a +1 circumstance bonus to saving throws against effects with the <<tag Auditory>>, <<tag Illusion>>, <<tag Linguistic>>, <<tag Sonic>>, or <<tag Visual>> traits.
Choose <<tag Arcane>>, <<tag Divine>>, or <<tag Occult>>. You gain one cantrip from that magical tradition’s spell list. You can cast this spell as an innate spell at will, as a spell of your chosen tradition. A cantrip is heightened to a spell level equal to half your level rounded up. Whenever you gain a primal innate spell from a gnome ancestry feat, change its tradition from primal to your chosen tradition.
You gain a 15-foot swim Speed.
You enter a mindful stance that creates a deep connection between you and your monk weapons, allowing you to manipulate them with your ki even at a distance.
All melee monk weapons you wield with the [[Finesse]] trait gain the [[Thrown]] 10 feet trait (unless they already have the thrown trait with a greater range).
Once you’ve made a thrown [[Strike]] with such a weapon, you can use the precision of your throw to make additional strikes with it, even from a distance. Start from the space of the previous Strike’s target to determine the range increment and whether the new target has [[Cover]].
At the end of your turn, the thrown weapon flies directly back to you in a straight line. If a solid barrier blocks its path, it falls to the ground after hitting the barrier.
{{||SpellSummaryTable}}
You call forth a storm of whirling flames, engulfing all creatures in that area and dealing 5d6 <<tag Fire>> damage with a basic [[Reflex]] save.
''Heightened (+2)'' The damage increases by 3d6, and you can add another nonoverlapping 5-foot [[Burst]] to the area.
{{||SpellSummaryTable}}
You surround yourself in a vortex of whirling colorful scarves of force that obfuscate you and disorient your foes.
You gain the benefits of the [[Concealed]] condition, but only against ranged and melee attacks.
When a melee attack fails to hit you because of the flat check for the concealed condition, the scarves snag the weapon or unarmed attack, and the creature takes a –1 circumstance penalty to further attacks with that weapon or unarmed attack until the end of its turn (or the end of its next turn, if it wasn’t the creature’s turn).
The timing of the scarves’ movement is harder to predict for ranged attackers, so the flat check for the concealed condition against ranged attacks increases from DC 5 to DC 6.
You can [[Dismiss]] this spell.
''Heightened (+2)'' The circumstance penalty to further attacks with a melee weapon or unarmed attack the scarves snag increases by 1. The DC of the flat check for the concealed
condition against ranged attacks increases by 1.
''Requirements'' You have a creature [[Grabbed]] or [[Restrained]].
You propel your grabbed or restrained foe a great distance.
You can throw the creature any distance up to 10 feet, plus 5 feet × your [[Strength]] modifier.
Attempt an [[Athletics]] check against the foe’s [[Fortitude]] DC. You take a –2 circumstance penalty to your check if the target is one size larger than you and a –4 circumstance penalty if it’s larger than that. You gain a +2 circumstance bonus to your check if the target is one size smaller than you and a +4 circumstance bonus if it’s smaller than that.
If you successfully throw the creature, it takes bludgeoning damage equal to your Strength modifier plus 1d6 per 10 feet you threw it.
{{||ActionSuccessTable}}
''Prerequisites'' Expert proficiency in your staff
''Requirements'' You are wielding your staff, which must have the parry trait.
You use your staff as a defensive implement as well as an offensive one.
You gain a +2 circumstance bonus to AC as long as you remain in this stance.
You attack all nearby adversaries.
Make a melee [[Strike]] against each enemy within your melee reach.
Each attack counts toward your [[Multiple Attack Penalty]], but do not increase your penalty until you have made all your attacks.
As long as you can hear normally, you can use the [[Seek]] action to sense undetected creatures in a 60-foot cone instead of a 30-foot cone. You also gain a +2 circumstance bonus to locate undetected creatures that you could hear within 30 feet with a Seek action.
''Frequency'' once per day.
You carefully consider your case and narrow down some of the details.
When you [[Pursue a Lead]], you can spend 10 minutes instead of 1 minute to ask two questions of the GM as you complete the activity. The GM must answer truthfully with “yes” or “no,” though if the answer would be misleading or have no practical application to your investigation the GM can answer “immaterial.”
You can’t use Whodunnit? more than once for the same lead, even across different days.
Your questions must come from the following list, applying to either the creature or the clue you found:
* Was the clue left by a (creature trait)? (Choose a creature trait such as humanoid, undead, or dwarf; this trait must be accurate as of the time the clue was left.)
* Was this clue left within the last hour?
* Was this clue left within the last day?
* Was the creature that left the clue in a heightened emotional state when it left the clue?
* Did the creature attempt to conceal this clue?
{{||SpellSummaryTable}}
You heal yourself in one of the following ways, chosen by you when you cast the spell.
* You regain 8 Hit Points.
* You attempt to cure one [[Poison]] or [[Disease]] afflicting you; attempt to [[Counteract]] the affliction.
''Heightened (+1)'' If you choose to regain Hit Points, the Hit Points regained increase by 8.
You manipulate the energy of your spell, causing it to affect a wider area.
If the next action you use is to [[Cast a Spell]] that has an area of a burst, cone, or line and does not have a duration, increase the area of that spell.
Add 5 feet to the radius of a burst that normally has a radius of at least 10 feet (a burst with a smaller radius is not affected).
Add 5 feet to the length of a cone or line that is normally 15 feet long or smaller, and add 10 feet to the length of a larger cone or line.
Once you have penetrated a foe’s defenses, you can home in on the same spot to exploit your opponent’s wound and deal some serious damage.
The second time you hit and deal damage with a melee axe Strike to the same opponent or object during your turn, you ignore half of the opponent’s or object’s Hardness, if any.
If you hit and deal damage with a melee axe Strike to the same opponent or object a third or fourth time during your turn, you ignore all of its Hardness, if any.
You have a connection to the creatures of the natural world that allows you to communicate with them on a rudimentary level.
You can use [[Diplomacy]] to [[Make an Impression]] on animals and to make very simple [[Request]]s of them.
In most cases, wild animals will give you time to make your case.
[[Druid]]s gain this as a standard class ability.
{{||SpellSummaryTable}}
You morph your body based on your training, choosing one of the following effects based on your wild order feats.
* If you have [[Wild Shape]], you can morph your hands into wild claws. Your hands transform into incredibly sharp claws. These claws are an unarmed attack you’re trained in and deal 1d6 slashing damage each ([[Agile]], [[Finesse]]). You can still hold and use items with your hands while they’re transformed by this spell, but you cannot hold an item while attacking.
* If you have [[Insect Shape]], you can instead transform your mouth into wild jaws, an unarmed attack you’re trained in that deals 1d8 piercing damage.
* If you have [[Elemental Shape]], you can morph your body to be partially composed of elemental matter, granting you resistance 5 to critical hits and precision damage.
* If you have [[Plant Shape]], you can morph your arms into long vines, increasing your reach to 10 feet (or 15 feet with a reach weapon).
* If you have [[Soaring Shape]], you can cast the spell as a two-action activity ({{TwoAction}} somatic, verbal) to grow wings from your back. These wings allow you to fly with a fly Speed of 30 feet.
''Heightened (6th)'' You can choose up to two of the effects from the list. Wild claws leave terrible, ragged wounds that also deal 2d6 persistent bleed damage on a hit, and wild jaws are envenomed, also dealing 2d6 persistent poison damage on a hit.
''Heightened (10th)'' You can choose up to three of the effects from the list. Wild claws deal 4d6 persistent bleed damage on a hit, and wild jaws deal 4d6 persistent poison damage on a hit.
The savage, uncontrollable call of the natural world infuses you, granting you the ability to change your shape and take on the ferocious form of a wild creature.
You are trained in [[Intimidation]].
You also gain the [[Wild Shape]] druid feat.
You gain the [[Wild Morph]] order spell.
Becoming fully domesticated by the temptations of civilization is anathema to your order. (This doesn’t prevent you from buying and using processed goods or staying in a city for an adventure, but you can never come to rely on these conveniences or truly call such a place your permanent home.)
{{||SpellSummaryTable}}
You infuse yourself with primal essence and transform yourself into another form.
You can polymorph into any form listed in [[Pest Form]], which lasts 10 minutes. All other wild shape forms last 1 minute.
You can add more forms to your wild shape list with druid feats; your feat might grant you some or all of the forms from a given polymorph spell.
When you transform into a form granted by a spell, you gain all the effects of the form you chose from a version of the spell heightened to wild shape’s level.
Wild shape allows you to use your own shapeshifting training more easily than most polymorph spells. When you choose to use your own attack modifier while polymorphed instead of the form’s default attack modifier, you gain a +2 status bonus to your attack rolls.
''Heightened (2nd)'' You can also wild shape into the forms listed in [[Animal Form]].
You move quickly through obstacles, whether they’re tumbled stone, tangled undergrowth, or sucking mud.
You can ignore the effects of non-magical [[Difficult Terrain]]. As normal for ignoring difficult terrain, this also lets you treat the hindrances of greater difficult terrain as those of difficult terrain.
Natural obstacles pose no obstacle to you.
You gain the ranger’s [[Wild Stride]] class feature.
This allows you to ignore the effects of all non-magical difficult terrain, treat greater difficult terrain as merely difficult terrain, and gives you an additional benefit from [[Favored Terrain]] based on the terrain.
''Requirements'' You are in [[Wild Winds Stance]].
You store up energy and release it in an enormous gust of rushing wind.
Make a wind crash [[Strike]] against each creature in your choice of a 30-foot [[Cone]] or a 60 foot [[Line]].
These attacks all count toward your [[Multiple Attack Penalty]], but the penalty doesn’t increase until after you make all the attacks.
{{||SpellSummaryTable}}
You take on the stance of the flowing winds, sending out waves of energy at a distance.
You can make "wind crash" unarmed [[Strike]]s as ranged Strikes against targets within 30 feet. These deal 1d6 bludgeoning damage, use the brawling group, and have the [[Agile]], [[Nonlethal]], [[Propulsive]], and [[Unarmed]] traits. Wind crash Strikes ignore concealment and all cover.
While entering the stance is a ki spell, the wind crash Strikes the stance grants are not, so you can use them as often as you like while in the stance.
While in wild winds stance, you gain a +2 circumstance bonus to AC against ranged attacks.
The whispers of the jungle grant you more diverse access to simple primal magic.
You can cast [[Dancing Lights]], [[Disrupt Undead]], and [[Tanglefoot]] as innate primal spells at will.
If you chose one of those spells with [[Wildborn Magic]], you can select a new spell for Wildborn Magic.
{{LOCGFeat}}
You have learned to access the old magic of wild places. Choose one cantrip from the <<tag Primal>> spell list.
You can cast this cantrip as an innate primal spell at will.
A cantrip is heightened to a spell level equal to half your level rounded up.
''Cantrips available:''
<<bulletlist "[tag[Primal]tag[Cantrip]]">>
Select one type of terrain from the following list: aquatic, arctic, desert, forest, mountain, plains, sky, swamp, or underground.
You can use [[Survival]] in place of [[Perception]] to roll initiative when in the selected terrain in a natural location (not a structure) even if you weren’t tracking or otherwise using Survival before the encounter.
You can also use [[Survival]] instead of Perception to notice traps in natural locations in the chosen terrain; if you find a snare in this way, you can also use [[Survival]] instead of [[Thievery]] to [[Disable the Device|Disable a Device]].
''Special'' You can select this feat more than once. Each time you select it, the feat applies to a new type of terrain.
{{||SpellSummaryTable}}
With a few words, you convince a wild creature you are a kindred spirit, making it reluctant to harm you.
The target must attempt a [[Will]] save.
Regardless of the outcome, the target is then temporarily immune for 1 minute.
{{||SaveSuccessTable}}
You ignore [[Difficult Terrain]] from trees, foliage, and undergrowth.
//A Will save is used to avoid being tricked, being afraid, or other mental effects.//
//Will is governed by [[Wisdom]].//
//Being [[Stupefied]], [[Fatigued]], [[Sickened]] or [[Frightened]] reduces your Will rolls.//
{{||DefenseList}}
{{||SpellSaveList}}
Some spells restrict you to willing targets.
A player can declare their character a willing or unwilling target at any time, regardless of turn order or their character’s condition (such as when a character is paralyzed, unconscious, or even dead).
''Frequency'' once per day
''Trigger'' An ally within 30 feet takes damage that would otherwise reduce them to 0 Hit Points and give them the [[Dying]] condition.
Once, you died because you valued someone else’s life above your own; just as then, you protect an ally by suffering in their stead.
Reduce the damage the triggering ally would take by 1 + your level.
You redirect this damage to yourself, but your immunities, weaknesses, resistances, and so on don’t apply.
You aren’t subject to any conditions or other effects from whatever damaged your ally (such as poison from a venomous bite)—your ally is still subject to those effects even if you redirect all of the triggering damage to yourself.
If the redirected damage prevents the ally from being reduced to 0 Hit Points, they remain conscious and don’t gain the dying condition.
''Special'' You can select this feat only at 1st level, and you can’t retrain into or out of this feat.
Your fan can stir up even more powerful winds.
You can Activate your tengu feather fan one additional time per day.
Add the 3rd-level [[Wall of Wind]] spell to the spells contained within your fan.
{{||SpellSummaryTable}}
You gain a fly Speed equal to your Speed. You must end your turn on solid ground, or you fall.
''Heightened (6th)'' At the end of your turn, you can attempt a DC 30 [[Acrobatics]] check to find purchase in midair. If you succeed, you don’t fall.
You are at home in tempestuous weather and accustomed to even the harshest winds.
You gain a +1 circumstance bonus to saves against <<tag Air>> and <<tag Electricity>> effects. If you roll a success on a save against an <<tag Air>> effect, you get a critical success instead.
{{||SpellSummaryTable}}
When you cast this spell, each target transforms into a vaguely cloud-like form and is picked up by a wind moving in the direction of your choice.
You can change the wind’s direction by using a single action, which has the <<tag Concentrate>> trait.
The wind carries the targets at a Speed of 20 miles per hour, but if any of the targets make an attack, Cast a Spell, come under attack, or otherwise enter encounter mode, the spell ends for all targets just after they roll [[Initiative]], and they drift gently to the ground.
''Frequency'' Once per round.
Any journey consists of more than simply reaching your destination.
You use two of the following actions in any order: [[Stand]], [[Step]], and [[Stride]]. You can’t use the same action twice.
With a sharp flap of your wings, you stay light on your feet as you move. You [[Step]] twice.
''Usage'' etched onto armor.
This rune is a swirling glyph on the front of the armor. A large pair of transparent, ephemeral wings floats out from the back of the armor.
''Activate'' {{TwoActions}} command, [[Interact]]; ''Frequency'' once per hour; ''Effect'' You trace the rune on the front of the breastplate and the armor’s ephemeral wings grow tangible, granting you a fly Speed of 25 feet or your land Speed, whichever is slower. This effect lasts for 5 minutes or until you Dismiss it. Once the effect ends, the wings disappear completely, reappearing in their ephemeral form 1 hour later.
''Greater Winged'': Once activated, the wings remain tangible indefinitely. You can Dismiss the activation if you choose, and you don’t have to wait an hour to activate the rune again.
You’re among the few kobolds who grow a set of draconic wings later in life. The wings are initially small and weak; while not enough for full flight, a strong flap allows you to jump further.
When [[Leap]]ing horizontally, you move an additional 5 feet (this additional distance isn’t cumulative with the increased Leap distance from the [[Powerful Leap]] feat).
You don’t automatically fail your checks to [[High Jump]] or [[Long Jump]] if you don’t [[Stride]] at least 10 feet first.
In addition, when you attempt a [[Long Jump]], you can jump a distance up to 10 feet higher than you normally would based on the result of your [[Athletics]] check, though you still can’t jump farther than your Speed.
''Frequency'' once per day
You can strain to call forth feathered or cloudy wings from your back. Once manifested, these wings remain for 10 minutes.
You gain a fly Speed equal to your land Speed while you’ve manifested your wings.
You can manifest draconic wings to soar through the air at great speed.
You gain the [[Dragon Wings]] sorcerer bloodline spell and a focus pool of 1 Focus Point. If you already have a focus pool, increase your number of Focus Points by 1.
{{||SpellSummaryTable}}
You fling a hollow icicle filled with winter’s wrath.
Make a spell attack against a target within range.
The bolt deals 1d8 piercing damage and lodges in the target.
At the end of the target’s next turn, the bolt shatters, releasing a whirl of snow and ice that deals 1d12 cold damage to the target and all adjacent creatures.
The bolt can be removed with an [[Interact]] action, which causes it to melt harmlessly without detonating.
//If the spell attack is a critical success, the initial bolt does not deal extra damage, but// the bolt becomes especially well anchored, taking 2 Interact actions to remove; and the bolt’s explosion deals double damage.
''Heightened (+1)'' The initial damage increases by 1d8 and the secondary damage increases by 1d12.
Your eyes are keen and accustomed to winter conditions.
You ignore [[Concealment|Concealed]] caused by ice and snow.
You gain cold resistance equal to half your level (minimum 1). You treat environmental cold effects as if they were one step less extreme (incredible cold becomes extreme, extreme cold becomes severe, and so on).
You become trained in [[Survival]], and you treat [[environmental cold effects|Temperature Effects]] as if they were one step less extreme (incredible cold becomes extreme, extreme cold becomes severe, and so on).
This elixir warms your core and improves your circulation.
For 24 hours, you are protected from the effects of some levels of [[cold|Temperature Effects]].
| !Type | !Level | !Price | !Protects against |
| Lesser | 4 | 150 | Severe |
| Moderate | 12 | 3200 | Severe, Extreme |
| Greater | 16 | 14000 | Severe, Extreme, Incredible |
You gain cold resistance equal to half your level (minimum 1), and you treat environmental cold effects as if they were one step less extreme (incredible cold becomes extreme, extreme cold becomes severe, and so on).
Wisdom measures your character’s common sense, awareness, and intuition.
Your Wisdom modifier is added to your [[Perception]] and [[Will]] saving throws.
//Wisdom governs [[Medicine]], [[Nature]], [[Religion]] and [[Survival]].//
//Being [[Stupefied]], [[Sickened]] or [[Frightened]] reduces your Wisdom rolls.//
{{||StatModSummary}}
{{||SpellSummaryTable}}
You state a wish, making your greatest desire come true.
A wish spell can produce any one of the following effects.
* Duplicate any arcane spell of 9th level or lower.
* Duplicate any non-arcane spell of 7th level or lower.
* Produce any effect whose power level is in line with the above effects.
* Reverse certain effects that refer to the wish spell.
The GM might allow you to try using wish to produce greater effects than these, but doing so might be dangerous or the spell might have only a partial effect.
//Although it is a common joke, there is no rules support in this game for the idea that any Wish is interpreted pedantically with intent to cause harm.//
''Arcane spells that can be duplicated:''
<$list filter="[tag[Spell]tag[Arcane]]" variable="spell">
<$list filter="[<spell>get[m-level]compare:number:lteq[9]]">
<$link to=<<spell>> />,
</$list>
</$list>
''Non-Arcane spells that can be duplicated:''
<$list filter="[tag[Spell]!tag[Arcane]]" variable="spell">
<$list filter="[<spell>get[m-level]compare:number:lteq[7]]">
<$link to=<<spell>> />,
</$list>
</$list>
Once per day when you use [[Advanced Alchemy]] during your daily preparations, you can spend a batch of infused reagents to create a wish vial containing a single common arcane spell of your choice of 8th level or lower. (//But not actually Wish.//)
The spell must have a casting time of no more than 3 actions, no Cost, and must be able to target you.
Only you can Activate the wish vial, which takes the same number of [[Interact]] actions as the spell’s casting time and grants you the effects of the spell.
{{||SpellSummaryTable}}
You focus your magic upon an enemy, wishing for their defenses to fail and turning their strengths into weaknesses.
The target must attempt one [[Will]] saving throw for all of the following effects.
* The target gains weakness 5 to one energy type of your choice.
* The target’s resistances are reduced by 5.
* The target takes a –10-foot status penalty to all its Speeds.
* The target takes a –1 status penalty to its saving throws.
''Heightened (+1)'' Increase the weakness and the reduction to resistances by 1.
{{||SaveSuccessTable}}
You’re Small instead of Medium. You gain the trained proficiency rank in [[Acrobatics]], the [[Quick Squeeze]] skill feat, and a +1 circumstance bonus to Acrobatics checks to [[Tumble Through]]. If you would automatically become trained in Acrobatics (from your background or class, for example), you instead become trained in a skill of your choice.
You are friendly, clever, and full of humor, always knowing just what to say in any situation. Your witticisms leave foes unprepared for the skill and speed of your attacks.
You are trained in [[Diplomacy]] and gain the [[Bon Mot]] skill feat.
You gain panache during an encounter whenever you succeed at a Bon Mot against a foe.
!! Splats
| !Theme | !Spell List | !Patron Skill | !Hex Cantrip | !Granted Spell |
| Curse | Occult | [[Occultism]] | [[Evil Eye]] | [[Ray of Enfeeblement]] |
| Fate | Occult | [[Occultism]] | [[Nudge Fate]] | [[True Strike]] |
| Fervor | Divine | [[Religion]] | [[Stoke the Heart]] | [[Command]] |
| Night | Occult | [[Occultism]] | [[Shroud of Night]] | [[Sleep]] |
| Rune | Arcane | [[Arcana]] | [[Discern Secrets]] | [[Magic Weapon]] |
| Wild | Primal | [[Nature]] | [[Wilding Word]] | [[Summon Animal]] or [[Summon Plant or Fungus]] |
| Winter | Primal | [[Nature]] | [[Clinging Ice]] | [[Gust of Wind]] |
!! Lessons
| !Lesson | !Level | !Hex | !Familiar Spell |
| Dreams | Basic | [[Veil of Dreams]] | [[Sleep]] |
| The Elements | Basic | [[Elemental Betrayal]] | [[Burning Hands]], [[Air Bubble]], [[Hydraulic Push]] or [[Pummeling Rubble]] |
| Life | Basic | [[Life Boost]] | [[Spirit Link]] |
| Protection | Basic | [[Blood Ward]] | [[Mage Armor]] |
| Vengeance | Basic | [[Needle of Vengeance]] | [[Phantom Pain]] |
| Mischief | Greater | [[Deceiver's Cloak]] | [[Mad Monkeys]] |
| Shadow | Greater | [[Malicious Shadow]] | [[Chilling Darkness]] |
| Snow | Greater | [[Personal Blizzard]] | [[Wall of Wind]] |
| Death | Major | [[Curse of Death]] | [[Raise Dead]] |
| Renewal | Major | [[Restorative Moment]] | [[Field of Life]] |
!! Class Features
| !Level | !Features |
| 1 | Patron, Familiar, Hexes, 5 cantrips, 2 1st-level slots |
| 2 | +1 1st-level slot |
| 3 | 2 2nd-level slots |
| 4 | +1 2nd-level slot |
| 5 | 2 3rd-level slots, [[Magical Fortitude]] |
| 6 | +1 3rd-level slot, Familiar ability |
| 7 | 2 4th-level slots, [[Expert Spellcaster]] |
| 8 | +1 4th-level slot |
| 9 | 2 5th-level slots, [[Lightning Reflexes]] |
| 10 | +1 5th level slot |
| 11 | 2 6th-level slots, [[Alertness]], [[Weapon Expertise]] |
| 12 | +1 6th-level slots |
| 13 | 2 7th-level slots, [[Defensive Robes]], [[Weapon Specialization]] |
| 14 | +1 7th-level slot |
| 15 | 2 8th-level slots, [[Master Spellcaster]] |
| 16 | +1 8th-level slot |
| 17 | 2 9th-level slots, [[Resolve]] |
| 18 | +1 9th-level slot |
| 19 | [[Legendary Spellcaster]], [[Patron's Gift]] |
| 20 | |
!! Class Feats
{{||ClassFeatList}}
{{LOCGFeat}}
You gain a +1 circumstance bonus to saving throws against <<tag Curse>>s, and to saving throws against spells cast by a witch or hag.
If you roll a success on a saving throw against a curse or a spell cast by a witch or hag, you get a critical success instead.
You spend 10 minutes and 1 Focus Point brewing a special potion containing the power of one of your hexes that targets a creature. A creature that consumes this potion is targeted by the hex.
If the hex has a sustained duration and you have [[Cackle]], you can cast cackle into the bottle just before you seal it. If you do, the hex’s duration is extended as if you had cast cackle the round after the hex was cast (typically this extends the duration by 1 round). Your cackling laugh sounds out when the potion is unsealed.
Any potion you create this way loses its power the next time you make your daily preparations.
While the potion is in your possession, you can render it inert using a single action that has the <<tag Concentrate>> trait. You can’t regain the Focus Point you spent to create the potion (or the Focus Point you spent to cast cackle) until the potion is consumed or loses its magic.
You forge a magical link with another creature, granting you awareness of that creature’s condition and creating a conduit for spellcasting.
During your daily preparations, you can designate one willing creature as your charge. You are always aware of your charge’s direction from you, its distance from you, and any conditions affecting it.
In addition, you can cast spells with a range of touch on your charge from a range of 30 feet.
These effects persist until your next daily preparations.
''Special'' This feat has the trait corresponding to the tradition of spells you cast (arcane, divine, occult, or primal).
You can keep watch over multiple charges.
Each day during your preparations, you can designate a number of charges equal to your [[Intelligence]] modifier instead of just one.
Your home is an animated structure that obeys your commands.
By performing a rite that takes 1 day, you create an animated object from a hut, small house, covered wagon, tent, or similar construction of up to Huge size.
The hut uses your AC, saving throw modifiers, and Perception modifier and has 150 HP and Hardness 10.
It has the [[Construct Armor]] ability, meaning once it’s reduced to less than half its Hit Points, or immediately upon being damaged by a critical hit, its AC is reduced by 4 until it is repaired.
The hut can’t attack or attempt skill checks.
You can give the hut a command as a single action, which has the <<tag Auditory>> and <<tag Concentrate>> traits; after 1 round of reconfiguring itself, the hut then follows that command until you give it a different command.
* ''Guard'' The hut watches for trespassers within 120 feet using your [[Perception]] modifier and screams if it spots any.
* ''Lock'' Each entrance to the hut is sealed with a [[Lock]] spell.
* ''Move'' The hut gains a Speed of 60 feet, growing giant bird or bone legs, if necessary, and follows an extremely basic movement command you give it, such as “follow me” or “move that direction.” While perfectly suitable for overland travel, the hut’s broad movements and 1-round delay on response time are too imprecise to predictably direct in a combat encounter or other situation where seconds and precise locations count.
* ''Hide'' The hut appears to be a normal, mundane object of its type. This is a 10th-level <<tag Illusion>> effect.
You can have only one hut at a time. If you animate a new hut, your previous hut immediately reverts to its original, mundane form.
If you die, the hut continues following the last order you gave it indefinitely.
{{||SpellSummaryTable}}
Your touch rots organic material and decays objects.
Make a melee spell attack roll.
Your touch deals 1d12 <<tag Negative>> damage plus 1d4 [[persistent|Persistent Damage]] negative damage.
If a creature uses an item to block withering grasp, such as with the [[Shield Block]] reaction, the item is automatically affected, but the creature does not take damage (even if there is damage left over after the shield’s Hardness).
Unlike normal negative damage, the negative damage from withering grasp damages objects, constructs, and the like by eroding them away. If you target an object, lower its Hardness by 2 for 1 minute.
//If the spell attack is a critical success,// your touch deals double damage (both initial and persistent). If you target an object, lower its Hardness by 4 for 1 minute.
''Heightened (+1)'' The damage increases by 1d12 and the persistent damage increases by 1. If you target an object, lower its Hardness by an additional 1 point on both a success and a critical success.
!! Splats
<$list filter="[tag<currentTiddler>tag[Splat]]" />
!! Specialization
If you specialize in an arcane school, rather than studying each school equally (as universalists do), you gain an extra spell slot for each level of spell you can cast. You can prepare only spells of your chosen arcane school in these extra slots.
In addition, you can prepare an extra cantrip of your chosen school.
You also add another arcane spell of your chosen school to your spellbook.
You learn a school spell, a special type of spell taught to students of your arcane school. School spells are a type of [[Focus Spell]].
| !Specialized School | !School Spell |
| Abjuration | [[Protective Ward]] |
| Conjuration | [[Augment Summoning]] |
| Divination | [[Diviner's Sight]] |
| Enchantment | [[Charming Words]] |
| Evocation | [[Force Bolt]] |
| Illusion | [[Warped Terrain]] |
| Necromancy | [[Call of the Grave]] |
| Transmutation | [[Physical Boost]] |
Instead of specializing narrowly in an arcane school, you can become a universalist wizard—by studying all the schools equally, you devote yourself to understanding the full breadth of the arcane arts.
For each level of spell you can cast, you can use [[Drain Bonded Item]] once per day to recall a spell of that level (instead of using it only once per day in total).
You gain an extra wizard class feat, and you add one 1st-level spell of your choice to your spellbook.
!! Class Features
| !Level | !Features |
| 1 | [[Drain Bonded Item]], __''no advancement feat''__, 2 1st-level slots |
| 2 | +1 1st-level slot |
| 3 | 2 2nd-level slots |
| 4 | +1 2nd-level slot |
| 5 | [[Lightning Reflexes]], 2 3rd-level slots |
| 6 | +1 3rd-level slot |
| 7 | [[Expert Spellcaster]], 2 4th-level slots |
| 8 | +1 4rd-level slot |
| 9 | [[Magical Fortitude]], 2 5th-level slots |
| 10 | +1 5th-level slot |
| 11 | [[Alertness]], [[Wizard Weapon Expertise]], 2 6th-level slots |
| 12 | +1 6th-level slot |
| 13 | [[Defensive Robes]], [[Weapon Specialization]], 2 7th-level slots |
| 14 | +1 7th-level slot |
| 15 | [[Master Spellcaster]], 2 8th-level slots |
| 16 | +1 8th level slot |
| 17 | [[Resolve]], 2 9th-level slots |
| 18 | +1 9th-level slot |
| 19 | [[Archwizard's Spellcraft]], [[Legendary Spellcaster]] |
| 20 | |
!! Class Feats
{{||ClassFeatList}}
You cast spells like a wizard, gaining a spellbook with four common arcane cantrips of your choice.
You gain the [[Cast a Spell]] activity.
You can prepare two cantrips each day from your spellbook.
You’re trained in arcane spell attack rolls and spell DCs.
Your key spellcasting ability for wizard archetype spells is [[Intelligence]], and they are arcane wizard spells.
You become trained in [[Arcana]]; if you were already trained in Arcana, you instead become trained in a skill of your choice.
<<levelfeatlist "4 6 8 12 18" "[tag[Archetype]field:feat-arch[Wizard]]">>
Through a combination of magic and training, you’ve learned how to wield wizard weapons more effectively.
You gain expert proficiency in the club, crossbow, dagger, heavy crossbow, and staff.
''Size'' Small
''Melee'' {{OneAction}} jaws [[Finesse]], damage 1d8 piercing
''Str'' +2, ''Dex'' +3, ''Con'' +2, ''Int'' –4, ''Wis'' +1, ''Cha'' +0
''Hit Points'' 6
''Skill'' [[Survival]]
''Senses'' [[Low-Light Vision]], [[Scent]] (Imprecise, 30 feet)
''Speed'' 40 feet
''Support Benefit'' Your wolf tears tendons with each opening. Until the start of your next turn, your Strikes that damage creatures your wolf threatens give the target a –5-foot status penalty to its Speeds for 1 minute (–10 on a critical success).
''Advanced Maneuver'' [[Knockdown (Wolf)]]
''Requirements'' You are in [[Wolf Stance]].
You rip your enemy off their feet.
Make a wolf jaw [[Strike]].
Your wolf jaw gains the [[Fatal]] d12 trait for this Strike, and if the attack succeeds, you knock the target [[Prone]].
Affix to armor.
''Requirements'' You are trained in [[Athletics]].
''Trigger'' You successfully [[Trip]] a foe.
This wolf canine is bound in a strip of leather and tied to a buckle or strap of a suit of armor.
When you activate the fang, you deal bludgeoning damage equal to your [[Strength]] modifier to the target of your [[Trip]].
If your Trip would already deal physical damage that doesn’t include an ability modifier, add your Strength modifier to that damage.
''Requirements'' You are unarmored.
You enter the stance of a wolf, low to the ground with your hands held like fanged teeth.
You can make wolf jaw unarmed attacks. These deal 1d8 piercing damage; are in the brawling group; and have the [[Agile]], [[Backstabber]], [[Finesse]], [[Nonlethal]], and [[Unarmed]] traits.
If you’re [[Flanking]] a target while in Wolf Stance, your wolf jaw unarmed attacks also gain the [[Trip]] trait.
Wolfsbane appears in folklore for its link to werecreatures.
If you are afflicted with [[Lycanthropy]] and survive stage 3 of wolfsbane, you’re immediately cured of the lycanthropy.
| !Saving Throw |DC 30 [[Fortitude]] |
| !Onset |10 minutes |
| !Maximum Duration |6 minutes |
| !Stage 1 |12d6 poison damage (1 minute) |
| !Stage 2 |16d6 poison damage (1 minute) |
| !Stage 3 |20d6 poison damage (1 minute) |
Each one of these statuettes is 1 inch in height, carved from a specific material and taking the shape of a particular animal or animals.
''Activate'' {{TwoAction}} command, [[Interact]]; ''Effect'' You activate the statue by placing it on solid ground and then speaking its name, causing the statuette to transform into a living creature or creatures.
In creature form, the figurine has the <<tag Minion>> trait.
It can understand your language and it obeys you to the best of its ability when you use an action to [[Command]] it.
The specifics of each creature, as well as the activation’s frequency (if any), appear in its entry below.
If the figurine is slain while in animal form, it reverts to its statue shape and cannot be activated again until 1 week has passed.
If the figurine is destroyed in statue form, it is shattered and its magic is lost.
| !Type | !Level | !Price | !Animals | !Maximum Duration | !Frequency | !Special |
| Onyx Dog | 2 | 340 | Guard Dog | 6 hours | 1/week |The dog has +4 circumstance to [[Survival]] checks to [[Track]], has [[Darkvision]], and when it senses a [[Hidden]] creature with its [[Scent]] the creature is observed and [[Concealed]]. |
| Jade Serpent | 7 | 3400 | Giant Viper | 10 minutes | 1/day | |
| Golden Lions | 10 | 9000 | 2 Adult Lions | 1 hour | 1/day |If 1 lion is slain, it cannot be summoned again until 1 week has passed, but this doesn't prevent you from summoning the other. |
| Marble Elephant | 13 | 27000 | Elephant | 24 hours | 4/month |If the elephant attacks or engages in combat, it reverts to statuette form after 1d4 rounds. |
| Obsidian Steed | 15 | 60000 | Nightmare | 24 hours | 1/week |<<tag Uncommon>>. Will not use [[Plane Shift]] or other abilities on behalf of its rider. If a good creature mounts it, the rider must attempt a DC 3 flat check; on a failure, the Nightmare uses [[Plane Shift]] to take the rider to a random location in the Abyss and immediately returns to statue form. |
You have a innate familiarity with forested areas.
When in a forest or jungle environment, if you roll a critical failure on a [[Survival]] skill check to [[Sense Direction]], [[Subsist]], or [[Cover Tracks]], you get a failure instead, and if you roll a success, you get a critical success instead.
//You do not normally attempt a Survival check to Cover Tracks. This may be an error.//
When [[Climb]]ing trees, vines, and other foliage, you move at half your Speed on a success and at full Speed on a critical success (and you move at full Speed on a success if you have [[Quick Climb]]). This doesn’t affect you if you’re using a climb Speed.
You can always use the [[Take Cover]] action when you are within forest terrain to gain cover, even if you’re not next to an obstacle you can Take Cover behind.
You can always find a path, almost as if foliage parted before you.
You ignore any [[Difficult Terrain]] caused by plants, such as bushes, vines, and undergrowth. Even plants manipulated by magic don’t impede your progress.
You can always use the [[Take Cover]] action when in forest or jungle terrain to gain cover, even if you’re not next to an obstacle you would normally be able to Take Cover behind. You gain the [[Terrain Stalker]] feat, even if you’re not trained in [[Stealth]], and you must choose underbrush as your chosen terrain.
{{||SpellSummaryTable}}
You utter a liberating word of power that frees a creature. //They do not have to be able to hear or understand you.//
You suppress one of the following conditions of your choice: [[Confused]], [[Frightened]], [[Grabbed]], or [[Paralyzed]].
The target isn’t affected by the chosen condition, and if you suppress the [[Grabbed]] condition, the target automatically breaks free from any grab affecting it when you Cast the Spell.
If you don’t remove the effect that provided the condition, the condition returns after the spell ends. For example, if a spell was making the target confused for 1 minute, word of freedom would let the target act normally for a round, but the confused condition would return afterward.
{{||SaveSuccessTable}}
{{||ActionSuccessTable}}
{{||RitualSummaryTable}}
//Secondary casters can't use the same skill as the primary caster.//
//The ritual check is made in <<tag Secret>>.//
''Cost'' rare oils and powdered minerals worth 5,000 gp;
You bind yourself and your allies to the specific safe location where you perform the ritual. This allows the participants to return later by simply speaking a word.
''Heightened (+1)'' The cost increases by 5,000 gp, the ritual can target one more creature, and the maximum level of creature it can target increases by 2.
{{||ActionSuccessTable}}
{{||SpellSummaryTable}}
You speak a statement you believe to be true and that is free of any attempt to deceive through twisting words, omission, and so on.
The statement must be 25 words or fewer.
A symbol of your deity glows above your head, and anyone who sees you and hears your statement knows that you believe it to be true.
Each time you [[Sustain this Spell|Sustain a Spell]], you can repeat this effect.
You have a particular affinity for leafy plants.
Your patron grants you a leshy familiar. If you already had a familiar, this leshy replaces your previous familiar, as if your previous familiar had been slain.
In addition, you gain the ability to see through leaves, vines, and other foliage. You don’t take circumstance penalties to ranged spell attacks or [[Perception]] checks caused by foliage, and your targeted attacks don’t require a flat check to succeed against a target [[Concealed]] only by such vegetation.
You have been seriously injured.
If you lose the [[Dying]] condition and do not already have the wounded condition, you become wounded 1.
If you already have the wounded condition when you lose the dying condition, your wounded condition value increases by 1.
//You don't gain or increase the Wounded condition if you lost the Dying condition by spending [[Hero Point]]s.//
If you gain the dying condition while wounded, increase your dying condition value by your wounded value.
The wounded condition ends if someone successfully restores Hit Points to you with [[Treat Wounds]], or if you are restored to full Hit Points and rest for 10 minutes.
//A creature with [[Ferocity]] becomes Wounded when it uses Ferocity to avoid being knocked out.//
''Trigger'' You take damage and are capable of entering a rage.
You roar in pain, awakening the rage within you. You [[Rage]].
''Usage'' etched onto a piercing or slashing melee weapon.
Weapons with wounding runes are said to thirst for blood.
When you hit a creature with a wounding weapon, you deal an extra 1d6 [[persistent bleed damage|Persistent Damage]].
On a critical hit, it instead deals 1d12 persistent bleed damage.
Your companion smashes things.
Its unarmed attacks ignore half an object’s Hardness.
Its [[Athletics]] proficiency increases to master, and its [[Strength]] modifier increases by 1.
Your aura protects against destructive energies and dragons’ breath.
You and all allies within 15 feet gain resistance equal to your [[Charisma]] modifier to <<tag Acid>>, <<tag Cold>>, <<tag Electricity>>, <<tag Fire>>, and <<tag Poison>>.
If the source of one of these types of damage is a dragon’s breath, increase the resistance to half your level.
Your draconic wings have grown large and strong enough for flight.
You gain a fly Speed equal to your Speed, using your wings to stay aloft.
Properly harvested and preserved, the poison from a wyvern’s sting is effective and direct.
| !Saving Throw |DC 26 [[Fortitude]] |
| !Onset |Immediate |
| !Maximum Duration |6 rounds |
| !Stage 1 |5d6 poison damage (1 round) |
| !Stage 2 |6d6 poison damage (1 round) |
| !Stage 3 |8d6 poison damage (1 round) |
''Frequency'' once per day
You have been granted a sliver of the power of the yamaraj, the magistrates of the dead who agreed to allow duskwalkers to exist at all.
You exhale a blast of icy wind and ravenous insects.
This is a 30-foot cone that deals 14d6 slashing damage and 4d6 persistent slashing damage (basic [[Reflex]] save using your class DC or spell DC, whichever is higher). On a critical failure, targets also become [[Sickened]] 2.
{{||SpellSummaryTable}}
You manipulate the target’s emotions, potentially allowing you to control it for a brief instant.
The target must attempt a [[Will]] save.
{{||SaveSuccessTable}}
''Heightened (7th)'' On a failure, the target is [[Controlled]] for 1 round. On a critical failure, the target is controlled for up to 1 minute; it receives a new [[Will]] save at the end of each of its turns, and on a success, the spell ends.
''Trigger'' You reduce an enemy to 0 hit points.
After downing a foe, you menacingly remind another foe that you’re coming after them next.
Attempt an [[Intimidation]] check with a +2 circumstance bonus to [[Demoralize]] a single creature that you can see and that can see you.
If you have legendary proficiency in Intimidation, you can use this as a free action with the same trigger.
{{||SpellSummaryTable}}
You stoke the righteous anger within yourself and an ally.
You and the target ally each roll a d20 and use the higher result for both your [[Initiative]] rolls.
You each still use your own [[Perception]] modifier or other statistic to determine your results.
{{||SpellSummaryTable}}
You bypass your targets’ rational minds, instilling them with unshakable conviction and zeal.
The targets each gain 12 temporary Hit Points and a +2 status bonus to Will saves against mental effects, as their faith overrides the signals from their own bodies and minds.
If you tell a target to do something, it must comply with your request, though if it would normally find the task repugnant, it can attempt a [[Will]] save at the end of its turn each round due to the cognitive dissonance. On a success, it ends the spell’s effects on itself entirely.
''Heightened (9th)'' The temporary Hit Points increase to 18, and the status bonus to Will saves increases to +3.
{{||SpellSummaryTable}}
You call a tiny star to orbit a creature in a sparkling halo before shooting up into the heavens, where it marks the creature’s rough location.
The target must attempt a [[Fortitude]] save.
''Heightened (+1)'' The duration increases by 1 day.
''Heightened (4th)'' You ignore the [[Concealed]] condition against targets marked by zenith star.
{{||SaveSuccessTable}}
{{||SpellSummaryTable}}
You designate an area in which creatures are compelled to speak only truth. Creatures within or entering the area have difficulty lying.
Each potentially affected creature must attempt a [[Will]] save when the spell is cast or when the creature first enters the area. It uses the results of this initial save if it leaves and reenters the area.
Affected creatures are aware of this enchantment; therefore, they can avoid answering questions to which they would normally respond with a lie, or they can be evasive as long as they remain within the boundaries of the truth.
{{||SaveSuccessTable}}